Flex
MacOSX :: FlexBuilder + symbolic links = badness
by Colin on Aug.30, 2008, under Flex, RIA
At work I use the FlexBuilder as an eclipse plugin. I’m a fan of eclipse so far, it has served me well in the past for Java development.
I tried using symbolic links (ln –s, also called symlinks or soft-links) to manage switching between branches, etc. Flex Builder didn’t like that.
I didn’t have any source attachment, I had to do a clean to actually rebuild the application, and other badness (Eclipse resource exceptions).
for example:
machine-name% ln -s project-trunk project
machine-name% ls -lha
...
lrwxr-xr-x 1 username DOMAIN\users 12B Jul 15 15:35 project -> project-trunk
drwxr-xr-x 2 username DOMAIN\users 68B Jul 15 15:35 project-1.2.3
drwxr-xr-x 2 username DOMAIN\users 68B Jul 15 15:35 project-trunk
What did I learn? Don’t use symbolic links with Flex Builder 3.0.
Hope It saves someone some pain. I’d guess something in the middle(OS Layer? Eclipse?) is actually walking the symlink inconsistently. No resolution to this issue yet. Is this the responsibility of the OS? Eclipse, Multi-platform code? Let me know if you see a fix for this.
While I’m at it — I also ran into this one http://bugs.adobe.com/jira/browse/FBE-186
Flex Builder 3.0 Debugging issue – Unable to debug
by Colin on Aug.19, 2008, under Flex, RIA
I recently ran into an issue where Flex Builder 3.0 wouldn’t let me debug and caused my whole System (OSX) to grind to a halt. It took me a while to get to the bottom of it, but I found the issue and addressed it.
Basically Eclipse had this error –over and over and over and ove…100+MB worth
in the system.log
Aug 17 15:21:31 machine-name [0x0-0xc30c3].org.eclipse.eclipse[8730]: !ENTRY com.adobe.flexbuilder.debug 4 2 2008-08-07 15:21:31.716
Aug 17 15:21:31 machine-name [0x0-0xc30c3].org.eclipse.eclipse[8730]: !MESSAGE Problems occurred when invoking code from plug-in: "com.adobe.flexbuilder.debug".
Aug 17 15:21:31 machine-name [0x0-0xc30c3].org.eclipse.eclipse[8730]: !STACK 0
Aug 17 15:21:31 machine-name [0x0-0xc30c3].org.eclipse.eclipse[8730]: java.lang.NullPointerException
Aug 17 15:21:31 machine-name [0x0-0xc30c3].org.eclipse.eclipse[8730]: at com.adobe.flexbuilder.debug.breakpoints.FlexLineBreakpoint.findSourceFiles(FlexLineBreakpoint.java:388)
Aug 17 15:21:31 machine-name [0x0-0xc30c3].org.eclipse.eclipse[8730]: at com.adobe.flexbuilder.debug.breakpoints.FlexLineBreakpoint.instantiate(FlexLineBreakpoint.java:442)
Aug 17 15:21:31 machine-name [0x0-0xc30c3].org.eclipse.eclipse[8730]: at com.adobe.flexbuilder.debug.model.FlexDebugTarget.breakpointAdded(FlexDebugTarget.java:889)
Aug 17 15:21:31 machine-name [0x0-0xc30c3].org.eclipse.eclipse[8730]: at com.adobe.flexbuilder.debug.model.FlexDebugTarget$FdbThread.installDeferredBreakpoints(FlexDebugTarget.java:539)
Aug 17 15:21:31 machine-name [0x0-0xc30c3].org.eclipse.eclipse[8730]: at com.adobe.flexbuilder.debug.model.FlexDebugTarget$FdbThread.advanceStateMachine(FlexDebugTarget.java:570)
Aug 17 15:21:31 machine-name [0x0-0xc30c3].org.eclipse.eclipse[8730]: at com.adobe.flexbuilder.debug.model.FlexDebugTarget$FdbThread.access$6(FlexDebugTarget.java:544)
Aug 17 15:21:31 machine-name [0x0-0xc30c3].org.eclipse.eclipse[8730]: at com.adobe.flexbuilder.debug.model.FlexDebugTarget$1.run(FlexDebugTarget.java:646)
Aug 17 15:21:31 machine-name [0x0-0xc30c3].org.eclipse.eclipse[8730]: at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:37)
Aug 17 15:21:31 machine-name [0x0-0xc30c3].org.eclipse.eclipse[8730]: at org.eclipse.core.runtime.Platform.run(Platform.java:857)
Aug 17 15:21:31 machine-name [0x0-0xc30c3].org.eclipse.eclipse[8730]: at com.adobe.flexbuilder.debug.model.FlexDebugTarget$FdbThread.eventLoop(FlexDebugTarget.java:626)
Aug 17 15:21:31 machine-name [0x0-0xc30c3].org.eclipse.eclipse[8730]: at com.adobe.flexbuilder.debug.model.FlexDebugTarget$FdbThread.run(FlexDebugTarget.java:687)
Aug 17 15:21:31 machine-name [0x0-0xc30c3].org.eclipse.eclipse[8730]: at java.lang.Thread.run(Thread.java:613)
A little googling turned up this article where the guy points to a setting in the mm.cfg. Issue resolved? Not so fast. My issue had similar symptoms but was not identical. After some trial and error I figured out that I had been building the SWFs in two different fasions: via ant and with Flex Builder. So it turns out that Flex Builder was finding the SWFs built by my build files and going into a recurring NPE fit. Flex Builder basically inundated the system.log to the point of no return. I could have waited for 2 days, but I chose to manually rotate the log myself (which took some googling to turn up the right solution).
Hopefully Flex Builder 3.0 has fixed this.
Symptoms:
Flex Builder hangs when setting a breakpoint (can’t debug – Eclipse and the system goes ‘out-to-lunch’)
Solution:
- Remove the duplicate swf’s or profiling versions
- Your machine still out to lunch? (syslogd) Then you will have to manually rotate your system log, since its too much for syslogd to handle.
sudo launchctl stop com.apple.syslogd && sudo mv /private/var/log/system.log ~/system.log.NPEFilled && sudo launchctl start com.apple.syslogd
(Stop syslogd, move the system.log file, start syslogd)
- Happy Debugging!
Reasoning:
Flex Builder goes into a flurry of recurring java.lang.
Flex doesn’t have a String#replaceAll()?
by Colin on Jul.15, 2008, under Flex, RIA
What?!? I was shocked to learn that the latest Flex framework / Actionscript doesn’t have an equivalent for a replaceAll() on String. I’m looking for a simple way to do replacements on a string. Most of the languages that I’ve worked with have such a method or a library to provide that functionality. PHP has the str_replace function, Java has a replaceAll() on java.lang.String, Python has it, C++ has libraries that readily provide this functionality, the System.String in the .NET framework(1.0,1.1,2.0, etc.) has a string#replace method, even in the RIA space, Silverlight has a replace method on System.String, as does JavaFX (java.lang.String).
After searching and reading for a while, the closest equivalent that I could find is a custom method that utilizes the split and join functionality like the following:
public static function StringReplaceAll( source:String, find:String, replacement:String ) : String
{
return source.split( find ).join( replacement );
}
The preceding function came from Base64.as from Jason Nussbaum’s blog post about Base64 encoding/decoding. Others have used similar functionality like this post on flexfanatic. Its definitely better than while loop.
I also found that it is possible to utilize a RegExp within the String#replace function as shown on SCRIBBLE IT. Basically the code would look like:
var str:string = "Somesilly String. silly!";
str.replace(new RegEx("silly", "g") " awesome");
With this pattern it can still be a one-liner, which should preform better than the split/join methodology, but I am still shocked that such a standard method isn’t in the framework. I am a bit surprised by this finding. is there a better way? A good StringUtil Library or something similar?