<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5313918938572480298</id><updated>2012-02-17T00:11:16.451+01:00</updated><category term='literature'/><category term='ant'/><category term='programming-languages'/><category term='frameworks'/><category term='howto'/><category term='flex-internals'/><category term='github'/><category term='testing'/><category term='design-patterns'/><category term='socializing'/><category term='teams'/><category term='best-practices'/><category term='functional-programming'/><category term='less-than-ideal'/><title type='text'>helpqlodhelp</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://helpqlodhelp.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://helpqlodhelp.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Ralf Bokelberg (rbokel)</name><uri>http://www.blogger.com/profile/04017353300938290017</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_AwT6QbE1L6Q/SwF4vBUo21I/AAAAAAAAAAM/yfztkzYHn3M/S220/s1393119755_30134428_2237021.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>34</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5313918938572480298.post-6022939153143445600</id><published>2011-06-02T23:23:00.002+02:00</published><updated>2011-06-02T23:25:29.803+02:00</updated><title type='text'>Why semicolons?</title><content type='html'>It seems that most of my ActionScript code can easily go without semicolons so i leave them out. What do you think about it?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5313918938572480298-6022939153143445600?l=helpqlodhelp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://helpqlodhelp.blogspot.com/feeds/6022939153143445600/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://helpqlodhelp.blogspot.com/2011/06/why-semicolons.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/6022939153143445600'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/6022939153143445600'/><link rel='alternate' type='text/html' href='http://helpqlodhelp.blogspot.com/2011/06/why-semicolons.html' title='Why semicolons?'/><author><name>Ralf Bokelberg (rbokel)</name><uri>http://www.blogger.com/profile/04017353300938290017</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_AwT6QbE1L6Q/SwF4vBUo21I/AAAAAAAAAAM/yfztkzYHn3M/S220/s1393119755_30134428_2237021.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5313918938572480298.post-831676074653789624</id><published>2011-06-02T23:17:00.003+02:00</published><updated>2011-06-02T23:23:23.386+02:00</updated><title type='text'>The art of possible</title><content type='html'>Something that all over sudden appeared in my mind. I'm not sure what to make of it. Maybe i'm jut getting crazy ;) &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;private function log(message:String):Function&lt;br /&gt;{&lt;br /&gt;     trace(message)&lt;br /&gt;     return arguments.callee&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private function main() : void &lt;br /&gt;{&lt;br /&gt;     log("this")("is")("a")("interesting")("way")("to")("call")("a")("function.")&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Best,&lt;br /&gt;Ralf.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5313918938572480298-831676074653789624?l=helpqlodhelp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://helpqlodhelp.blogspot.com/feeds/831676074653789624/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://helpqlodhelp.blogspot.com/2011/06/art-of-possible.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/831676074653789624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/831676074653789624'/><link rel='alternate' type='text/html' href='http://helpqlodhelp.blogspot.com/2011/06/art-of-possible.html' title='The art of possible'/><author><name>Ralf Bokelberg (rbokel)</name><uri>http://www.blogger.com/profile/04017353300938290017</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_AwT6QbE1L6Q/SwF4vBUo21I/AAAAAAAAAAM/yfztkzYHn3M/S220/s1393119755_30134428_2237021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5313918938572480298.post-8254127618286383790</id><published>2011-02-01T12:44:00.004+01:00</published><updated>2011-02-01T12:48:59.724+01:00</updated><title type='text'>My new repository for snippets</title><content type='html'>I created a repo for all the little snippets, which i collect over time. You can find it here: &lt;a href="https://github.com/rbokel/Snippets"&gt;https://github.com/rbokel/Snippets&lt;/a&gt;. If you want to get informed, when something changes in the repo, you should &lt;a href="https://github.com/rbokel/Snippets/toggle_watch"&gt;"watch"&lt;/a&gt; it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5313918938572480298-8254127618286383790?l=helpqlodhelp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://helpqlodhelp.blogspot.com/feeds/8254127618286383790/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://helpqlodhelp.blogspot.com/2011/02/my-new-repository-for-snippets.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/8254127618286383790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/8254127618286383790'/><link rel='alternate' type='text/html' href='http://helpqlodhelp.blogspot.com/2011/02/my-new-repository-for-snippets.html' title='My new repository for snippets'/><author><name>Ralf Bokelberg (rbokel)</name><uri>http://www.blogger.com/profile/04017353300938290017</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_AwT6QbE1L6Q/SwF4vBUo21I/AAAAAAAAAAM/yfztkzYHn3M/S220/s1393119755_30134428_2237021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5313918938572480298.post-7764100268883170881</id><published>2011-01-26T14:04:00.005+01:00</published><updated>2011-01-27T09:15:09.671+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='best-practices'/><category scheme='http://www.blogger.com/atom/ns#' term='github'/><category scheme='http://www.blogger.com/atom/ns#' term='ant'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>Using FlexUnit with locales other than the ones provided by FlashBuilder 4</title><content type='html'>Today i took some time to find out, why the integrated FlexUnit support doesn't work, if your project has a locale other than the ones provided by FlashBuilder.&lt;br /&gt;&lt;br /&gt;One of my last Flex projects was for the danish web market. Therefore it used the danish locale. Of course we wrote a lot of unit tests to verify our code. Unfortunately the integrated support for FlexUnit didn't work with the danish locale. It always gave me a error like "Unable to find resources for FlexUnitTestRunner". &lt;br /&gt;&lt;br /&gt;One way to work around it, was to create a test project, which referenced the test folder of the main project but used en_US as the locale. Not ideal, but it worked without much hassle. &lt;br /&gt;&lt;br /&gt;However, i wasn't satisfied with creating test projects for all my Flex projects. After digging a bit into the FlashBuilder plugin directory i found out, that there are two directories for the resources of FlexUnit. One contains the resources for en_US and the other directory contains the resources for the rest of us ;) &lt;br /&gt;&lt;br /&gt;My first try was to simply copy the files from en_US to a new directory da_DK. However, the error didn't go away. By looking into the swc library files i found out, that internally they still had a package path en_US instead of the da_DK that i needed. &lt;br /&gt;&lt;br /&gt;Next try was to see, if copylocale.exe supports source and target directories, which it doesn't unfortunately. Hm, at least this gave me the idea, that i need something like copylocale, but with configurable paths. &lt;br /&gt;&lt;br /&gt;So the third try was to recreate copylocale.exe using ant. The ant script copies the en_US resources to the new da_DK folder. It unpacks the swc library files to a temporary folder. This gives me the original source files for the en_US locale. Next it renames the en_US package to da_DK. And last but not least it compiles the new swc from these source. That works like a charm now. I'm able to use the integrated FlexUnit with a danish locale finally :) &lt;br /&gt;&lt;br /&gt;Like copylocale, the actual strings are still in english of course. If you want danish strings, you can do so by manually translating the content of FlexUnitTestRunner.properties and recompile the swc with the translated file. &lt;br /&gt;&lt;br /&gt;&lt;a href="https://github.com/rbokel/Snippets/blob/master/ant/AddLocale.xml"&gt;Here&lt;/a&gt; you can find the ant script. &lt;br /&gt;&lt;br /&gt;Happy testing, &lt;br /&gt;Ralf.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5313918938572480298-7764100268883170881?l=helpqlodhelp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://helpqlodhelp.blogspot.com/feeds/7764100268883170881/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://helpqlodhelp.blogspot.com/2011/01/using-flexunit-with-locales-other-than.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/7764100268883170881'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/7764100268883170881'/><link rel='alternate' type='text/html' href='http://helpqlodhelp.blogspot.com/2011/01/using-flexunit-with-locales-other-than.html' title='Using FlexUnit with locales other than the ones provided by FlashBuilder 4'/><author><name>Ralf Bokelberg (rbokel)</name><uri>http://www.blogger.com/profile/04017353300938290017</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_AwT6QbE1L6Q/SwF4vBUo21I/AAAAAAAAAAM/yfztkzYHn3M/S220/s1393119755_30134428_2237021.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5313918938572480298.post-2940071351502593340</id><published>2010-05-11T21:59:00.005+02:00</published><updated>2010-05-11T22:15:22.512+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design-patterns'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='best-practices'/><category scheme='http://www.blogger.com/atom/ns#' term='literature'/><title type='text'>Fluent Sort builder example in ActionScript</title><content type='html'>After reading &lt;a href="http://www.amazon.com/Growing-Object-Oriented-Software-Guided-Signature/dp/0321503627"&gt;Growing Software&lt;/a&gt; i created a factory to create sort objects in ActionScript. It allows you to create sorts like this &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;var s : Sort = new SortBuilder().byField("status").asString().ascending().byField("date").asDate() .descending().build();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I think, it makes the creation of sorts much more readable. However, now i have to refactor the whole codebase and to educate my coworkers to use it. That's the worst part of it ;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PS. Xavi published a &lt;a href="http://www.rialvalue.com/blog/2010/03/30/some-thoughts-on-method-parameters/"&gt;nice introduction to fluent factories&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5313918938572480298-2940071351502593340?l=helpqlodhelp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://helpqlodhelp.blogspot.com/feeds/2940071351502593340/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://helpqlodhelp.blogspot.com/2010/05/fluent-sort-builder-example-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/2940071351502593340'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/2940071351502593340'/><link rel='alternate' type='text/html' href='http://helpqlodhelp.blogspot.com/2010/05/fluent-sort-builder-example-in.html' title='Fluent Sort builder example in ActionScript'/><author><name>Ralf Bokelberg (rbokel)</name><uri>http://www.blogger.com/profile/04017353300938290017</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_AwT6QbE1L6Q/SwF4vBUo21I/AAAAAAAAAAM/yfztkzYHn3M/S220/s1393119755_30134428_2237021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5313918938572480298.post-2452638453808456565</id><published>2010-04-01T08:35:00.004+02:00</published><updated>2010-04-01T09:29:27.762+02:00</updated><title type='text'>Memory leaks? Yes indeed!</title><content type='html'>Phase I: Memory leak? No way! &lt;br /&gt;I wasn't convinced when the testers said our Flex app has leaks. I thought it has to do with their machine's configuration or browser or whatever. Even when people came and said, they can see the app leaking in the Flex profiler i wasn't convinced, because i thought the profiler would be lying. In the past i rarely saw our apps leaking so i really thought it is false alarm. Also the randomness of the garbage collector helped to keep me in this mood of false safety. &lt;br /&gt;&lt;br /&gt;Phase II: Memory leak? Indeed! &lt;br /&gt;Since the potential bug had a huge impact on the success of the project and we were in the stabilization phase of the project, i had to find out, if it was real. &lt;br /&gt;So what i did to convince myself, was to isolate a small part of the app and create a test app from it. And boom, the leak was clear to see in the instance counts of the profiler. &lt;br /&gt;&lt;br /&gt;Phase III: Memory leak? The hunt is on. &lt;br /&gt;First you need to find a set of steps, which clearly demonstrates the leak in the profiler. Ideally you automate this, because during your hunt you will execute these steps again and again. &lt;br /&gt;&lt;br /&gt;Then you need to find the leak. Finding out about a memory leak in code, which otherwise looks perfectly good, needs a special mindset. You need to be suspicious about everything really. For me the best way to find it, is to reduce the search space by commenting as much as possible code out, until the leak doesn't show any longer. Then you go backwards by commenting pieces back in, until you see the leak. You can use a approach similar to binary search. You start with commenting in bigger parts until the leak shows, then you split this part and comment out smaller parts until it is gone and so on. Eventually you will find the leak hiding under a place you would never expect it ;)  &lt;br /&gt;&lt;br /&gt;Phase IV: Memory leaks? The candidates. &lt;br /&gt;So now you have a suspicious line of code. To make 100% sure it is causing a leak, you create a small test project now, which demonstrates the leak in isolation. &lt;br /&gt;&lt;br /&gt;Phase V: Memory leaks? The fix. &lt;br /&gt;Now that you know what is causing the leak, you can go through your codebase and fix all the places which contains the suspicious code. If you are lucky, the leak is fixed now. Most of the time there will be no change at all though, because there are other leaks left. So you need to iterate this process and start again with Phase III. &lt;br /&gt;&lt;br /&gt;It is a daunting process. I found it useful to pair with a colleague, so when you find something, your colleague can try to reproduce and confirm your theory. Eventually all the leaks are fixed and your app is ready to shine! Puh. &lt;br /&gt;&lt;br /&gt;So much for the general process. More specifically we found leaks in our usage of BindingUtils. You need to make sure, that unwatch is called. Also some listeners needed to be removed or to be changed to weak listeners. We found that the SetEventHandler tag in a mxml state was leaking. And last but not least the Degrafa library was leaking, which is used for skins. &lt;br /&gt;&lt;br /&gt;Halali (the german death-haloo),&lt;br /&gt;Ralf&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5313918938572480298-2452638453808456565?l=helpqlodhelp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://helpqlodhelp.blogspot.com/feeds/2452638453808456565/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://helpqlodhelp.blogspot.com/2010/04/memory-leaks-yes-indeed.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/2452638453808456565'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/2452638453808456565'/><link rel='alternate' type='text/html' href='http://helpqlodhelp.blogspot.com/2010/04/memory-leaks-yes-indeed.html' title='Memory leaks? Yes indeed!'/><author><name>Ralf Bokelberg (rbokel)</name><uri>http://www.blogger.com/profile/04017353300938290017</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_AwT6QbE1L6Q/SwF4vBUo21I/AAAAAAAAAAM/yfztkzYHn3M/S220/s1393119755_30134428_2237021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5313918938572480298.post-3248872786593040362</id><published>2010-03-17T15:47:00.008+01:00</published><updated>2010-03-17T16:22:19.294+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><category scheme='http://www.blogger.com/atom/ns#' term='functional-programming'/><title type='text'>Testing all permutations of calls to setters via functional programming</title><content type='html'>Today i had this class, which has multiple setters and updates bindable properties  from the values of these setters. When i wrote a unit test for it, i realized, that i don't know in which order the setters are called. So in principle i had to test all the different orders in which the setters can be called. Al different orders of a list, that's &lt;a href="http://en.wikipedia.org/wiki/Permutation"&gt;permutations&lt;/a&gt;. The class had three setters, which makes for 3! = 6 permutations. &lt;br /&gt;&lt;br /&gt;I didn't want to do it manually, so tried to find a way to let the computer do it for me. What i did is to create a function for every call to a setter and a function for the assert. These functions are passed into the assert function like so: &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;[Test]&lt;br /&gt;public function whenSearchFormIsUsedInStoreContext_thenCountryChooserShouldBeSetToCountryOfTheStore():void&lt;br /&gt;{&lt;br /&gt;    storeShortcut.countryCode = country2.code;&lt;br /&gt;&lt;br /&gt;    var setter1:Function = function():void&lt;br /&gt;        {&lt;br /&gt;            pm.countriesList = new ArrayCollection([ country0, country1, country2 ]);&lt;br /&gt;        };&lt;br /&gt;    var setter2:Function = function():void&lt;br /&gt;        {&lt;br /&gt;            pm.currentContext = RecordsModel.IDENTIFY_CONTEXT_STORE;&lt;br /&gt;        };&lt;br /&gt;    var setter3:Function = function():void&lt;br /&gt;        {&lt;br /&gt;            pm.currentStore = storeShortcut;&lt;br /&gt;        }&lt;br /&gt;    var assert:Function = function(permutation:Array):void&lt;br /&gt;        {&lt;br /&gt;            assertThat("country2 should be selected, permutation &lt;" + permutation + "&gt;",&lt;br /&gt;                       pm.selectedCountryIndex,&lt;br /&gt;                       equalTo(2));&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    assertThatAllPermutationsOfSettersHaveTheSameResult(setUp, [ setter1, setter2, setter3 ],&lt;br /&gt;                                                        assert);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now the method can calculate all permutations of the setters array and call the setters accordingly. Works like a charm. &lt;br /&gt;&lt;br /&gt;But beware. Faculty is a fast growing function. 7! is 5040 and 8! is 40320. So this method works for a small number of setters only.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5313918938572480298-3248872786593040362?l=helpqlodhelp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://helpqlodhelp.blogspot.com/feeds/3248872786593040362/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://helpqlodhelp.blogspot.com/2010/03/testing-all-permutations-of-calls-to.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/3248872786593040362'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/3248872786593040362'/><link rel='alternate' type='text/html' href='http://helpqlodhelp.blogspot.com/2010/03/testing-all-permutations-of-calls-to.html' title='Testing all permutations of calls to setters via functional programming'/><author><name>Ralf Bokelberg (rbokel)</name><uri>http://www.blogger.com/profile/04017353300938290017</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_AwT6QbE1L6Q/SwF4vBUo21I/AAAAAAAAAAM/yfztkzYHn3M/S220/s1393119755_30134428_2237021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5313918938572480298.post-805368652713598084</id><published>2010-02-27T15:46:00.004+01:00</published><updated>2010-02-27T16:05:37.969+01:00</updated><title type='text'>Selfdocumenting code vs generic names</title><content type='html'>Some people like their generic names. Every method is named like update() or handleEvent() or init() etc. These names are not very much selfdocumenting. Therefore these methods come with comments very often. The comments explain, what the method does. However, comments are evil, as we all know. &lt;br /&gt;&lt;br /&gt;The ideal method does one thing and has a name, which clearly identifies this thing. A proper name helps the reader to understand what it does, without having to read the code. Or at least it gives him a hint about your intentions. &lt;br /&gt;&lt;br /&gt;Actually that's another good point. Expressing the intention of the method gives the maintainer the possibility to change the code while keeping the intended functionality. &lt;br /&gt;&lt;br /&gt;Sometimes the methodnames are declared by a interface though. In that case you have to use the more generic names. However, inside the method you can call your nicely named methods again. So you still get the benefit from properly naming them.&lt;br /&gt;&lt;br /&gt;And don't be afraid of long methodnames. However, try to avoid to use "and" and "or" or something similar to connect disparate things. This is a hint, that the method does more than one thing and probably should be refactored.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5313918938572480298-805368652713598084?l=helpqlodhelp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://helpqlodhelp.blogspot.com/feeds/805368652713598084/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://helpqlodhelp.blogspot.com/2010/02/selfdocumenting-code-vs-generic-names.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/805368652713598084'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/805368652713598084'/><link rel='alternate' type='text/html' href='http://helpqlodhelp.blogspot.com/2010/02/selfdocumenting-code-vs-generic-names.html' title='Selfdocumenting code vs generic names'/><author><name>Ralf Bokelberg (rbokel)</name><uri>http://www.blogger.com/profile/04017353300938290017</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_AwT6QbE1L6Q/SwF4vBUo21I/AAAAAAAAAAM/yfztkzYHn3M/S220/s1393119755_30134428_2237021.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5313918938572480298.post-7022193315632855942</id><published>2010-02-26T09:34:00.003+01:00</published><updated>2010-02-26T10:05:48.972+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='less-than-ideal'/><category scheme='http://www.blogger.com/atom/ns#' term='teams'/><category scheme='http://www.blogger.com/atom/ns#' term='best-practices'/><category scheme='http://www.blogger.com/atom/ns#' term='socializing'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>Refactoring vs business</title><content type='html'>In our current project the business officially hates the word refactoring. And right so. &lt;br /&gt;Today every attempt to "improve" the code is called refactoring. However, the original term, as introduced by Martin Fowler's book "Refactoring", ment something different. It ment something much more narrowed than just improving the code. &lt;br /&gt;&lt;br /&gt;Refactoring means improving the code in tiny and clearly defined steps, while always keeping the original functionality. &lt;br /&gt;&lt;br /&gt;First of all, most of the projects i have seen so far, do not have enough test coverage. So you can't really be sure, if the functionality remains intact. Secondly, a lot of people don't even bother to add new tests while they refactor. Which means they don't even know, what  functionality is there after the refactoring. And last but not least, the approach of tiny little steps, hasn't really made it into the devs mind at all. &lt;br /&gt;&lt;br /&gt;The outcome of this adhoc "refactoring" doesn't come unexpected. Most likely you will see many things breaking or even missing after the refactoring. And this makes the business crazy. They don't like to pay somebody for  breaking existung features. &lt;br /&gt;&lt;br /&gt;So what can we do about it? First of all, don't use the word refactoring if you mean a plain rewrite. Secondly, avoid the word refactoring when talking to the business. They don't really understand what quality of code can buy them. This way you don't have to use the word refactoring when you talk to the business. &lt;br /&gt;Imho we should be refactoring all the time, if we see some smell in the code. However, newcomers might see smells where oldtimers don't. So, before you refactor, talk with your fellow developers about it. Last but not least, if you refactor, make sure you do it right. Don't leave out the tests. They might not cover everything, but they should give you a good baseline of confidence in your code. &lt;br /&gt;&lt;br /&gt;I promise, if we all follow these practices, one day, we will see the business beeing happy about refactoring :) At the latest, if they ask you for new features and you can build and integrate them easily without breaking things.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5313918938572480298-7022193315632855942?l=helpqlodhelp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://helpqlodhelp.blogspot.com/feeds/7022193315632855942/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://helpqlodhelp.blogspot.com/2010/02/refactoring-vs-business.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/7022193315632855942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/7022193315632855942'/><link rel='alternate' type='text/html' href='http://helpqlodhelp.blogspot.com/2010/02/refactoring-vs-business.html' title='Refactoring vs business'/><author><name>Ralf Bokelberg (rbokel)</name><uri>http://www.blogger.com/profile/04017353300938290017</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_AwT6QbE1L6Q/SwF4vBUo21I/AAAAAAAAAAM/yfztkzYHn3M/S220/s1393119755_30134428_2237021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5313918938572480298.post-3472529217257032651</id><published>2010-02-26T09:29:00.003+01:00</published><updated>2010-02-26T09:34:48.872+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='socializing'/><title type='text'>More than 10 years in Flash. Great time!</title><content type='html'>Wohoo. When i woke up this morning i realized, that i'm doing Flash related work for more than 10 years now. What a journey. It was great fun and the time just flew by. However, I  wonder, what the future brings? Will there be a Flash player in ten years from now?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5313918938572480298-3472529217257032651?l=helpqlodhelp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://helpqlodhelp.blogspot.com/feeds/3472529217257032651/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://helpqlodhelp.blogspot.com/2010/02/more-than-10-years-in-flash-great-time.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/3472529217257032651'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/3472529217257032651'/><link rel='alternate' type='text/html' href='http://helpqlodhelp.blogspot.com/2010/02/more-than-10-years-in-flash-great-time.html' title='More than 10 years in Flash. Great time!'/><author><name>Ralf Bokelberg (rbokel)</name><uri>http://www.blogger.com/profile/04017353300938290017</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_AwT6QbE1L6Q/SwF4vBUo21I/AAAAAAAAAAM/yfztkzYHn3M/S220/s1393119755_30134428_2237021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5313918938572480298.post-8858820641660491346</id><published>2010-02-04T00:01:00.004+01:00</published><updated>2010-02-04T00:11:56.231+01:00</updated><title type='text'>Hellfire -&gt; multicore flash compilation</title><content type='html'>I've been playing with &lt;a href="http://stopcoding.org/"&gt;Hellfire&lt;/a&gt; lately. It is a interesting project, which uses a compilation server to achieve faster Flash/Flex compilation. Have a look for yourself at &lt;a href="http://stopcoding.org/"&gt;http://stopcoding.org/&lt;/a&gt;. Clement is very responsive, if you need help. &lt;br /&gt;&lt;br /&gt;One particular interesting configuration, which is made possible by Hellfire, is to run FlashBuilder on your laptop and delegate the compilation to some other, maybe more powerful machine under your desk or somewhere else in the  world :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5313918938572480298-8858820641660491346?l=helpqlodhelp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://helpqlodhelp.blogspot.com/feeds/8858820641660491346/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://helpqlodhelp.blogspot.com/2010/02/hellfire-multicore-flash-compilation.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/8858820641660491346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/8858820641660491346'/><link rel='alternate' type='text/html' href='http://helpqlodhelp.blogspot.com/2010/02/hellfire-multicore-flash-compilation.html' title='Hellfire -&gt; multicore flash compilation'/><author><name>Ralf Bokelberg (rbokel)</name><uri>http://www.blogger.com/profile/04017353300938290017</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_AwT6QbE1L6Q/SwF4vBUo21I/AAAAAAAAAAM/yfztkzYHn3M/S220/s1393119755_30134428_2237021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5313918938572480298.post-5672358493585303681</id><published>2010-02-02T15:03:00.003+01:00</published><updated>2010-02-02T15:06:32.759+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='flex-internals'/><title type='text'>Downloading from Flex</title><content type='html'>In you case you didn't know as i did, it is simple to create a download link in Flex using FileReference.download( request );&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5313918938572480298-5672358493585303681?l=helpqlodhelp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://helpqlodhelp.blogspot.com/feeds/5672358493585303681/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://helpqlodhelp.blogspot.com/2010/02/downloading-from-flex.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/5672358493585303681'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/5672358493585303681'/><link rel='alternate' type='text/html' href='http://helpqlodhelp.blogspot.com/2010/02/downloading-from-flex.html' title='Downloading from Flex'/><author><name>Ralf Bokelberg (rbokel)</name><uri>http://www.blogger.com/profile/04017353300938290017</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_AwT6QbE1L6Q/SwF4vBUo21I/AAAAAAAAAAM/yfztkzYHn3M/S220/s1393119755_30134428_2237021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5313918938572480298.post-5649520549656815199</id><published>2010-01-25T09:08:00.008+01:00</published><updated>2010-01-25T09:35:39.937+01:00</updated><title type='text'>Making it obvious is hard to do</title><content type='html'>It is always interesting to join a project which has some code already. Our code is supposed to be self documenting and easy to read. However some of the code i have seen so far is not. Let me give you one example. &lt;br /&gt;The following code is part of a search feature. It contains two different forms and a result screen. The two different forms allow the user to either search by the details of a person, eg. name and address or by some ids, which are assigned by the system. The following method is part of a presentation model for the forms. It is called, whenever one of the forms dispatches a change event (user tabs out of a input field.)&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;public function handleSearchFormChange() : void&lt;br /&gt;{&lt;br /&gt; if ( ( detailedSearchFormPM.criteria.isValidForSearch() || uidSearchFormPM.criteria.isValidForSearch() ) )&lt;br /&gt; {&lt;br /&gt;  if ( detailedSearchFormPM.validatorGroup.validate( true ) )&lt;br /&gt;  {&lt;br /&gt;   searchEnabled = true;&lt;br /&gt;  }&lt;br /&gt;  else&lt;br /&gt;  {&lt;br /&gt;   searchEnabled = false;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; else&lt;br /&gt; {&lt;br /&gt;  searchEnabled = false;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; if ( detailedSearchFormPM.criteria.isValidForReset() || uidSearchFormPM.criteria.isValidForSearch() )&lt;br /&gt;  resetEnabled = true;&lt;br /&gt; else&lt;br /&gt;  resetEnabled = false;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;What does this method do? The name doesn't tell us. Instead is is named after the event it is supposed to handle. So instead of abstracting away some concept, this method makes the code even less abstract by introducing additional information, which is not needed here. Is there a bug in the first part? Should the search button only be enabled if the detailed search contains valid data? &lt;br /&gt;&lt;br /&gt;In the mxml code you can see the method beeing used like so&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;... change="pm.handleSearchFormChange()" .../&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;So at the level of the mxml code the information is pretty much duplicated. By looking at the mxml code alone, we are not able to guess, what this method is doing. &lt;br /&gt;&lt;br /&gt;Now lets look at the code of the method. It updates two properties searchEnabled and resetEnabled. These properties are bindable and are connected to enabled property of the two buttons search und reset. However, what rules are used to calculate these properties, is not obvious from the code. The code accesses inner objects of the FormPMs, not good, because it ties us to the implementation of these PMs. (Law of Demeter)&lt;br /&gt;&lt;br /&gt;Let's see, if we can refactor the code a bit. &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;public function handleSearchFormChange() : void&lt;br /&gt;{&lt;br /&gt; enableButtonsIfFormsContainInput();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private function enableButtonsIfFormsContainInput() : void&lt;br /&gt;{&lt;br /&gt; enableSearchButtonIfFormContainsValidInput();&lt;br /&gt; enableResetButtonIfFormContainsAnyInput();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private function enableSearchButtonIfFormContainsValidInput() : void&lt;br /&gt;{&lt;br /&gt; searchEnabled = detailedFormContainsValidInput() || uidSearchFormContainsValidInput();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private function detailedFormContainsValidInput() : Boolean&lt;br /&gt;{&lt;br /&gt; return detailedSearchFormPM.criteria.isValidForSearch() &amp;&amp; detailedSearchFormPM.validatorGroup.validate( true );&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private function uidSearchFormContainsValidInput() : Boolean&lt;br /&gt;{&lt;br /&gt; return uidSearchFormPM.criteria.isValidForSearch();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private function enableResetButtonIfFormContainsAnyInput() : void&lt;br /&gt;{&lt;br /&gt; resetEnabled = detailedSearchFormContainsInput() || uidSearchFormContainsInput();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private function detailedSearchFormContainsInput() : Boolean&lt;br /&gt;{&lt;br /&gt; return detailedSearchFormPM.criteria.isValidForReset();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private function uidSearchFormContainsInput() : Boolean&lt;br /&gt;{&lt;br /&gt; return uidSearchFormPM.criteria.isValidForSearch();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This would be start to make it a bit more readable. Now a next step would be to move some of the methods to other objects. All the methods which are concerned with the inner details of one of the FormPMs should be moved to the FormPMs. The resulting code looks like this. &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;public function handleSearchFormChange() : void&lt;br /&gt;{&lt;br /&gt; enableButtonsIfFormsContainInput();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private function enableButtonsIfFormsContainInput() : void&lt;br /&gt;{&lt;br /&gt; enableSearchButtonIfFormContainsValidInput();&lt;br /&gt; enableResetButtonIfFormContainsAnyInput();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private function enableSearchButtonIfFormContainsValidInput() : void&lt;br /&gt;{&lt;br /&gt; searchEnabled = detailedSearchFormPM.containsValidInput() || uidSearchFormPM.containsValidInput();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private function enableResetButtonIfFormContainsAnyInput() : void&lt;br /&gt;{&lt;br /&gt; resetEnabled = detailedSearchFormPM.containsInput() || uidSearchFormPM.containsInput();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Now we have to decide if we really want to know, when the entry method is called. Instead of the method name we use the event parameter to tell us when the method is called. &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;public function enableButtonsIfFormsContainInput( event : FormsInputChangeEvent ) : void &lt;br /&gt;{&lt;br /&gt;    ...&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;and in mxml it looks like so &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;... formsInputChange="enableButtonsIfFormsContainInput(event)" .../&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Now the code reveals much more about its intention. If somebody needs to fix this code or to add another feature, it is much easier to do so, because it is obvious, what the code is supposed to do. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Best,&lt;br /&gt;Ralf.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5313918938572480298-5649520549656815199?l=helpqlodhelp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://helpqlodhelp.blogspot.com/feeds/5649520549656815199/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://helpqlodhelp.blogspot.com/2010/01/self-documenting-code.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/5649520549656815199'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/5649520549656815199'/><link rel='alternate' type='text/html' href='http://helpqlodhelp.blogspot.com/2010/01/self-documenting-code.html' title='Making it obvious is hard to do'/><author><name>Ralf Bokelberg (rbokel)</name><uri>http://www.blogger.com/profile/04017353300938290017</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_AwT6QbE1L6Q/SwF4vBUo21I/AAAAAAAAAAM/yfztkzYHn3M/S220/s1393119755_30134428_2237021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5313918938572480298.post-3532366355290461079</id><published>2010-01-09T17:15:00.003+01:00</published><updated>2010-01-09T17:22:48.686+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='frameworks'/><category scheme='http://www.blogger.com/atom/ns#' term='programming-languages'/><category scheme='http://www.blogger.com/atom/ns#' term='literature'/><title type='text'>What i'm up to: C++, Qt, Release It</title><content type='html'>I have a few days of, which allows me to spend some time on learning a new language. I choosed C++ this time. For the GUI i use QT, which has some nice abstractions like signals and slots. &lt;br /&gt;&lt;br /&gt;On my book shelf i have "Release it" by Michael T Nygard. It is about architecture for production versus architecture for the ivory tower.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5313918938572480298-3532366355290461079?l=helpqlodhelp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://helpqlodhelp.blogspot.com/feeds/3532366355290461079/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://helpqlodhelp.blogspot.com/2010/01/what-im-up-to-c-qt-release-it.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/3532366355290461079'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/3532366355290461079'/><link rel='alternate' type='text/html' href='http://helpqlodhelp.blogspot.com/2010/01/what-im-up-to-c-qt-release-it.html' title='What i&apos;m up to: C++, Qt, Release It'/><author><name>Ralf Bokelberg (rbokel)</name><uri>http://www.blogger.com/profile/04017353300938290017</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_AwT6QbE1L6Q/SwF4vBUo21I/AAAAAAAAAAM/yfztkzYHn3M/S220/s1393119755_30134428_2237021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5313918938572480298.post-6184081000562355637</id><published>2009-12-21T16:46:00.005+01:00</published><updated>2009-12-21T16:52:38.019+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='socializing'/><title type='text'>Merry Christmas</title><content type='html'>Dear Readers &lt;br /&gt;&lt;br /&gt;I wish you and your beloved ones a merry christmas and a happy new year. &lt;br /&gt;I hope 2010 will be as exciting and wonderful as 2009. &lt;br /&gt;&lt;br /&gt;See you next year,&lt;br /&gt;Ralf. &lt;br /&gt;&lt;br /&gt;PS. My unplugged christmas greetings &lt;br /&gt;&lt;a href="http://soundcloud.com/rbokel/merry-christmas-2009"&gt;http://soundcloud.com/rbokel/merry-christmas-2009&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5313918938572480298-6184081000562355637?l=helpqlodhelp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://helpqlodhelp.blogspot.com/feeds/6184081000562355637/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://helpqlodhelp.blogspot.com/2009/12/merry-christmas.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/6184081000562355637'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/6184081000562355637'/><link rel='alternate' type='text/html' href='http://helpqlodhelp.blogspot.com/2009/12/merry-christmas.html' title='Merry Christmas'/><author><name>Ralf Bokelberg (rbokel)</name><uri>http://www.blogger.com/profile/04017353300938290017</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_AwT6QbE1L6Q/SwF4vBUo21I/AAAAAAAAAAM/yfztkzYHn3M/S220/s1393119755_30134428_2237021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5313918938572480298.post-4927363927040932940</id><published>2009-12-15T23:13:00.005+01:00</published><updated>2009-12-15T23:53:47.923+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='less-than-ideal'/><category scheme='http://www.blogger.com/atom/ns#' term='best-practices'/><title type='text'>Browser back button vs RIA</title><content type='html'>Very often we hear, that RIA applications break the conventions that the users are accustomed to in the browser, especially the use of the back and forward button.&lt;br /&gt;I wonder if people really expect that though. Aren't RIAs more like real applications than a webpage? When was the last time you missed the back button in Adobe Photoshop, MS Word or some similar app? &lt;br /&gt;&lt;br /&gt;Also, when it comes to implementation, there are some really hairy situations. Say you have a screen with a form, the user fills in a few things and presses the back button. Your common policy is to display a alert asking the user, if she really wants to navigate away. Now imagine the user says no, what does that do to your history? The history thinks, you have been going back, while in fact you stayed on the same page. &lt;br /&gt;Allthough, now that i think about it, probably i can forward the history to undo the back button action. Need to test that. Thanks for listening :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5313918938572480298-4927363927040932940?l=helpqlodhelp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://helpqlodhelp.blogspot.com/feeds/4927363927040932940/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://helpqlodhelp.blogspot.com/2009/12/browser-back-button-vs-ria.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/4927363927040932940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/4927363927040932940'/><link rel='alternate' type='text/html' href='http://helpqlodhelp.blogspot.com/2009/12/browser-back-button-vs-ria.html' title='Browser back button vs RIA'/><author><name>Ralf Bokelberg (rbokel)</name><uri>http://www.blogger.com/profile/04017353300938290017</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_AwT6QbE1L6Q/SwF4vBUo21I/AAAAAAAAAAM/yfztkzYHn3M/S220/s1393119755_30134428_2237021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5313918938572480298.post-5902878098750147014</id><published>2009-12-15T09:45:00.002+01:00</published><updated>2009-12-15T09:50:10.181+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='less-than-ideal'/><title type='text'>Flex &amp; Iframes - oh my</title><content type='html'>Ok, so we have this nice little Flex app, which allows the user to use the browser back button. Wohoo, usability galore! But what if we have a iframe opened to show some html on top of the Flex app and the user presses the back button. Now it gets nasty, sniff. My beautiful code needs to do something real now :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5313918938572480298-5902878098750147014?l=helpqlodhelp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://helpqlodhelp.blogspot.com/feeds/5902878098750147014/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://helpqlodhelp.blogspot.com/2009/12/flex-iframes-oh-my.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/5902878098750147014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/5902878098750147014'/><link rel='alternate' type='text/html' href='http://helpqlodhelp.blogspot.com/2009/12/flex-iframes-oh-my.html' title='Flex &amp; Iframes - oh my'/><author><name>Ralf Bokelberg (rbokel)</name><uri>http://www.blogger.com/profile/04017353300938290017</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_AwT6QbE1L6Q/SwF4vBUo21I/AAAAAAAAAAM/yfztkzYHn3M/S220/s1393119755_30134428_2237021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5313918938572480298.post-3748411179864857237</id><published>2009-12-08T11:49:00.003+01:00</published><updated>2009-12-08T11:56:28.489+01:00</updated><title type='text'>FlexBuilder locale editing conflics with Java</title><content type='html'>We are working on a international project and need some international characters inside of the locale .properties files. However, whenever we edit a properties file and save it, it gets converted to ISO-8851-1, allthough the workspace is set to UTF-8.&lt;br /&gt;&lt;br /&gt;We are using the plugin version of FB as we also need to edit Java files. I found out, that in Window/Preferences/General/ContentType the encoding for properties files is set to ISO. After some research i found, that Java needs the .properties files to be in ISO. So i think there is a conflict here. JDT wants to ensure, that properties files are in ISO, while FB needs them in UTF-8.&lt;br /&gt;&lt;br /&gt;Our current solution is to use Notepad to edit the locale files.&lt;br /&gt;In the long run it might be better though, to change the ending of the locale files to something else to avoid this conflict.&lt;br /&gt;&lt;br /&gt;Please vote for this bug: &lt;a href="https://bugs.adobe.com/jira/browse/FB-24683"&gt;https://bugs.adobe.com/jira/browse/FB-24683&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5313918938572480298-3748411179864857237?l=helpqlodhelp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://helpqlodhelp.blogspot.com/feeds/3748411179864857237/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://helpqlodhelp.blogspot.com/2009/12/flex-locale-editing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/3748411179864857237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/3748411179864857237'/><link rel='alternate' type='text/html' href='http://helpqlodhelp.blogspot.com/2009/12/flex-locale-editing.html' title='FlexBuilder locale editing conflics with Java'/><author><name>Ralf Bokelberg (rbokel)</name><uri>http://www.blogger.com/profile/04017353300938290017</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_AwT6QbE1L6Q/SwF4vBUo21I/AAAAAAAAAAM/yfztkzYHn3M/S220/s1393119755_30134428_2237021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5313918938572480298.post-4100812210851844238</id><published>2009-12-04T20:05:00.012+01:00</published><updated>2009-12-08T10:24:33.733+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='frameworks'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>FlexUnit extended for long method names</title><content type='html'>Today i extended FlexUnit a bit, so we can see long methodNames. When we try to follow the BDD schema "Given A When B Then C" the names can get really long. Here is one example, and it is not even the longest one. &lt;br /&gt;&lt;br /&gt;test_WhenTransactionsAreLoaded_ThenTransactionsAreSortedByDateDescending&lt;br /&gt;  &lt;br /&gt;However, long methodNames are truncated in the right panel of FlexUnit. So your beautiful methodName ends up looking like: &lt;br /&gt;&lt;br /&gt;test_WhenTransactionsAreLoad...&lt;br /&gt;&lt;br /&gt;Not very helpful. So the first thing i did, was to replace the mx:Label with a mx:Text to allow for multiple lines. But to take it a little bit further, i also reformatted the methodName. Underscores are replaced by newlines and the came case text is broken up into words. So in the end it looks like this &lt;br /&gt;&lt;br /&gt;test&lt;br /&gt;When Transactions Are Loaded&lt;br /&gt;Then Transactions Are Sorted By Date Descending&lt;br /&gt;&lt;br /&gt;Much better! &lt;br /&gt;Some things don't fit well in this schema though, eg single character words like "a" or interface names like ISomething. But still, the overall result is much more readable than it was before. The screenshot below shows what it looks like in FlexUnit. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_AwT6QbE1L6Q/SxlfsNUIW5I/AAAAAAAAABo/IqpCbxz8UVI/s1600-h/FlexUnitLongMethodNames.jpg"&gt;&lt;img style="margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 320px; height: 225px;" src="http://4.bp.blogspot.com/_AwT6QbE1L6Q/SxlfsNUIW5I/AAAAAAAAABo/IqpCbxz8UVI/s320/FlexUnitLongMethodNames.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5411461640355339154" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Addendum: &lt;br /&gt;I have added a entry to the bug base for flex unit. Please vote for it, if you want to support it: &lt;a href="https://bugs.adobe.com/jira/browse/FXU-83"&gt;https://bugs.adobe.com/jira/browse/FXU-83&lt;/a&gt;&lt;br /&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5313918938572480298-4100812210851844238?l=helpqlodhelp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://helpqlodhelp.blogspot.com/feeds/4100812210851844238/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://helpqlodhelp.blogspot.com/2009/12/flexunit-extended-for-long-method-names.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/4100812210851844238'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/4100812210851844238'/><link rel='alternate' type='text/html' href='http://helpqlodhelp.blogspot.com/2009/12/flexunit-extended-for-long-method-names.html' title='FlexUnit extended for long method names'/><author><name>Ralf Bokelberg (rbokel)</name><uri>http://www.blogger.com/profile/04017353300938290017</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_AwT6QbE1L6Q/SwF4vBUo21I/AAAAAAAAAAM/yfztkzYHn3M/S220/s1393119755_30134428_2237021.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_AwT6QbE1L6Q/SxlfsNUIW5I/AAAAAAAAABo/IqpCbxz8UVI/s72-c/FlexUnitLongMethodNames.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5313918938572480298.post-2691878333802621386</id><published>2009-12-01T09:44:00.002+01:00</published><updated>2009-12-01T09:52:02.750+01:00</updated><title type='text'>Micro modules anyone?</title><content type='html'>At the moment i follow this interesting blog series about &lt;a href="http://techdistrict.kirkk.com/2009/11/30/applied-modularity-part-4/"&gt;modularizing applications&lt;/a&gt;. Also I'm playing around with &lt;a href="http://wiki.github.com/aslakhellesoy/cucumber/funfx-and-flex"&gt;FunFx&lt;/a&gt; and &lt;a href="http://cukes.info/"&gt;Cucumber&lt;/a&gt; for functional testing flex applications. &lt;br /&gt;One problem with functional testing is to navigate to the view you want to test. Maybe you need to login first and click a few menu items before you get to it. What if something changes in these areas. It might break all you functional tests for a otherwise unrelated view. I think it would make sense to create applications containing this one view only, so you don't need to navigate to get there. Now what if this view was in a module of its own? This way it could be used in the tests and in the app. &lt;br /&gt;&lt;br /&gt;I wonder if somebody has experience in building Flex apps from such micro modules, ie. Modules which contain a very small part of the application?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5313918938572480298-2691878333802621386?l=helpqlodhelp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://helpqlodhelp.blogspot.com/feeds/2691878333802621386/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://helpqlodhelp.blogspot.com/2009/12/micro-modules-anyone.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/2691878333802621386'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/2691878333802621386'/><link rel='alternate' type='text/html' href='http://helpqlodhelp.blogspot.com/2009/12/micro-modules-anyone.html' title='Micro modules anyone?'/><author><name>Ralf Bokelberg (rbokel)</name><uri>http://www.blogger.com/profile/04017353300938290017</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_AwT6QbE1L6Q/SwF4vBUo21I/AAAAAAAAAAM/yfztkzYHn3M/S220/s1393119755_30134428_2237021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5313918938572480298.post-454515878936311597</id><published>2009-12-01T09:33:00.004+01:00</published><updated>2009-12-01T09:42:28.417+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><title type='text'>Profiling remoting calls</title><content type='html'>For our app i needed to measure the duration of backend calls. Luckily our delegates were all subclassing the same AbstractRemoteDelegate. So it was quite easy to add something in. What i did is to create a Responder which measures the duration of the calls and writes them to a Log. Inside the AbstractRemoteDelegate i add this responder to every call. This gives me the data. A DataGrid inside a TitleWindow is used to display the data. &lt;br /&gt;&lt;br /&gt;In general instrumenting a application for debugging/profiling is a interesting topic. What are you using?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5313918938572480298-454515878936311597?l=helpqlodhelp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://helpqlodhelp.blogspot.com/feeds/454515878936311597/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://helpqlodhelp.blogspot.com/2009/12/profiling-remoting-calls.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/454515878936311597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/454515878936311597'/><link rel='alternate' type='text/html' href='http://helpqlodhelp.blogspot.com/2009/12/profiling-remoting-calls.html' title='Profiling remoting calls'/><author><name>Ralf Bokelberg (rbokel)</name><uri>http://www.blogger.com/profile/04017353300938290017</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_AwT6QbE1L6Q/SwF4vBUo21I/AAAAAAAAAAM/yfztkzYHn3M/S220/s1393119755_30134428_2237021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5313918938572480298.post-2504741406591028632</id><published>2009-11-30T09:21:00.002+01:00</published><updated>2009-11-30T09:28:59.241+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='frameworks'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>FunFx: Flex Gui Testing</title><content type='html'>I'm playing around with FunFx atm. It is based on the automation packages, that come with FB professional. It is quite interesting to see, how components are recognized by the automation package. &lt;br /&gt;For example: My form contains a FormItem with a label "username" and a TextInput with a id/automationName "username". When i tried to access the TextInput i got an error, because the automation package was returning the FormItem instead. It took me a while to find out, that i had to give the FormItem a automationName other than "username" to make it work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5313918938572480298-2504741406591028632?l=helpqlodhelp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://helpqlodhelp.blogspot.com/feeds/2504741406591028632/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://helpqlodhelp.blogspot.com/2009/11/funfx-flex-gui-testing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/2504741406591028632'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/2504741406591028632'/><link rel='alternate' type='text/html' href='http://helpqlodhelp.blogspot.com/2009/11/funfx-flex-gui-testing.html' title='FunFx: Flex Gui Testing'/><author><name>Ralf Bokelberg (rbokel)</name><uri>http://www.blogger.com/profile/04017353300938290017</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_AwT6QbE1L6Q/SwF4vBUo21I/AAAAAAAAAAM/yfztkzYHn3M/S220/s1393119755_30134428_2237021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5313918938572480298.post-3277887799284986770</id><published>2009-11-29T11:12:00.002+01:00</published><updated>2009-11-29T11:19:18.722+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='best-practices'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>Conditional compilation considered harmless, not.</title><content type='html'>Just recently i discovered a little problem with conditional compilation. Our dev build was working fine, while our test build had a unexpected error. It turned out, that the error was in a part of code which was included by conditional compilation. So, when you test your classes, you have to make sure that all the different branches are tested.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5313918938572480298-3277887799284986770?l=helpqlodhelp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://helpqlodhelp.blogspot.com/feeds/3277887799284986770/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://helpqlodhelp.blogspot.com/2009/11/conditional-compilation-considered.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/3277887799284986770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/3277887799284986770'/><link rel='alternate' type='text/html' href='http://helpqlodhelp.blogspot.com/2009/11/conditional-compilation-considered.html' title='Conditional compilation considered harmless, not.'/><author><name>Ralf Bokelberg (rbokel)</name><uri>http://www.blogger.com/profile/04017353300938290017</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_AwT6QbE1L6Q/SwF4vBUo21I/AAAAAAAAAAM/yfztkzYHn3M/S220/s1393119755_30134428_2237021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5313918938572480298.post-1788627737494896311</id><published>2009-11-25T09:12:00.006+01:00</published><updated>2009-11-25T09:58:40.172+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='flex-internals'/><title type='text'>Embedding Fonts Compiler Issue</title><content type='html'>The guys at developmentarc have a &lt;a href="http://www.developmentarc.com/site/2009/11/merging-fonts-when-embedding/"&gt;good article about font embedding&lt;/a&gt; online. Probably most of the old time flashers know this already, but still it is nice to have it written up nicely. &lt;br /&gt;In my current project we were trying to do the same. Unfortunately it didn't work. &lt;br /&gt;&lt;br /&gt;Enter the magic land of font formats. It turned out, that the fonts were not recognized as bold or italic fonts, even though they were bold or italic fonts actually. The problem was, that the font's internal header didn't have the style flags for bold/italic set. According to the fontshop this was to avoid compatibility problems. So what we had to do, is to open the font in a font editor and set the flags accordingly. After it was working fine.&lt;br /&gt;&lt;br /&gt;Nice hack. However, i think it is a symptom of a more fundamental problem. &lt;br /&gt;Flash/Flex uses the styles like bold/italic for two different things. First for telling the compiler which style to embed and second to define, which style the font is supposed to be used for. &lt;br /&gt;&lt;br /&gt;Imagine you want to use font A as the normal font and font B as the bold font. However font B is not bold and so the internal font header flag for bold is not set. &lt;br /&gt;Basically this is the same situation as decribed above. You would have to fiddle with the font header again. &lt;br /&gt;&lt;br /&gt;The best solution would be to change the compiler really. We should have one flag to tell the compiler which font/style to embed and another flag to tell it, which style this font should be used for.&lt;br /&gt;&lt;br /&gt;Feel free to vote and add comments to the feature request in Adobe's bug base: &lt;a href="http://bugs.adobe.com/jira/browse/SDK-24408"&gt;http://bugs.adobe.com/jira/browse/SDK-24408&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5313918938572480298-1788627737494896311?l=helpqlodhelp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://helpqlodhelp.blogspot.com/feeds/1788627737494896311/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://helpqlodhelp.blogspot.com/2009/11/embedding-fonts-compiler-issue.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/1788627737494896311'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/1788627737494896311'/><link rel='alternate' type='text/html' href='http://helpqlodhelp.blogspot.com/2009/11/embedding-fonts-compiler-issue.html' title='Embedding Fonts Compiler Issue'/><author><name>Ralf Bokelberg (rbokel)</name><uri>http://www.blogger.com/profile/04017353300938290017</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_AwT6QbE1L6Q/SwF4vBUo21I/AAAAAAAAAAM/yfztkzYHn3M/S220/s1393119755_30134428_2237021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5313918938572480298.post-6659484887358044989</id><published>2009-11-24T09:51:00.004+01:00</published><updated>2009-11-25T09:34:10.898+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='best-practices'/><title type='text'>Keep your presentation models small</title><content type='html'>It is tempting to use a presentation model in multiple views. However, this increases the size of the PM. Also it makes it hard to understand. &lt;br /&gt;If you need to share state between two views/pms it might be better to inject a model object into both pms instead. &lt;br /&gt;One example i'm currently working on is the loaded-state of a module. In the module loader i want to update this state and in some other view i want to check it and react accordingly. Instead of having a simple Boolean on a PM and sharing the PM, i'd prefer to create a model object and share it between two independent PMs.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5313918938572480298-6659484887358044989?l=helpqlodhelp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://helpqlodhelp.blogspot.com/feeds/6659484887358044989/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://helpqlodhelp.blogspot.com/2009/11/keep-your-presentation-models-small_24.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/6659484887358044989'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/6659484887358044989'/><link rel='alternate' type='text/html' href='http://helpqlodhelp.blogspot.com/2009/11/keep-your-presentation-models-small_24.html' title='Keep your presentation models small'/><author><name>Ralf Bokelberg (rbokel)</name><uri>http://www.blogger.com/profile/04017353300938290017</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_AwT6QbE1L6Q/SwF4vBUo21I/AAAAAAAAAAM/yfztkzYHn3M/S220/s1393119755_30134428_2237021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5313918938572480298.post-5593965677472495946</id><published>2009-11-23T09:05:00.005+01:00</published><updated>2009-11-23T09:18:01.843+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='teams'/><category scheme='http://www.blogger.com/atom/ns#' term='best-practices'/><title type='text'>Best practive repository</title><content type='html'>This morning i read this nice blog from &lt;a href="http://blogs.msdn.com/jmeier/archive/2009/11/23/patterns-and-practices-for-distributed-teams.aspx"&gt;JD Meyer about Distributed Teams&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt; One thing i found interesting is what he calls a "Best Practices Repository"&lt;br /&gt;&lt;br /&gt;[quote]&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(85, 85, 85); font-family: Geneva, Verdana, Arial, Helvetica, sans-serif; font-size: 12px; line-height: 17px; "&gt;&lt;strong style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;Best Practices Repository&lt;/strong&gt;.   We store our best practices for each project in a project-level repository.  At the end of the project, we port the best practices to a shared repository across projects.  This way each project is focused on “best practices,” and these are very specific and detailed.  The all up best practices are more generalized to be useful across projects, and as a starting point for new projects.&lt;/span&gt;&lt;/div&gt;[/quote]&lt;br /&gt;&lt;br /&gt;I think this is something every project can benefit from. A repository which describes the practices which are used throughout the project.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5313918938572480298-5593965677472495946?l=helpqlodhelp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://helpqlodhelp.blogspot.com/feeds/5593965677472495946/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://helpqlodhelp.blogspot.com/2009/11/best-practive-repository.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/5593965677472495946'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/5593965677472495946'/><link rel='alternate' type='text/html' href='http://helpqlodhelp.blogspot.com/2009/11/best-practive-repository.html' title='Best practive repository'/><author><name>Ralf Bokelberg (rbokel)</name><uri>http://www.blogger.com/profile/04017353300938290017</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_AwT6QbE1L6Q/SwF4vBUo21I/AAAAAAAAAAM/yfztkzYHn3M/S220/s1393119755_30134428_2237021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5313918938572480298.post-8346527755641961664</id><published>2009-11-21T22:22:00.002+01:00</published><updated>2009-11-21T22:25:26.389+01:00</updated><title type='text'>Practice programming with CodeKatas</title><content type='html'>&lt;div&gt;Interesting concept for getting a better programmer by practicing&lt;/div&gt;&lt;a href="http://codekata.pragprog.com/"&gt;http://codekata.pragprog.com/&lt;/a&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Maybe something for a rainy day :) &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5313918938572480298-8346527755641961664?l=helpqlodhelp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://helpqlodhelp.blogspot.com/feeds/8346527755641961664/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://helpqlodhelp.blogspot.com/2009/11/practice-programming-with-codekatas.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/8346527755641961664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/8346527755641961664'/><link rel='alternate' type='text/html' href='http://helpqlodhelp.blogspot.com/2009/11/practice-programming-with-codekatas.html' title='Practice programming with CodeKatas'/><author><name>Ralf Bokelberg (rbokel)</name><uri>http://www.blogger.com/profile/04017353300938290017</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_AwT6QbE1L6Q/SwF4vBUo21I/AAAAAAAAAAM/yfztkzYHn3M/S220/s1393119755_30134428_2237021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5313918938572480298.post-6428381023568675670</id><published>2009-11-20T09:37:00.001+01:00</published><updated>2009-11-20T09:38:40.878+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flex-internals'/><title type='text'>Nice article: Flex component lifecylce</title><content type='html'>&lt;div&gt;&lt;a href="http://www.developmentarc.com/site/wp-content/uploads/pdfs/understanding_the_flex_3_lifecycle_v1.0.pdf"&gt;http://www.developmentarc.com/site/wp-content/uploads/pdfs/understanding_the_flex_3_lifecycle_v1.0.pdf&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5313918938572480298-6428381023568675670?l=helpqlodhelp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://helpqlodhelp.blogspot.com/feeds/6428381023568675670/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://helpqlodhelp.blogspot.com/2009/11/nice-article-flex-component-lifecylce.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/6428381023568675670'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/6428381023568675670'/><link rel='alternate' type='text/html' href='http://helpqlodhelp.blogspot.com/2009/11/nice-article-flex-component-lifecylce.html' title='Nice article: Flex component lifecylce'/><author><name>Ralf Bokelberg (rbokel)</name><uri>http://www.blogger.com/profile/04017353300938290017</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_AwT6QbE1L6Q/SwF4vBUo21I/AAAAAAAAAAM/yfztkzYHn3M/S220/s1393119755_30134428_2237021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5313918938572480298.post-8824236895200046869</id><published>2009-11-20T08:57:00.000+01:00</published><updated>2009-11-20T09:13:51.987+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='best-practices'/><category scheme='http://www.blogger.com/atom/ns#' term='testing'/><title type='text'>Use interfaces for your injected models to ease testing</title><content type='html'>We use IoC to inject our models into the presentation models.  When we test a presentation model we inject the models manually in the setUp method. Some models need things to be injected as well. This can make the setup quite complicated. To avoid this complexity it is very helpful if your model properties are typed as interfaces, e.g.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;[Inject]&lt;/div&gt;&lt;div&gt;public var myModel : ISomeModel;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This gives you the possibility to replace the model with your own mock implementation of the interface. Typically your mock implementation does not use nested models. So the setUp of this mock model is much easier than setting up the original. This is especially true if you need to inject things, which are unrelated to your test, but are needed by the original model to work at all. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5313918938572480298-8824236895200046869?l=helpqlodhelp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://helpqlodhelp.blogspot.com/feeds/8824236895200046869/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://helpqlodhelp.blogspot.com/2009/11/use-interfaces-for-your-injected-models.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/8824236895200046869'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/8824236895200046869'/><link rel='alternate' type='text/html' href='http://helpqlodhelp.blogspot.com/2009/11/use-interfaces-for-your-injected-models.html' title='Use interfaces for your injected models to ease testing'/><author><name>Ralf Bokelberg (rbokel)</name><uri>http://www.blogger.com/profile/04017353300938290017</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_AwT6QbE1L6Q/SwF4vBUo21I/AAAAAAAAAAM/yfztkzYHn3M/S220/s1393119755_30134428_2237021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5313918938572480298.post-5779471675177083799</id><published>2009-11-19T22:45:00.000+01:00</published><updated>2009-11-19T22:54:38.583+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design-patterns'/><title type='text'>RIA Design Patterns: NavigationModelAdapter</title><content type='html'>In our current application we use a nice design pattern for controlling the views. I call it NavigationModelAdapter. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We have a central NavigationModel, which contains a url property, e.g. /main/sub/subsub. Every part of the url controls a viewstack or a state. The navigatable views have a instance of a NavigationModelAdapter. Whenever the NavigationModel changes, the NavigationModelAdapters synchronize their view with the NavigationModel. Nice and clean. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5313918938572480298-5779471675177083799?l=helpqlodhelp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://helpqlodhelp.blogspot.com/feeds/5779471675177083799/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://helpqlodhelp.blogspot.com/2009/11/ria-design-patterns-navigationmodeladap.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/5779471675177083799'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/5779471675177083799'/><link rel='alternate' type='text/html' href='http://helpqlodhelp.blogspot.com/2009/11/ria-design-patterns-navigationmodeladap.html' title='RIA Design Patterns: NavigationModelAdapter'/><author><name>Ralf Bokelberg (rbokel)</name><uri>http://www.blogger.com/profile/04017353300938290017</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_AwT6QbE1L6Q/SwF4vBUo21I/AAAAAAAAAAM/yfztkzYHn3M/S220/s1393119755_30134428_2237021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5313918938572480298.post-8228303253620145418</id><published>2009-11-19T13:39:00.000+01:00</published><updated>2009-11-19T14:00:41.444+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='best-practices'/><title type='text'>Keep your presentation models small</title><content type='html'>Large classes are harder to read, harder to test and harder to maintain. Especially PresentationModels can easily get of hand and grow very large. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Components to rescue! One way to make them smaller is to split off a sub component from your view and create a specific PresentationModel just for this part. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5313918938572480298-8228303253620145418?l=helpqlodhelp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://helpqlodhelp.blogspot.com/feeds/8228303253620145418/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://helpqlodhelp.blogspot.com/2009/11/keep-your-presentation-models-small.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/8228303253620145418'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/8228303253620145418'/><link rel='alternate' type='text/html' href='http://helpqlodhelp.blogspot.com/2009/11/keep-your-presentation-models-small.html' title='Keep your presentation models small'/><author><name>Ralf Bokelberg (rbokel)</name><uri>http://www.blogger.com/profile/04017353300938290017</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_AwT6QbE1L6Q/SwF4vBUo21I/AAAAAAAAAAM/yfztkzYHn3M/S220/s1393119755_30134428_2237021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5313918938572480298.post-9063765057438494416</id><published>2009-11-19T09:57:00.001+01:00</published><updated>2009-11-19T14:00:19.646+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='frameworks'/><title type='text'>What Cairngorm-3 is about</title><content type='html'>I found a very nice and inspiring presentation, which kind of explains what Cairngorm 3 is about. It is no longer about "my framework is better than yours". It is not about conquering terms like a 800 pound gorilla. It more about how to overcome our "not invented here" syndrome and how we can get closer to solutions which benefit all of us. Have a look for yourself.  &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="  border-collapse: collapse; font-family:arial, sans-serif;font-size:13px;"&gt;&lt;a href="http://www.ted.com/talks/david_logan_on_tribal_leadership.html" target="_blank" style="color: rgb(42, 93, 176); "&gt;http://www.ted.com/talks/&lt;wbr&gt;david_logan_on_tribal_&lt;wbr&gt;leadership.html&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:arial, sans-serif;font-size:100%;"&gt;&lt;span class="Apple-style-span"  style="border-collapse: collapse; font-size:13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;I think CG3 is level 4 while CG2 is level3. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5313918938572480298-9063765057438494416?l=helpqlodhelp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://helpqlodhelp.blogspot.com/feeds/9063765057438494416/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://helpqlodhelp.blogspot.com/2009/11/what-cairngorm-3-is-about.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/9063765057438494416'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/9063765057438494416'/><link rel='alternate' type='text/html' href='http://helpqlodhelp.blogspot.com/2009/11/what-cairngorm-3-is-about.html' title='What Cairngorm-3 is about'/><author><name>Ralf Bokelberg (rbokel)</name><uri>http://www.blogger.com/profile/04017353300938290017</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_AwT6QbE1L6Q/SwF4vBUo21I/AAAAAAAAAAM/yfztkzYHn3M/S220/s1393119755_30134428_2237021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5313918938572480298.post-757193817085055236</id><published>2009-11-17T09:08:00.000+01:00</published><updated>2009-11-17T12:10:24.575+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='literature'/><title type='text'>Worth a read: Coders at work</title><content type='html'>Peter Seibel, the author of "Practical Common Lisp" (which is nice as well), wrote a new book "Coders at work". It is a collection of interviews with some of the top programmers in the world. Do not expect it to be a very technical book, though. The guys talk more about their careers and their general ideas about programming. Quite interesting how many people use trace/printf to debug their programs.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5313918938572480298-757193817085055236?l=helpqlodhelp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://helpqlodhelp.blogspot.com/feeds/757193817085055236/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://helpqlodhelp.blogspot.com/2009/11/worth-read-coders-at-work.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/757193817085055236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/757193817085055236'/><link rel='alternate' type='text/html' href='http://helpqlodhelp.blogspot.com/2009/11/worth-read-coders-at-work.html' title='Worth a read: Coders at work'/><author><name>Ralf Bokelberg (rbokel)</name><uri>http://www.blogger.com/profile/04017353300938290017</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_AwT6QbE1L6Q/SwF4vBUo21I/AAAAAAAAAAM/yfztkzYHn3M/S220/s1393119755_30134428_2237021.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5313918938572480298.post-7916372258129376861</id><published>2009-11-16T16:43:00.001+01:00</published><updated>2009-11-19T14:02:06.995+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><title type='text'>LCDS &amp; Flex: Solution for "Duplicate session detected" error</title><content type='html'>In my current project we have a requirement which may seem strange, but still shouldn't be too hard to implement. However it tooks us a while to find out how to solve it. &lt;div&gt;&lt;br /&gt;&lt;div&gt;We have a Flex client with some secured content, which can only be accessed after a login.&lt;br /&gt;&lt;div&gt;The testers found, that after deleting the browser cookies and login again, they could no longer access any of the secured content. All we got back from the server was a "duplicate session detected" error. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The problem is, that LCDS manages its own session. So if the http session dies and gets renewed, LCDS still hangs on to its old session. Similar to a http session, the LCDS session has a id. However the id is not stored in a cookie, but in the flash player itself. It is sent to the client after the first contact to the server. You can find it in FlexClient.getInstance().id. If you set it to null before the login, the problem is fixed, because the server assigns a new id and forgets about the old session. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5313918938572480298-7916372258129376861?l=helpqlodhelp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://helpqlodhelp.blogspot.com/feeds/7916372258129376861/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://helpqlodhelp.blogspot.com/2009/11/lcds-flex-solution-for-duplicate.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/7916372258129376861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5313918938572480298/posts/default/7916372258129376861'/><link rel='alternate' type='text/html' href='http://helpqlodhelp.blogspot.com/2009/11/lcds-flex-solution-for-duplicate.html' title='LCDS &amp; Flex: Solution for &quot;Duplicate session detected&quot; error'/><author><name>Ralf Bokelberg (rbokel)</name><uri>http://www.blogger.com/profile/04017353300938290017</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://4.bp.blogspot.com/_AwT6QbE1L6Q/SwF4vBUo21I/AAAAAAAAAAM/yfztkzYHn3M/S220/s1393119755_30134428_2237021.jpg'/></author><thr:total>0</thr:total></entry></feed>
