<?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-801676594263385159</id><updated>2011-11-28T00:33:06.946+01:00</updated><category term='continuous integration'/><category term='localization'/><category term='malware'/><category term='fonts'/><category term='wow'/><category term='caf'/><category term='uitextfield'/><category term='cocoa'/><category term='firefox'/><category term='pointers'/><category term='grails'/><category term='audio'/><category term='iphone'/><category term='render'/><category term='symbolicatecrash'/><category term='crash log'/><category term='probability'/><category term='backup'/><category term='paint'/><category term='iis'/><category term='localizr'/><category term='mysql'/><category term='camera'/><category term='security'/><category term='jsunit'/><category term='leak'/><category term='cyclical references'/><category term='transformation'/><category term='lookandfeel'/><category term='ggj'/><category term='memory'/><category term='game'/><category term='flex'/><category term='tsp'/><category term='keyboard hack'/><category term='ui'/><category term='j2me'/><category term='callfuncnd'/><category term='xcode'/><category term='monopoly'/><category term='apptech'/><category term='groovy'/><category term='mac'/><category term='ssl'/><category term='certificate'/><category term='asp.net'/><category term='actions'/><category term='network'/><category term='uipagecontrol'/><category term='itunes'/><category term='subversion'/><category term='svn'/><category term='genstrings'/><category term='nextmunich'/><category term='thesis'/><category term='strange'/><category term='transactionlog'/><category term='apple'/><category term='objectivec'/><category term='unit tests'/><category term='load'/><category term='textfield'/><category term='tomcat'/><category term='windows server'/><category term='dsym'/><category term='recording'/><category term='mssql'/><category term='adobe air'/><category term='bitmapfontatlas'/><category term='opengl'/><category term='sound'/><category term='chipmunk'/><category term='shear'/><category term='text field'/><category term='nsurlconnection'/><category term='draw'/><category term='tdd'/><category term='code'/><category term='menu'/><category term='database'/><category term='ggjmuc'/><category term='macbookair'/><category term='growl'/><category term='hibernate'/><category term='cocos2d'/><category term='math'/><category term='2d'/><category term='startup'/><category term='customize'/><category term='music'/><category term='games'/><category term='hudson'/><category term='syntax highlighting'/><category term='op'/><category term='vnc'/><category term='pixel animation studio'/><category term='botnet'/><category term='properties'/><category term='sql'/><category term='copystrings'/><category term='so close'/><category term='hiero'/><category term='chance'/><category term='doh'/><title type='text'>Random Thoughts on Random Topics</title><subtitle type='html'>Anything that's too difficult to fit within 140 chars will go here.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>52</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-4839988513795716935</id><published>2010-04-20T23:29:00.003+02:00</published><updated>2010-04-20T23:51:26.054+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='games'/><category scheme='http://www.blogger.com/atom/ns#' term='localization'/><category scheme='http://www.blogger.com/atom/ns#' term='localizr'/><title type='text'>Localizr gearing up for Launch</title><content type='html'>As some of you might know, I've been pretty busy recently working on a project called &lt;a href="http://www.localizr.com/"&gt;Localizr.com&lt;/a&gt;.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Localizr's goal is to ease localization processes in the games industry. During my 10 years of work experience in the games industry, game localization has been one of the most painful tasks. Typical localization processes involve the game developer, the publisher, one or more localization agencies and their respective translators and proof readers. As the lowest common denominator, Excel files are exchanged via Email between the individual parties to transfer textual assets and localizations.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If all goes well, the developer sends a single Excel file containing all textual assets. These assets are passed on to the publisher who in turn distributes them to his localization agencies of choice. The agencies hand the files to their translators who will translate the strings and hand the strings back to the agencies. Now it's the proof-readers turn to make sure that the translations properly match the source texts. Once all texts have been proof'ed, the proof-reader hands them back to the agency, who passes them to the publisher who, finally, sends the files to the developer.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So far so good. But now assume that the file has to be amended while it's in translation. How much fun to maintain all these different file versions! Or assume that a translator slightly changes the structure of the Excel file. Is your tool chain capable enough to cope with that change? Maybe a cell is inserted at the wrong location in the Excel sheet. Who's able to make sure that source and translated text still match up?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;These are some of the reasons why I felt that there has to be a better way of localizing games. Localizr is our approach and has been well-received by both, publishers and localization agencies, during our closed beta test.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We're now gearing up for public availability of Localizr and have just launched our &lt;a href="http://www.localizr.com/"&gt;website&lt;/a&gt;. Have a look at &lt;a href="http://www.localizr.com/"&gt;Localizr.com&lt;/a&gt; and let us know what you think! Leave a comment or get in touch directly via our website or by sending a mail to bb (at) localizr.com.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'll keep you updated while we're rolling out more features on our website. Once the product is live, we'll invite you to take it for a test ride!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/801676594263385159-4839988513795716935?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/4839988513795716935/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2010/04/localizr-gearing-up-for-launch.html#comment-form' title='31 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/4839988513795716935'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/4839988513795716935'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2010/04/localizr-gearing-up-for-launch.html' title='Localizr gearing up for Launch'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><thr:total>31</thr:total></entry><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-1169461322403580823</id><published>2010-04-20T23:26:00.002+02:00</published><updated>2010-04-20T23:29:51.208+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='apptech'/><category scheme='http://www.blogger.com/atom/ns#' term='uipagecontrol'/><category scheme='http://www.blogger.com/atom/ns#' term='lookandfeel'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='customize'/><title type='text'>UIPageControl - let's customize !</title><content type='html'>Over on &lt;a href="http://apptech.next-munich.com"&gt;AppTech&lt;/a&gt; I have posted a small article about how to customize a UIPageControl so that it can be used on a white background.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;UIPageControl provides a view similar to the white dots on your iPhone's home screen for use within an app. As you might know, it only displays the dots in white so it's virtually unusable on a white background. Hop over to &lt;a href="http://apptech.next-munich.com"&gt;AppTech&lt;/a&gt; to discover how you can customize UIPageControl and leave a comment!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://apptech.next-munich.com"&gt;http://apptech.next-munich.com&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/801676594263385159-1169461322403580823?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/1169461322403580823/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2010/04/uipagecontrol-lets-customize.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/1169461322403580823'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/1169461322403580823'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2010/04/uipagecontrol-lets-customize.html' title='UIPageControl - let&apos;s customize !'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-2250110103448113433</id><published>2010-03-08T08:52:00.002+01:00</published><updated>2010-03-08T08:56:12.334+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cocos2d'/><category scheme='http://www.blogger.com/atom/ns#' term='camera'/><category scheme='http://www.blogger.com/atom/ns#' term='network'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>Network Availability and Transparent OpenGL</title><content type='html'>Two more blog posts are online on &lt;a href="http://apptech.next-munich.com"&gt;http://apptech.next-munich.com&lt;/a&gt;.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The first post goes into details on how to use the Reachability class provided by Apple to detect network availability on iPhone and iPod touch.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The second post describes my first dive into augmented reality apps. In this particular case I give some information on how to integrate an OpenGL view managed by cocos2d with the UIImagePickerController. It details where you have to modify cocos2d code to make the OpenGL view transparent - which is a requirement in case you want to overlay the camera image with the OpenGL view.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/801676594263385159-2250110103448113433?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/2250110103448113433/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2010/03/network-availability-and-transparent.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/2250110103448113433'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/2250110103448113433'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2010/03/network-availability-and-transparent.html' title='Network Availability and Transparent OpenGL'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-3963920957014857496</id><published>2010-02-10T10:31:00.002+01:00</published><updated>2010-02-10T10:32:35.350+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='recording'/><category scheme='http://www.blogger.com/atom/ns#' term='audio'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>Audio Recording</title><content type='html'>Quick post on audio recording in iPhone apps on App Tech:&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://apptech.next-munich.com/"&gt;http://apptech.next-munich.com/&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/801676594263385159-3963920957014857496?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/3963920957014857496/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2010/02/audio-recording.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/3963920957014857496'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/3963920957014857496'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2010/02/audio-recording.html' title='Audio Recording'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-5693122581229888018</id><published>2010-02-02T22:20:00.002+01:00</published><updated>2010-02-02T22:43:50.855+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ggjmuc'/><category scheme='http://www.blogger.com/atom/ns#' term='cocos2d'/><category scheme='http://www.blogger.com/atom/ns#' term='chipmunk'/><category scheme='http://www.blogger.com/atom/ns#' term='ggj'/><category scheme='http://www.blogger.com/atom/ns#' term='so close'/><title type='text'>So Close! and the Global Game Jam 2010</title><content type='html'>I don't know whether you're aware of this but last weekend saw the &lt;a href="http://globalgamejam.com/"&gt;Global Game Jam 2010&lt;/a&gt;, an event organized by the &lt;a href="http://www.igda.org/"&gt;International Game Developer Association&lt;/a&gt; promoting the development of and experimentation with the concepts of games.&lt;br /&gt;&lt;br /&gt;The Jam itself is an event held at a single weekend all around the world. People who love developing games gather for a 48 hours hackathon, creating a full-blown game from scratch. To give you an impression of what such an event is capable of: last weekend, more than 4000 people were registered as participating in the event creating a mind-boggling 900+ games in only 48 hours. Impressive, isn't it? For a full list of games developed in Munich, have a look at &lt;a href="http://globalgamejam.com/sites/mediadesign-hochschule-friends/games"&gt;our event's page&lt;/a&gt;.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For me, it was the first time I participated in GGJ - and I had hell of a good time. We met up Friday at 5pm for an initial brainstorming session which eventually led to a couple of game concepts which were pursued over the next two days. The team working on our game "&lt;a href="http://www.blogger.com/www.youtube.com/watch?v=-OQsrb8nFv4"&gt;So Close!&lt;/a&gt;" featured two Graphics Artists (Thorsten Folkers and Willi Kunth) along with our Game Design lead (Daniel Helbig of &lt;a href="http://www.r-control.de/"&gt;remote control productions&lt;/a&gt;), the Sound Masterbrain (Daniel Pharos of &lt;a href="http://knightsofsoundtrack.wordpress.com/"&gt;Knight's of Soundtrack&lt;/a&gt;) and myself starring as Coder of the Day. Once the initial game design was fixed, we started developing an initial prototype using &lt;a href="http://www.cocos2d-iphone.org/"&gt;cocos2d&lt;/a&gt; which quickly proved that our concept was indeed feasible. After a lot of initial headaches trying to get &lt;a href="http://code.google.com/p/chipmunk-physics/"&gt;Chipmunk&lt;/a&gt; (a physics / collision detections engine) to work, the platforming aspect of the game fell into place and revealed a very rewarding gameplay. We spent pretty much all of Saturday evening polishing the gameplay and added some last minute mechanics on Sunday. Unfortunately, time was too short to implement Online Highscore posting using &lt;a href="http://www.cocoslive.net/"&gt;cocoslive&lt;/a&gt; by Sunday 5pm (the official deadline) but is scheduled for inclusion. Since we really believe in this game's concept, we're even going to release the game on the AppStore later this month!&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For all you coders out there, you can grab the source code on the &lt;a href="http://globalgamejam.com/2010/so-close"&gt;official GGJ website&lt;/a&gt;. For anybody else, you can find &lt;a href="http://www.youtube.com/watch?v=-OQsrb8nFv4"&gt;video footage of the game&lt;/a&gt; on YouTube.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;GGJ has been a fun experience which I can only highly recommend to anyone who enjoys developing games or would like to have a closer look at what game development is like.&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/801676594263385159-5693122581229888018?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/5693122581229888018/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2010/02/so-close-and-global-game-jam-2010.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/5693122581229888018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/5693122581229888018'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2010/02/so-close-and-global-game-jam-2010.html' title='So Close! and the Global Game Jam 2010'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-8814501466284441137</id><published>2010-01-25T10:14:00.001+01:00</published><updated>2010-01-25T10:15:55.271+01:00</updated><title type='text'>Direct iTunes Links</title><content type='html'>Today it's time for creating proper direct iTunes links for pointing to additional content from within your App. Check out my latest post on &lt;a href="http://apptech.next-munich.com"&gt;http://apptech.next-munich.com&lt;/a&gt; for the details.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/801676594263385159-8814501466284441137?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/8814501466284441137/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2010/01/direct-itunes-links.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/8814501466284441137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/8814501466284441137'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2010/01/direct-itunes-links.html' title='Direct iTunes Links'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-1325833510418915047</id><published>2010-01-19T10:15:00.001+01:00</published><updated>2010-01-19T10:16:53.682+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ssl'/><category scheme='http://www.blogger.com/atom/ns#' term='nsurlconnection'/><category scheme='http://www.blogger.com/atom/ns#' term='certificate'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>Invalid SSL certificates</title><content type='html'>Just posted a small piece on ignoring invalid SSL certificates within an iPhone App. Be sure to head over to &lt;a href="http://apptech.next-munich.com"&gt;http://apptech.next-munich.com&lt;/a&gt; to read the article.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/801676594263385159-1325833510418915047?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/1325833510418915047/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2010/01/invalid-ssl-certificates.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/1325833510418915047'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/1325833510418915047'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2010/01/invalid-ssl-certificates.html' title='Invalid SSL certificates'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-6984502403912086176</id><published>2010-01-04T12:30:00.003+01:00</published><updated>2010-01-04T12:32:14.025+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dsym'/><category scheme='http://www.blogger.com/atom/ns#' term='symbolicatecrash'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='crash log'/><title type='text'>symbolicatecrash</title><content type='html'>For the first post in 2010, I have decided to write a small piece on Apple's &lt;code&gt;symbolicatecrash&lt;/code&gt; tool. Head over to &lt;a href="http://apptech.next-munich.com"&gt;http://apptech.next-munich.com&lt;/a&gt; to read about my findings.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/801676594263385159-6984502403912086176?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/6984502403912086176/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2010/01/symbolicatecrash.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/6984502403912086176'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/6984502403912086176'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2010/01/symbolicatecrash.html' title='symbolicatecrash'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-367734662424006099</id><published>2009-12-29T22:51:00.004+01:00</published><updated>2009-12-29T23:05:00.828+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='groovy'/><title type='text'>Grails Gotcha #1</title><content type='html'>Whenever you work in Grails and wonder why something like this is not working:&lt;br /&gt;&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: java"&gt;&lt;![CDATA[ someList.contains(someObject) ]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Check the types of objects you're trying to compare. Most likely, one of the following gotchas is keeping you busy.&lt;br /&gt;&lt;br /&gt;1. Trying to check for containment of Strings. In case you're using Groovy's support for embedding variables in a string (using "foo $bar" notation), the resulting object is of type GString not String.&lt;br /&gt;&lt;br /&gt;2. Trying to check for containment of byte-code-modified objects. Especially when working in Hibernate-environments, objects might not really be what you think they are. They are probably of a type like "MyClass__javaassited_36" where the objects in your list are of type "MyClass".&lt;br /&gt;&lt;br /&gt;You might be able to change your statement to use the convenient "any { it -&gt; // code }" method included in the &lt;a href="http://groovy.codehaus.org/groovy-jdk/"&gt;Groovy JDK&lt;/a&gt; (Object class).&lt;br /&gt;&lt;br /&gt;Hope it saves you from some of the headaches it's been giving me!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/801676594263385159-367734662424006099?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/367734662424006099/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2009/12/grails-gotcha-1.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/367734662424006099'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/367734662424006099'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2009/12/grails-gotcha-1.html' title='Grails Gotcha #1'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-5205432647667925172</id><published>2009-12-29T20:24:00.003+01:00</published><updated>2009-12-29T20:50:11.446+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vnc'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>Remote Desktop on Mac</title><content type='html'>Did you know that Mac OS X comes with a fully integrated VNC server and client for quick and easy remote desktop access? I came across the need to use remote desktop connection with my iMac at home once I was away for the holiday season. It was pretty easy to set things up on Mac OS X so here's a quick run down of what you have to do in order to get full remote desktop access to your home Mac:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Optional: Install the fantastic &lt;a href="http://www.dyndns.com/support/clients/mac.html"&gt;DynDNS client&lt;/a&gt;, enter your credentials and domain information. Your Mac can now be accessed using the domain registered at DynDNS even in case you only have a dynamic IP address.&lt;/li&gt;&lt;li&gt;In case you're behind a router, make sure you enable port forwarding to your Mac on port 5900, the default VNC port.&lt;/li&gt;&lt;li&gt;Open your Mac's system settings and open the Sharing settings.&lt;/li&gt;&lt;li&gt;Enable Screen sharing and specify which user should be allowed to login remotely.&lt;/li&gt;&lt;li&gt;You're now ready to go! Get another Mac and open the Finder. Choose "Connect with server" from the "Go to" menu and enter "vnc://&lt;the-dyn-dns-domain-or-ip-address&gt;".&lt;/li&gt;&lt;li&gt;In case things are working properly, the login form will be displayed. The user credentials are the same that you use when working with your Mac directly (ie. without a remote connection).&lt;/li&gt;&lt;/ol&gt;Obviously, you should make sure that no user accounts with empty passwords are allowed to login remotely. Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/801676594263385159-5205432647667925172?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/5205432647667925172/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2009/12/remote-desktop-on-mac.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/5205432647667925172'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/5205432647667925172'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2009/12/remote-desktop-on-mac.html' title='Remote Desktop on Mac'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-4606184601726865677</id><published>2009-12-22T14:06:00.003+01:00</published><updated>2009-12-22T14:09:15.856+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cocos2d'/><category scheme='http://www.blogger.com/atom/ns#' term='startup'/><category scheme='http://www.blogger.com/atom/ns#' term='nextmunich'/><title type='text'>NEXT Munich</title><content type='html'>We have finally created a web presence for our new iPhone / iPod touch and Android development studio. You can find our site (German only for now) at the following location:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.next-munich.com"&gt;http://www.next-munich.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I will start to move most of the tech-related topics to my new tech blog &lt;a href="http://apptech.next-munich.com"&gt;AppTech&lt;/a&gt; which is hosted on our website. I'll keep posting in English so that no reader is left behind! The first post on the new blog just presents a small piece of code which can help in case you're having flicker-issues on launch of your cocos2d-enabled application.&lt;br /&gt;&lt;br /&gt;Hope to see you on the new site!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/801676594263385159-4606184601726865677?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/4606184601726865677/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2009/12/next-munich.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/4606184601726865677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/4606184601726865677'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2009/12/next-munich.html' title='NEXT Munich'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-2302925399941208269</id><published>2009-12-12T20:14:00.002+01:00</published><updated>2009-12-12T20:20:56.462+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cocos2d'/><category scheme='http://www.blogger.com/atom/ns#' term='sound'/><category scheme='http://www.blogger.com/atom/ns#' term='caf'/><category scheme='http://www.blogger.com/atom/ns#' term='music'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>Background Music &amp; SFX on iPhone</title><content type='html'>I'm so glad that many people are sharing their findings and how they are getting things done in iPhone:&lt;br /&gt;&lt;br /&gt;First of all, there is a super-convenient set of classes in the cocos2d package that can be used for playing background music and sound FX. The only thing I have to figure out is how I can tweak these guys to stop iPod music in case the user explicitly wants to enable in-game sound. But that's probably a piece of cake, too!&lt;br /&gt;&lt;br /&gt;The next help comes from &lt;a href="http://runningaround.org/wp/2009/04/24/five-iphone-development-sound-tips/"&gt;Tinker Blog&lt;/a&gt; which lists suitable file formats and conversion commands. Essentially, iPhone allows you to play one compressed file (like MP3) and several uncompressed files in parallel. Since there's only a single hardware decoder for compressed files available, not more than a single compressed file can play at the same time, though. The idea is to take your most expoensive sound and use it as an MP3 within your application (eg background music) and convert the smaller sounds (typically sound effects) to a format like "IMA4" packed inside of a "CAF" file.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/801676594263385159-2302925399941208269?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/2302925399941208269/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2009/12/background-music-sfx-on-iphone.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/2302925399941208269'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/2302925399941208269'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2009/12/background-music-sfx-on-iphone.html' title='Background Music &amp; SFX on iPhone'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-6566049972331516496</id><published>2009-12-11T12:26:00.003+01:00</published><updated>2009-12-11T12:30:35.214+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cocos2d'/><category scheme='http://www.blogger.com/atom/ns#' term='shear'/><category scheme='http://www.blogger.com/atom/ns#' term='transformation'/><title type='text'>Shear Transformations in cocos2d</title><content type='html'>To properly map a 2d texture onto a cube, I needed a shear transformation to properly transform the texture. Cocos2d does not support shears out of the box but this &lt;a href="http://www.cocos2d-iphone.org/forum/topic/2104"&gt;piece of code suggested by codem01&lt;/a&gt; does the trick very nicely.&lt;br /&gt;&lt;br /&gt;Keep in mind that the default shear values should be 0.0 (= no shear) and values used can be both, positive and negative and are restricted in magnitude only by your application.&lt;br /&gt;&lt;br /&gt;You can find some more background on shear transformations on &lt;a href="http://mathworld.wolfram.com/Shear.html"&gt;Wolfram MathWorld&lt;/a&gt; and on &lt;a href="http://en.wikipedia.org/wiki/Shear_mapping"&gt;Wikipedia&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/801676594263385159-6566049972331516496?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/6566049972331516496/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2009/12/shear-transformations-in-cocos2d.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/6566049972331516496'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/6566049972331516496'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2009/12/shear-transformations-in-cocos2d.html' title='Shear Transformations in cocos2d'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-8012408750125658114</id><published>2009-12-10T10:34:00.002+01:00</published><updated>2009-12-10T10:37:59.198+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='doh'/><category scheme='http://www.blogger.com/atom/ns#' term='objectivec'/><title type='text'>Stupid Objective-C Mistake #1</title><content type='html'>While laying out my screen, I keep objects handy in a couple of NSArrays. Typically, I start out coding all the layouting code and retouch it once I see what's rendered on screen. Many times, objects that I try to add to my layout just do not appear - because I failed to initialize my arrays!&lt;br /&gt;&lt;br /&gt;Since in Objective-C, a message to a nil-variable just returns nil and moves on, you dont't have any indication that something might not go according to plan. Therefore this little note to self:&lt;br /&gt;&lt;br /&gt;First thing to do if things do not appear on screen, check your arrays initializations, stupid!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/801676594263385159-8012408750125658114?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/8012408750125658114/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2009/12/stupid-objective-c-mistake-1.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/8012408750125658114'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/8012408750125658114'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2009/12/stupid-objective-c-mistake-1.html' title='Stupid Objective-C Mistake #1'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-8101192785976050775</id><published>2009-12-03T20:04:00.004+01:00</published><updated>2009-12-03T20:39:44.567+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cocos2d'/><category scheme='http://www.blogger.com/atom/ns#' term='cyclical references'/><category scheme='http://www.blogger.com/atom/ns#' term='memory'/><category scheme='http://www.blogger.com/atom/ns#' term='leak'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>Leak Hunting in iPhone Code</title><content type='html'>Eventually, when you're closing in on the release candidate of the software you're working on, you're probably going to check your app for memory and performance issues.&lt;br /&gt;&lt;br /&gt;Same for me. On my current iPhone project, we're getting closer to our first beta and I felt I had neglected checking my memory usage and whether there are any apparent memory leaks in my app. Firing up Instruments, Apple's tool for analyzing Mac and iPhone software in many different ways (Memory, Disk Access, Open GL, Leaks, Core Data to name just a few), I was pretty happy with what I saw: the Leak-Detection tool did only find a couple of minor places in the code where I was leaking memory.&lt;br /&gt;&lt;br /&gt;The output of Instruments, though not very intuitive at first, helped me identify the places in my code where I was allocating and / or retaining objects which I never released when it was time for them to be released. After patching those holes only a couple of leaking places were left that did not trace back into application code but into system APIs. Good job, I thought.&lt;br /&gt;&lt;br /&gt;Coming from a Java background where I never had to spent a lot of thoughts to memory management (unless, of course, the occasional image = null; System.gc(); calls), switching to a reference-counted environment on the iPhone seemed to easy to be true. And sure enough I was going to find out that things are slightly more involved than checking the Leak tool in Instruments!&lt;br /&gt;&lt;br /&gt;My colleague discovered the issue when he kept playing the game for longer than I had ever done. At some point in time, loading one of the included mini games, the application just crashed. Memory was his first thought and I also felt like it was some problem with running out of memory. Fortunately I was able to reproduce the bug and could see memory usage increase in Instruments while navigating the game.&lt;br /&gt;&lt;br /&gt;After some time of digging for an answer I discovered an issue that was not detected by the Leak tool: cyclical references. Here I retained an object representing my scene for it to render properly while active. Within that object I created another object, however, which was retaining the scene. Once the scene was removed from screen, deallocation did not take place since the retain count of the scene did not reach 0.&lt;br /&gt;&lt;br /&gt;How did I catch that one? A good indicator is ever increasing memory usage within your application. Monitor that while running on the phone itself to get a more accurate picture of your memory's distribution between Open GL ES memory and "regular" memory. I tried to explicitly free all my textures by calling cocos2d's [[TextureMgr sharedTextureMgr] removeAllTextures] method. Since this did not free any Open GL memory at all, something was going on. Finally, I carefully tracked memory usage using the Memory instrument when taking well-defined steps within the app. Once I had discovered a point where memory did not go back to where it was supposed to be (in case all of the memory had been free'd), I added some logging to see whether the object's I wanted to be dealloc'ed really were disposed of. That step let to the discovery of the the leak - maybe this will help you find some in your code, too!&lt;br /&gt;&lt;br /&gt;Here's some sample implementation code to highlight what was happening:&lt;br /&gt;&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: objc"&gt;&lt;![CDATA[&lt;br /&gt;&lt;br /&gt;@implementation MyScene&lt;br /&gt;&lt;br /&gt;- (id) init {&lt;br /&gt;  if ((self = [super init])) {&lt;br /&gt;    // assuming "obj" is an instance variable&lt;br /&gt;    obj = [[MyObject alloc] initWithScene:self];&lt;br /&gt;  }&lt;br /&gt;  return self;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;- (void) dealloc {&lt;br /&gt;  [obj release];&lt;br /&gt;  [super dealloc];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;@implementation MyObject&lt;br /&gt;&lt;br /&gt;- (id) initWithScene:(MyScene*)s {&lt;br /&gt;  if ((self = [super init])) {&lt;br /&gt;    // assuming "scene" is an instance variable&lt;br /&gt;    scene = [s retain];&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  return self;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;- (void) dealloc {&lt;br /&gt;  [scene release];&lt;br /&gt;  [super dealloc];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@end&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;This code kind of looks ok at first but soon you'll notice, that MyScene is never going to be dealloc'ed unless you explicitly call its' release selector &lt;span style="font-style:italic;"&gt;twice&lt;/span&gt; somewhere outside of this code (which is going to lead to other problems - so &lt;span style="font-style:italic;"&gt;don't&lt;/span&gt; do this!).&lt;br /&gt;&lt;br /&gt;Assume the following code to understand why this is happening:&lt;br /&gt;&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: objc"&gt;&lt;![CDATA[&lt;br /&gt;&lt;br /&gt;- (void) someMethod {&lt;br /&gt;  MyScene* scene = [[MyScene alloc] init];&lt;br /&gt;&lt;br /&gt;  [scene release];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@end&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;As you will probably know from Apple's documentation, whenever you're using alloc / init to create an instance of a class, you've implicitly retained the object. You have to explicitly release the object to properly dispose of the object. Now pay attention to the object's retain count:&lt;br /&gt;&lt;br /&gt;1. The call to [[MyScene alloc] init] gives you an implicit retain count of 1.&lt;br /&gt;2. Additionally, MyObject retains the allocated scene thus increasing its' retain count to 2.&lt;br /&gt;3. Once [scene release] is called, the retain count is reduced to 1.&lt;br /&gt;&lt;br /&gt;As you can see, the retain count is not going down to 0 as it should because of the retain by MyObject. Since MyObject only releases its' reference to MyScene in dealloc, this is not going to happen unless you explicitly send the MyObject instance the release selector.&lt;br /&gt;&lt;br /&gt;The easy fix: if MyObject only lives as long as the scene is living, just don't retain the scene. It's going to be alive as long as MyObject is alive so there is not going to be a problem.&lt;br /&gt;&lt;br /&gt;If you think this is happening to you, too, make sure you log the retain count of the object in question at appropriate times (whenever you think this object should be dealloc'ed but isn't). You can do this with a single line of code:&lt;br /&gt;&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: objc"&gt;&lt;![CDATA[&lt;br /&gt;&lt;br /&gt;- (void) someMethod {&lt;br /&gt;  NSLog(@"retain count of %@ is: %d", object, [object retainCount]);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@end&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Hope this helps you find the pesky cyclical memory leaks. When is there going to be an app for that, too?&lt;br /&gt;&lt;br /&gt;Did you find any other common patterns of leaks that are not detected by Instruments? Share your findings in the comments! I'm surely going to be thankful but so are probably all the other readers / Google users.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/801676594263385159-8101192785976050775?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/8101192785976050775/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2009/12/leak-hunting-in-iphone-code.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/8101192785976050775'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/8101192785976050775'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2009/12/leak-hunting-in-iphone-code.html' title='Leak Hunting in iPhone Code'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-1611659043989708721</id><published>2009-11-27T09:52:00.003+01:00</published><updated>2009-11-27T09:53:59.037+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cocos2d'/><category scheme='http://www.blogger.com/atom/ns#' term='uitextfield'/><category scheme='http://www.blogger.com/atom/ns#' term='textfield'/><category scheme='http://www.blogger.com/atom/ns#' term='text field'/><title type='text'>TextField update</title><content type='html'>There was a small bug inside the TextField code with regards to accessing the latest strings in textFieldUpdated method. The protocol has been adapted to reflect this.&lt;br /&gt;&lt;br /&gt;Updates are available &lt;a href="http://next-munich.com/code/SampleTextField.zip"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/801676594263385159-1611659043989708721?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/1611659043989708721/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2009/11/textfield-update.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/1611659043989708721'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/1611659043989708721'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2009/11/textfield-update.html' title='TextField update'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-7838157284369510967</id><published>2009-11-25T23:01:00.004+01:00</published><updated>2009-11-25T23:18:58.236+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cocos2d'/><category scheme='http://www.blogger.com/atom/ns#' term='uitextfield'/><category scheme='http://www.blogger.com/atom/ns#' term='textfield'/><category scheme='http://www.blogger.com/atom/ns#' term='ui'/><category scheme='http://www.blogger.com/atom/ns#' term='text field'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>The Quest to implement a custom Text Field</title><content type='html'>To match the UI of the App I'm working on right now, I needed a text field with a custom look and feel that would nicely integrate with cocos2d.&lt;br /&gt;&lt;br /&gt;I thought there must've been someone out there who has already accomplished / implemented something like this but after a while of google'ing and browing the cocos2d forums, I figured that there seems to be no final, working source code of something like this available.&lt;br /&gt;&lt;br /&gt;With some help from this post by &lt;a href="http://stackoverflow.com/questions/693483/textfield-example-in-cocos2d"&gt;Jack and David&lt;/a&gt; (and some other stuff I don't seem to be able to remember), I eventually managed to code something myself which combines the rendering abilities of cocos2d (Sprites and BitmapFontAtlas) with the input capabilities of UITextField. This sure feels like a hack as I'm using an "invisible" (read: very tiny) UITextField to handle the text input while rendering the intercepted text using BitmapFontAtlas and some other Sprites but - hey - it works just fine.&lt;br /&gt;&lt;br /&gt;I'll check with the people at cocos2d whether it would be worthwhile to include such a class in the main distribution. In the meantime, the &lt;a href="http://next-munich.com/code/SampleTextField.zip"&gt;files are available here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Here's how you'd use the TextField class in your own projects:&lt;br /&gt;&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: objc"&gt;&lt;![CDATA[&lt;br /&gt;&lt;br /&gt;- (void) setUpTextField {&lt;br /&gt;  TextFiel tf = [TextField textField];&lt;br /&gt;  tf.delegate = self;&lt;br /&gt;  tf.position = ccp(x, y);&lt;br /&gt;  [self addChild:tf];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// TextFieldDelegate event methods&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * Invoked right before editing starts and the keyboard slides in. In case the&lt;br /&gt; * TextField is obscured by the keyboard, this method should be used to move the&lt;br /&gt; * TestField to a position where it is visible while the user is editing its&lt;br /&gt; * contents.&lt;br /&gt; */&lt;br /&gt;- (void) textFieldBeforeEditing:(TextField*)textField { }&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * Invoked before the text in the TextField is updated. In case you'd like to&lt;br /&gt; * restrict the text that can be entered in the TextField, this method can be&lt;br /&gt; * used to check for your individual constraints.&lt;br /&gt; *&lt;br /&gt; * @return YES, if the text is accepted. NO, if the text is not allowed for the&lt;br /&gt; *		   TextField.&lt;br /&gt; */&lt;br /&gt;- (BOOL) textField:(TextField*)textField shouldAcceptText:(NSString*)string {&lt;br /&gt;  // just a sample: restrict string to a max length of 10 characters&lt;br /&gt;  return [string count] &lt;= 10;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * Invoked right after the text in the TextField was updated. Should be used to&lt;br /&gt; * store the TextField's value in case you need the updated value immediately.&lt;br /&gt; */&lt;br /&gt;- (void) textFieldChanged:(TextField*)textField {&lt;br /&gt;  NSLog(@"text updated: %@", textField.text);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * Invoked right after editing finished and before the keyboard slides out. In&lt;br /&gt; * case the TextField was obscured by the keyboard and was moved to a different&lt;br /&gt; * position in textFieldBeforeEditing, this method should be used to move the&lt;br /&gt; * TextField back to its original position.&lt;br /&gt; */&lt;br /&gt;- (void) textFieldAfterEditing:(TextField*)textField { }&lt;br /&gt;&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Hope this gets you going much quicker than me! Now enjoy the code and let me know what you think!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/801676594263385159-7838157284369510967?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/7838157284369510967/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2009/11/quest-to-implement-custom-text-field.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/7838157284369510967'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/7838157284369510967'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2009/11/quest-to-implement-custom-text-field.html' title='The Quest to implement a custom Text Field'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-3357942824939122958</id><published>2009-11-23T15:56:00.002+01:00</published><updated>2009-11-23T16:03:13.024+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cocos2d'/><category scheme='http://www.blogger.com/atom/ns#' term='fonts'/><category scheme='http://www.blogger.com/atom/ns#' term='bitmapfontatlas'/><title type='text'>Line-break code for BitmapFontAtlas available</title><content type='html'>I finally got around to submitting my cocos2d enhancement for BitmapFontAtlas to the cocos2d for iPhone issue tracker. The respective &lt;a href="http://code.google.com/p/cocos2d-iphone/issues/detail?id=637"&gt;issue #637&lt;/a&gt; contains the modified source code and is up for grabs if you can't wait to give this thing a try.&lt;br /&gt;&lt;br /&gt;Here's a quick snippet of sample code for you to better understand how to use the added features:&lt;br /&gt;&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: objc"&gt;&lt;![CDATA[&lt;br /&gt;&lt;br /&gt;NSString* str = @"This is a string which is fairly long and must be wrapped to fit within the label. It might even break to a second page. You can find the amount of pages which were produced by this string by querying the label.";&lt;br /&gt;&lt;br /&gt;BitmapFontAtlas* label = [BitmapFontAtlas bitmapFontAtlasWithString:str size:CGSizeMake(100, 50) fntFile:@"myFont.fnt"];&lt;br /&gt;&lt;br /&gt;// finds the amount of pages in the label&lt;br /&gt;int numPages = label.pages;&lt;br /&gt;&lt;br /&gt;// finds the current page of the label (0 after initialization)&lt;br /&gt;int currentPage = label.page;&lt;br /&gt;&lt;br /&gt;// display the next page (if available)&lt;br /&gt;if (currentPage + 1 &lt; numPages) label.page++;&lt;br /&gt;&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Let me know in case you're having problems with the code or in case something's unclear. Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/801676594263385159-3357942824939122958?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/3357942824939122958/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2009/11/line-break-code-for-bitmapfontatlas.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/3357942824939122958'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/3357942824939122958'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2009/11/line-break-code-for-bitmapfontatlas.html' title='Line-break code for BitmapFontAtlas available'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-1536215102155332872</id><published>2009-11-12T17:58:00.002+01:00</published><updated>2009-11-12T18:02:31.847+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='syntax highlighting'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><title type='text'>Code Snippets in Blogger posts</title><content type='html'>Finally got around to installing the awesome syntax highlighter on my blog thanks to the post by &lt;a href="http://blog.cartercole.com/2009/10/awesome-syntax-highlighting-made-easy.html"&gt;Carter Cole&lt;/a&gt;. I had to go hunt around for the Objective-C brush which you can copy and paste to a JS file on &lt;a href="http://alexgorbatchev.com/forums/comments.php?DiscussionID=27&amp;amp;page=1#Item_0"&gt;this page&lt;/a&gt; (the download link on the list of brushes did appear to point to a brush for Lua).&lt;br /&gt;&lt;br /&gt;And this is what it looks like - pretty neat, huh?&lt;br /&gt;&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: objc"&gt;&lt;![CDATA[&lt;br /&gt;- (void) onEnter {&lt;br /&gt;  NSLog(@"Hello World");&lt;br /&gt;} &lt;br /&gt;]]&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/801676594263385159-1536215102155332872?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/1536215102155332872/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2009/11/code-snippets-in-blogger-posts.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/1536215102155332872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/1536215102155332872'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2009/11/code-snippets-in-blogger-posts.html' title='Code Snippets in Blogger posts'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-7442301918130858685</id><published>2009-11-12T17:05:00.002+01:00</published><updated>2009-11-12T17:08:12.299+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='growl'/><category scheme='http://www.blogger.com/atom/ns#' term='cocoa'/><category scheme='http://www.blogger.com/atom/ns#' term='hudson'/><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><title type='text'>Growl-based Hudson notifier</title><content type='html'>Since the Java-based notifier wasn't working properly for me, I quickly played around with a Cocoa-based notifier for Hudson. The result is a small piece of code that is neither properly refactored nor very clean.&lt;br /&gt;&lt;br /&gt;It does its job, though, and that's why I felt like open source'ing it. Maybe somebody would like to help me flesh out the tool? The source code is hosted at Google Code:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/hudson-on-cocoa/"&gt;http://code.google.com/p/hudson-on-cocoa/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/801676594263385159-7442301918130858685?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/7442301918130858685/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2009/11/growl-based-hudson-notifier.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/7442301918130858685'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/7442301918130858685'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2009/11/growl-based-hudson-notifier.html' title='Growl-based Hudson notifier'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-3036453153106141519</id><published>2009-11-12T15:37:00.005+01:00</published><updated>2009-11-12T16:07:13.695+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cocos2d'/><category scheme='http://www.blogger.com/atom/ns#' term='hiero'/><category scheme='http://www.blogger.com/atom/ns#' term='fonts'/><category scheme='http://www.blogger.com/atom/ns#' term='bitmapfontatlas'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>Enhanced Fonts in cocos2d</title><content type='html'>One thing I came across in cocos2d was an issue with the font rendering. Since the fonts produced by &lt;a href="http://slick.cokeandcode.com/demos/hiero.jnlp"&gt;Hiero bitmap font editor&lt;/a&gt; are very tightly packed on their containing images, rendering artefacts can appear when cocos2d displays the characters on screen.&lt;br /&gt;&lt;br /&gt;Several people have reported these issues but I did not find a solution that fixes the problem in all cases. For that reason I have slightly amended the Hiero bitmap font editor: the modified editor outputs the fonts with more space between individual characters and amending the characters rectangles in the font definition files. This works very well and fixes the issue for me. I'll try to get in touch with Hiero's maintainer (who seems to be &lt;a href="http://slick.cokeandcode.com"&gt;this guy&lt;/a&gt;) and will check whether there is any chance of having this feature integrated into the official version of the editor.&lt;br /&gt;&lt;br /&gt;Another thing relating to fonts is the calculation of a string's width and, based on these calculations, a proper algorithm for line and page breaking. As I did not find such a facility within cocos2d source code, I enhanced the &lt;span style="font-family:courier new;"&gt;BitmapFontAtlas&lt;/span&gt; class to provide all of these. Basically, before calling &lt;span style="font-family:courier new;"&gt;[label setString:@""]&lt;/span&gt; to set the text for a label, you can assign a size to the label using&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;label.size = CGSizeMake(width, height);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If such a size has been assigned, a call to&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;[label setString:@"A very long string with reeeeeaaaaalllllllyyyyyyyyyyyyyyyyyyy long words and\nforced line breaks."];&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;will split the string according to the given size. The string will first be divided into lines (obeying the maximum width assigned earlier), then into pages (additionally obeying the maximum height). The first page will then be used as the string displayed by the label.&lt;br /&gt;&lt;br /&gt;To choose a different page and figure out the amount of pages available within the label, you can then use the properties &lt;span style="font-family:courier new;"&gt;label.currentPage&lt;/span&gt; and &lt;span style="font-family:courier new;"&gt;label.pages&lt;/span&gt; respectively. If you assume that you want to switch to page 1 and this is within the amount of pages available, you can just assign &lt;span style="font-family:courier new;"&gt;label.page = 1&lt;/span&gt; and be done.&lt;br /&gt;&lt;br /&gt;If you don't assign a size before your call to [label setString:@""], the text is going to be rendered as with the unmodified version of &lt;span style="font-family:courier new;"&gt;BitmapFontAtlas&lt;/span&gt;. The only added benefit is that forced line-breaks using &lt;span style="font-family:courier new;"&gt;@"\n"&lt;/span&gt; are supported.&lt;br /&gt;&lt;br /&gt;For this change, too, I'll try to contribute back to the cocos2d project. I will keep you updated!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/801676594263385159-3036453153106141519?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/3036453153106141519/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2009/11/enhanced-fonts-in-cocos2d.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/3036453153106141519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/3036453153106141519'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2009/11/enhanced-fonts-in-cocos2d.html' title='Enhanced Fonts in cocos2d'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-5457026584396563414</id><published>2009-11-06T09:35:00.002+01:00</published><updated>2009-11-06T09:54:20.296+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hibernate'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='mssql'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>Databases: Reserved Keywords</title><content type='html'>With technologies like Hibernate, deployment of database-driven application should've become a no-brainer: change the driver, change the DataSource's configuration in some XML file and off you go!&lt;br /&gt;&lt;br /&gt;Reality is slightly different: a Grails-based web-application we're working on right now is configured for three different databases - depending on the system we're deploying to. During development, it's configured to use an in-memory HSQLDB. When working in development mode, things just work - there has not been a single reserver-keyword hickup so far.&lt;br /&gt;&lt;br /&gt;For production, we have two different databases that we can test on: MS SQL Server 2005 and MySQL. For MS SQL Server 2005, first-time deployment has been a pain. During schema generation only the first error is that occurs is reported in the logs and thus we had to perform a couple of deploy -&gt; bugfix -&gt; deploy -&gt; ... cycles as a couple of issues with reserved keywords popped up.&lt;br /&gt;&lt;br /&gt;In MySQL, things have been going pretty well with no need to change mapping because of keywords. Just yesterday, however, I added a new field to one of our domain classes and ran into the first keyword issue on MySQL, too.&lt;br /&gt;&lt;br /&gt;Now here's the list of keywords you need to avoid while working on the different databases. I'll try to keep this up-to-date as I encounter more such issues.&lt;br /&gt;&lt;br /&gt;MS SQL Server 2005&lt;br /&gt;&lt;ul&gt;&lt;li&gt;"user" - Won't be accepted as table name in schema generation&lt;br /&gt;&lt;/li&gt;&lt;li&gt;"rule" - Won't be accepted as table name in schema generation&lt;/li&gt;&lt;/ul&gt;MySQL 5.1&lt;br /&gt;&lt;ul&gt;&lt;li&gt;"key" - Even though this keyword can be used as a column name in schema creation, adding to the table with an "insert into" will lead to an unhelpful 'you have a syntax error near ...' SQLGrammarException to be thrown&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Which brings me to another question? Why does the Hibernate database dialect not automatically prevent these keywords to be used in mappings and provide replacement values? The dialect could, for example, prefix every known reserved keyword with a "_" character - deployment problem solved.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/801676594263385159-5457026584396563414?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/5457026584396563414/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2009/11/databases-reserved-keywords.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/5457026584396563414'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/5457026584396563414'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2009/11/databases-reserved-keywords.html' title='Databases: Reserved Keywords'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-4930305942938597594</id><published>2009-11-01T20:01:00.006+01:00</published><updated>2009-11-01T20:21:03.842+01:00</updated><title type='text'>My first barcamp</title><content type='html'>Yesterday I participated in my first barcamp. To be honest, I broke one of the most important rules about barcamps but more on that later.&lt;br /&gt;&lt;br /&gt;The mobile devcamp Munich 2009 - or #mdc09 for short - took place at the Intel offices in Feldkirchen on Saturday. As I didn't know anything about barcamps until that day, here's a brief run down of what happened for anybody interested in visiting a barcamp one of these days.&lt;br /&gt;&lt;br /&gt;Basically a barcamp is this event where loads of people show up, quickly introduce themselves (by the ritual, everyone's allowed to only give their name and three keywords or tags) and self-organize a day full of sessions on a broad range of topics. Whoever is ready to give a session enters the stage, briefly describes what they are going to talk about and asks for a show of hands indicating people's interest in the topic. In #mdc09's case, about 15 - 20 people gave a session and rooms were allocated based on the interest of the general public in these sessions. The sessions themselves are very casual and are not at all like the classic speeches that you'll know from conferences. Participation in the session is hugely encouraged - which leads to very fruitful discussions!&lt;br /&gt;&lt;br /&gt;Besides all the sessions, the people who show up at a barcamp are really great! Everybody has a story and a lot of insights to share. People are very approachable and open to meet and greet.&lt;br /&gt;&lt;br /&gt;Maybe I was a very lucky first-timer at a barcamp and things just went especially well. Still, if the next barcamp is only half as interesting it's going to be a big win! So in case you're interested, go visit a barcamp whenever you get the chance. You won't regret it!&lt;br /&gt;&lt;br /&gt;Regarding the broken rule: there are a couple of rules encouraging participation in a barcamp. Amongst others, first-timers are supposed to give a session themselves during the first barcamp they visit. So ... I did not make it this far but am very much prepared to do so at the next barcamp I'll attend. To learn more about the other rules of barcamps, go visit &lt;a href="http://www.flobbymedia.de/blog/2009/07/21/unkonferenzen-als-erfolgsmodell/"&gt;@flobby's blog&lt;/a&gt; (German).  For upcoming barcamps in your area, have a look at the official &lt;a href="http://www.barcamp.org/"&gt;barcamp wiki&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Now, go, enjoy your first barcamp!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/801676594263385159-4930305942938597594?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/4930305942938597594/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2009/11/my-first-barcamp.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/4930305942938597594'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/4930305942938597594'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2009/11/my-first-barcamp.html' title='My first barcamp'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-5423087295868008925</id><published>2009-10-30T20:54:00.003+01:00</published><updated>2009-11-12T17:58:20.225+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cocos2d'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='actions'/><title type='text'>Running Actions in cocos2d during onEnter</title><content type='html'>I just discovered a requirement in the onEnter method when you try to run a duration-based Action in cocos2d. Whenever you're trying to do something like this within the onEnter method of a subclass of Layer:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;[node runAction:[FadeIn actionWithDuration:1]];&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;make sure you call the super class' onEnter method. Otherwise the action will not perform what you try to achieve. Working code looks like this:&lt;br /&gt;&lt;br /&gt;&lt;script type="syntaxhighlighter" class="brush: objc"&gt;&lt;![CDATA[&lt;br /&gt;- (void) onEnter {&lt;br /&gt;  [super onEnter];&lt;br /&gt;  [node runAction:[FadeIn actionWithDuration:1]];&lt;br /&gt;}&lt;br /&gt;]]&gt;&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;Hope this helps someone and saves some time!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/801676594263385159-5423087295868008925?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/5423087295868008925/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2009/10/running-actions-in-cocos2d-during.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/5423087295868008925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/5423087295868008925'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2009/10/running-actions-in-cocos2d-during.html' title='Running Actions in cocos2d during onEnter'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-6716531553027008372</id><published>2009-10-29T00:49:00.003+01:00</published><updated>2009-10-29T00:58:24.335+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cocos2d'/><category scheme='http://www.blogger.com/atom/ns#' term='callfuncnd'/><category scheme='http://www.blogger.com/atom/ns#' term='pointers'/><category scheme='http://www.blogger.com/atom/ns#' term='objectivec'/><title type='text'>Note to Self on Void Pointers and CallFuncND</title><content type='html'>This is no news to anyone except for people who have never been exposed to void pointers (void*) before. Coming from a Java-background, I never had the opportunity (or dare I say hassle) to deal with pointers, obtaining memory addresses and de-referencing those. Whenever I was confronted with C / C++, I tried my best not to dive too deep into that matter.&lt;br /&gt;&lt;br /&gt;Now in Objective C, I finally wanted to get rid of a compiler warning I was getting because I was dealing with void* as a data type. Basically, void* is a pointer to some data in memory of which the type is unknown to the compiler. Therefore, any address to some data in memory can be stuffed into a variable of type void*. Both of the following is valid:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;void* data;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;int i = 5;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;float f = 6.5;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;data = &amp;i; // first assignment: works&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;data = &amp;f; // second assignment: works, too&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now to get back to the data you stuffed inside, you cannot just de-reference it just like that. You need to cast it to the proper pointer type of the data that is stored at the particular address you're pointing to. In other words, you'd have to do the following (continuing the code above):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;int* iPtr = (int*) data; // if data contains &amp;amp;i&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;float* fPtr = (float*) data; // if data contains &amp;amp;f&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Since cocos2d uses void* as the data type to piggy-back any kind of user data within a &lt;span style="font-family: courier new;"&gt;CallFuncND&lt;/span&gt; action, I at least had to get that straight!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/801676594263385159-6716531553027008372?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/6716531553027008372/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2009/10/note-to-self-on-void-pointers-and.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/6716531553027008372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/6716531553027008372'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2009/10/note-to-self-on-void-pointers-and.html' title='Note to Self on Void Pointers and CallFuncND'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-5471556550495990418</id><published>2009-10-18T21:51:00.004+02:00</published><updated>2009-10-19T02:58:35.216+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><category scheme='http://www.blogger.com/atom/ns#' term='tomcat'/><title type='text'>Mac OS X auto-starting Tomcat</title><content type='html'>To complete my dive into continuous integration with Hudson I wanted to have Tomcat (the Servlet Container of choice) auto-run in the background on my Mac box.&lt;br /&gt;&lt;br /&gt;First of all, download the latest Tomcat distribution from the &lt;a href="http://tomcat.apache.org/"&gt;project's homepage&lt;/a&gt;. Now change the script files in its "&lt;span style="font-family:courier new;"&gt;bin&lt;/span&gt;" directory so that they can be executed using "&lt;span style="font-family:courier new;"&gt;chmod +x *.sh&lt;/span&gt;". This is all you have to do to get a working copy of Tomcat on your system. Give it a spin by executing the startup shell script and navigating to "&lt;span style="font-family:courier new;"&gt;http://localhost:8080/&lt;/span&gt;". You will already notice that the startup will cause an icon to appear in your dock that you might rather not want to see (first of all it's ugly and clutters the dock and secondly, it doesn't provide much functionality anyways). We'll get rid of that icon a little later.&lt;br /&gt;&lt;br /&gt;Now to have Tomcat startup automatically on system start, you have to create an entry in "&lt;span style="font-family:courier new;"&gt;/Library/StartupItems&lt;/span&gt;". By default, the directory is protected and you're not allowed to copy anything here. Use the Finder to change the permissions of the directory and grant yourself rights to read and write the directory. Now create a new directory "&lt;span style="font-family:courier new;"&gt;Tomcat&lt;/span&gt;" and place the following two files inside.&lt;br /&gt;&lt;br /&gt;File "&lt;span style="font-family:courier new;"&gt;Tomcat&lt;/span&gt;":&lt;br /&gt;&lt;blockquote style="font-family: courier new;"&gt;#!/bin/sh&lt;br /&gt;&lt;br /&gt;. /etc/rc.common&lt;br /&gt;&lt;br /&gt;export CATALINA_HOME=/Applications/apache-tomcat-6.0.20&lt;br /&gt;export JAVA_OPTS=-Djava.awt.headless=true&lt;br /&gt;&lt;br /&gt;StartService ()&lt;br /&gt;{&lt;br /&gt;ConsoleMessage "Starte Tomcat Server"&lt;br /&gt;su &lt;useraccount&gt; -c $CATALINA_HOME/bin/startup.sh&lt;br /&gt;}&lt;br /&gt;StopService ()&lt;br /&gt;{&lt;br /&gt;ConsoleMessage "Stoppe Tomcat Server"&lt;br /&gt;su &lt;useraccount&gt; -c $CATALINA_HOME/bin/shutdown.sh&lt;br /&gt;}&lt;br /&gt;RestartService ()&lt;br /&gt;{&lt;br /&gt;ConsoleMessage "Starte Tomcat Server erneut"&lt;br /&gt;su &lt;useraccount&gt; -c $CATALINA_HOME/bin/shutdown.sh&lt;br /&gt;su &lt;useraccount&gt; -c $CATALINA_HOME/bin/startup.sh&lt;br /&gt;}&lt;br /&gt;RunService "$1"&lt;/blockquote&gt;where you substitute "&lt;span style="font-family: courier new;"&gt;&lt;useraccount&gt;&lt;/span&gt;" for the user account that should be used for building your iPhone app (the name of your home directory should work). This setting is crucial as Xcode will not build your project unless your running build as the user whose key chain contains the iPhone developer certificate. If you're trying to build using a different account you will get error messages saying that a suitable provisioning profile could not be found.&lt;br /&gt;&lt;br /&gt;File "&lt;span style="font-family:courier new;"&gt;StartupParameters.plist&lt;/span&gt;":&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_NedfMz-IFO8/Stt3M8vwQaI/AAAAAAAAABU/blGQpSAyDgU/s1600-h/startupparameters.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 234px;" src="http://1.bp.blogspot.com/_NedfMz-IFO8/Stt3M8vwQaI/AAAAAAAAABU/blGQpSAyDgU/s400/startupparameters.png" alt="" id="BLOGGER_PHOTO_ID_5394036043054858658" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/blockquote&gt;These files will allow Tomcat to automatically launch when the system starts. To make this work, give execution rights to the file "&lt;span style="font-family:courier new;"&gt;Tomcat&lt;/span&gt;" using "&lt;span style="font-family:courier new;"&gt;chmod +x Tomcat&lt;/span&gt;" in directory "&lt;span style="font-family:courier new;"&gt;/Library/StartupItems/Tomcat&lt;/span&gt;". Now change the ownership of the files and their folder using the command "&lt;span style="font-family:courier new;"&gt;chmod -R -v 0:0 Tomcat&lt;/span&gt;" in directory"&lt;span style="font-family:courier new;"&gt;/Library/StartupItems&lt;/span&gt;". This will give ownership of the files and the directory to root - a requirement by the service launcher.&lt;br /&gt;&lt;br /&gt;You can now test whether things went smoothly by executing the command "&lt;span class="code"&gt;&lt;span style="font-family:courier new;"&gt;sudo SystemStarter start Tomcat&lt;/span&gt;"&lt;/span&gt;. If things go well you will notice that no icon appears in your dock on launch. This is due to the Java parameter "&lt;span style="font-family:courier new;"&gt;-Djava.awt.headless=true&lt;/span&gt;" that we specified in the script "&lt;span style="font-family:courier new;"&gt;Tomcat&lt;/span&gt;" above. If you would like to keep the icon, just comment the line using a "&lt;span style="font-family:courier new;"&gt;#&lt;/span&gt;".&lt;br /&gt;&lt;br /&gt;If things do not go well it's most likely due to some missing permissions. Check the logs in the utility application "&lt;span style="font-family:courier new;"&gt;Console&lt;/span&gt;" that you can find in "&lt;span style="font-family:courier new;"&gt;/Applications/Utiltities&lt;/span&gt;".&lt;br /&gt;&lt;br /&gt;This post followed the &lt;a href="http://mac.delta-c.de/node/37"&gt;German description by Kai Surendorf&lt;/a&gt; and adjusted things where appropriate. The "java.awt.headless" tweak was found on &lt;a href="http://www.highlevelbits.com/2009/10/avoid-dock-icon-for-java-processes-on.html"&gt;Hardy Ferentschik's blog&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Now I'm off to write a small Hudson/Growl integration app since the &lt;a href="http://wiki.hudson-ci.org/display/HUDSON/hudsonTracker"&gt;Java-based notifier available on Hudson's site&lt;/a&gt; didn't seem to properly invoke Growl on my machine. Maybe the recent Growl update or Snow Leopard broke the tool.&lt;br /&gt;&lt;br /&gt;Stay tuned!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/801676594263385159-5471556550495990418?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/5471556550495990418/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2009/10/mac-os-x-auto-starting-tomcat.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/5471556550495990418'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/5471556550495990418'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2009/10/mac-os-x-auto-starting-tomcat.html' title='Mac OS X auto-starting Tomcat'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_NedfMz-IFO8/Stt3M8vwQaI/AAAAAAAAABU/blGQpSAyDgU/s72-c/startupparameters.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-6153082094995436933</id><published>2009-10-18T20:55:00.002+02:00</published><updated>2009-10-18T21:02:11.330+02:00</updated><title type='text'>Follow-up on Versioning</title><content type='html'>While working with Hudson today and trying to get a CI server up for automated iPhone builds, I came across an &lt;a href="http://www.innerexception.com/2008/10/iphone-app-version-and-build-numbers.html"&gt;article by Dave Murdock&lt;/a&gt; regarding versioning of iPhone apps. Turns out I did things slightly different to what is the - apparently - recommended behaviour:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Use "CFBundleVersion" for your build number&lt;/li&gt;&lt;li&gt;Use "CFBundleShortVersionString" for a version number like "0.1"&lt;/li&gt;&lt;li&gt;Concatenate those strings within your application&lt;/li&gt;&lt;/ol&gt;This approach seems to be the standard behaviour in Mac OS X applications.&lt;br /&gt;&lt;br /&gt;For integration with Hudson it also became apparent that updating the version number on Hudson builds using Apple's &lt;code&gt;agvtool&lt;/code&gt; from within the Hudson build script was very straight forward and did not require additional files. So I'm basically using the Hudson build script as outlined by &lt;a href="http://nachbaur.com/blog/how-to-automate-your-iphone-app-builds-with-hudson"&gt;Michael&lt;/a&gt; with the versioning setup explained by &lt;a href="http://www.innerexception.com/2008/10/iphone-app-version-and-build-numbers.html"&gt;Dave&lt;/a&gt;. Sweet!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/801676594263385159-6153082094995436933?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/6153082094995436933/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2009/10/follow-up-on-versioning.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/6153082094995436933'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/6153082094995436933'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2009/10/follow-up-on-versioning.html' title='Follow-up on Versioning'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-6794018431640085884</id><published>2009-10-18T16:18:00.003+02:00</published><updated>2009-10-18T16:25:03.654+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='unit tests'/><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><title type='text'>iPhone and Unit Tests</title><content type='html'>Finally, following a &lt;a href="http://www.luisdelarosa.com/2009/02/17/is-iphone-unit-testing-possible/"&gt;series of posts&lt;/a&gt; on Luis de la Rosa's blog, I have &lt;a href="http://code.google.com/p/google-toolbox-for-mac/"&gt;Google Toolbox for Mac&lt;/a&gt; up and running my Unit Tests for iPhone.&lt;br /&gt;&lt;br /&gt;Here's a quick note in case you choose to download the latest code from SVN instead of downloading the pre-packaged v1.5.1 from Luis' page: in addition to the files he copies to the sample project, you need to copy two additional files, "&lt;span style="font-family: courier new;"&gt;GTMObjC2Runtime.h&lt;/span&gt;" and "&lt;span style="font-family: courier new;"&gt;GTMObjC2Runtime.m&lt;/span&gt;", into your "UnitTestFramework" group within Xcode. With these files included, your build of the UnitTest target will work successfully.&lt;br /&gt;&lt;br /&gt;Now having a look at the &lt;a href="http://nachbaur.com/blog/how-to-automate-your-iphone-app-builds-with-hudson"&gt;continuous integration suggestions&lt;/a&gt; by Michael Nachbaur. Let's see whether I can get a Hudson instance running and packaging both, my test targets and the final application.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/801676594263385159-6794018431640085884?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/6794018431640085884/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2009/10/iphone-and-unit-tests.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/6794018431640085884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/6794018431640085884'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2009/10/iphone-and-unit-tests.html' title='iPhone and Unit Tests'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-3484101413099068505</id><published>2009-10-15T16:30:00.002+02:00</published><updated>2009-10-15T16:33:45.415+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xcode'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>Automatic version numbering in Xcode</title><content type='html'>Here's a nice piece on automatic version numbering from within Xcode. &lt;a href="http://blog.massanti.com/2009/09/20/automatic-build-numbering-increase-with-xcode/"&gt;The article&lt;/a&gt; details almost all the work you have to perform to get automatic versioning up and running.&lt;br /&gt;&lt;br /&gt;Here are the missing pieces:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Place the Xcode config file in the root of your project.&lt;/li&gt;&lt;li&gt;In your Info.plist file change the value for "Bundle version" to something like "0.1 (${CURRENT_PROJECT_VERSION})" - depending on your choice for the variable in the config file.&lt;/li&gt;&lt;/ol&gt;With those two things in place, versioning should be up and running in no time. Thanks, Diego!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/801676594263385159-3484101413099068505?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/3484101413099068505/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2009/10/automatic-version-numbering-in-xcode.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/3484101413099068505'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/3484101413099068505'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2009/10/automatic-version-numbering-in-xcode.html' title='Automatic version numbering in Xcode'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-2709733021953572790</id><published>2009-10-09T20:06:00.003+02:00</published><updated>2009-10-09T20:58:08.789+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='windows server'/><category scheme='http://www.blogger.com/atom/ns#' term='mssql'/><category scheme='http://www.blogger.com/atom/ns#' term='grails'/><category scheme='http://www.blogger.com/atom/ns#' term='tomcat'/><category scheme='http://www.blogger.com/atom/ns#' term='iis'/><title type='text'>What a Fight!</title><content type='html'>I spent the whole day migrating a Grails-based application from a Linux / MySQL / Apache infrastructure to Windows Server 2003 / MS SQL Server / IIS. Here's my tale of this migration ...&lt;br /&gt;&lt;br /&gt;Objectives:&lt;br /&gt;1. Get Grails to work with MS SQL Server 2005&lt;br /&gt;2. Integrate Tomcat into IIS so that no additional ports have to be opened on the server&lt;br /&gt;&lt;br /&gt;Starting the day with the MS SQL Server migration, things went pretty smooth. I set up a custom environment "mssqlProduction" in &lt;span style="font-family: courier new;"&gt;DataSource.groovy&lt;/span&gt; using the driver class and connection string as outlined on the &lt;a href="http://msdn.microsoft.com/en-us/library/ms378672.aspx"&gt;MS driver's homepage&lt;/a&gt;. Afterwards, I copied the MS driver jar &lt;a style="font-family: courier new;" href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;FamilyID=99b21b65-e98f-4a61-b811-19912601fdc9"&gt;sqljdbc4.jar&lt;/a&gt; into the project's "&lt;span style="font-family: courier new;"&gt;lib/&lt;/span&gt;" dir and generated the first .war file of the day (using "&lt;span style="font-family: courier new;"&gt;grails -Dgrails.env=mssqlProduction war&lt;/span&gt;" because of the custom environment).&lt;br /&gt;&lt;br /&gt;Logging into the server, I installed Tomcat 6 in Program Files (x86) and encountered the first issue: the Tomcat service did not launch. Turns out that Tomcat 6 is delivered with 32bit binaries but since my system is running a 64bit OS, the binary failed to execute. Once I had replaced the binary with the 64bit version (which can be downloaded right from &lt;a href="http://svn.apache.org/viewvc/tomcat/tc6.0.x/tags/TOMCAT_6_0_16/res/procrun/"&gt;Tomcat's SVN&lt;/a&gt;), things were running smoothly.&lt;br /&gt;&lt;br /&gt;Next step: creating a new DB and user account in MS SQL Management Studio so that Tomcat is able to connect. This worked like a charm (once I figured out how MS SQL Management Studio works). After I had adjusted user name and password in DataSource.groovy, I attempted the first deployment into Tomcat. As the Grails project uses the domain classes "&lt;span style="font-family: courier new;"&gt;User&lt;/span&gt;" and "&lt;span style="font-family: courier new;"&gt;Rule&lt;/span&gt;" and Grails automatically maps those to the tables "&lt;span style="font-family: courier new;"&gt;user&lt;/span&gt;" and "&lt;span style="font-family: courier new;"&gt;rule&lt;/span&gt;" respectively, the DB eventually gave some errors during deployment. "&lt;span style="font-family: courier new;"&gt;user&lt;/span&gt;" and "&lt;span style="font-family: courier new;"&gt;rule&lt;/span&gt;" are both reserved keywords within MS SQL Server 2005 and thus raise issues in SQL statements. Changing the "&lt;span style="font-family: courier new;"&gt;mapping&lt;/span&gt;" closure for each of the classes and adding "&lt;span style="font-family: courier new;"&gt;table 'new_table_name'&lt;/span&gt;" statements fixed that issue.&lt;br /&gt;&lt;br /&gt;Without any further problems, the app was up and running within Tomcat using MS SQL Server as its DB. Sweet!&lt;br /&gt;&lt;br /&gt;Since I did not want to open up more ports on the server, the second task of the day was integrating Tomcat with IIS 6. I basically followed the instructions given on the &lt;a href="http://tomcat.apache.org/connectors-doc/webserver_howto/iis.html"&gt;Tomcat website&lt;/a&gt;. Obviously, this didn't work the first time around and I had to go back and forth verifying the different Registry settings and the changes that had to be made in other places.  My key take away: rename the redirect file to exactly what's proposed in the How-To as you're bound to run into problems if not.&lt;br /&gt;&lt;br /&gt;Eventually, the Tomcat ISAPI filter in IIS came up green and was launched successfully. The problem, however, was that it was only invoked properly for certain virtual directories defined within IIS but failed to forward any requests to Tomcat (instead, I was greeted with Service Unavailable messages in my browser for any site I tried to access). Turns out that I had to configure the App Pool containing the jakarta virtual directory to have Local System as the account to run with. Now that solved the problem of the filter not redirecting any traffic to Tomcat.&lt;br /&gt;&lt;br /&gt;However, when trying to access one of the Tomcat-managed sites, IIS was constantly asking me for my Windows logon credentials. Obviously something was off. After a lot of unsuccessful digging, I eventually changed the security settings for the &lt;span style="font-family: courier new;"&gt;isapi_redirect.dll&lt;/span&gt; to grant execute permissions to the IIS user account that was configured for anonymous browsing of the jakarta virtual directory. Another issue down!&lt;br /&gt;&lt;br /&gt;Server's up and running now though I have seen a couple of things that I want to take another look at:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Currently, all filter files except for the dll (&lt;span style="font-family: courier new;"&gt;workers.properties&lt;/span&gt;, &lt;span style="font-family: courier new;"&gt;uriworkermap.properties&lt;/span&gt;, &lt;span style="font-family: courier new;"&gt;isapi.log&lt;/span&gt;) are stored in root directory as I was really struggling to get rid of the dreaded red arrow that kept appearing in IIS' ISAPI filter dialog.&lt;/li&gt;&lt;li&gt;Regular HTTP-authentication requested by a Tomcat-served page does not seem to work correctly.&lt;/li&gt;&lt;/ul&gt;Let's see whether we can crack those nuts, too.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/801676594263385159-2709733021953572790?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/2709733021953572790/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2009/10/what-fight.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/2709733021953572790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/2709733021953572790'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2009/10/what-fight.html' title='What a Fight!'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-5313137491197048587</id><published>2009-10-07T17:09:00.005+02:00</published><updated>2009-10-07T17:20:18.935+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='properties'/><category scheme='http://www.blogger.com/atom/ns#' term='objectivec'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>Properties vs Instance variables</title><content type='html'>So being able to work with properties in Objective-C is very nice but there are subtle things to keep in mind when using them.&lt;br /&gt;&lt;br /&gt;I just came across a problem which cost me about 30 mins of my time. In one of my methods I was (supposedly) assigning an object to one of my properties. The property was marked with &lt;span style="font-family:courier new;"&gt;retain&lt;/span&gt; so that it was supposed to be retained unless re-assigned or the owning object is &lt;span style="font-family:courier new;"&gt;dealloc&lt;/span&gt;'ed. Unfortunately, in a different part of the code, accessing that very property threw an exception.&lt;br /&gt;&lt;br /&gt;Turns out that I hadn't yet mastered the subtle difference between properties and instance variable. Assume the following code sample:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;@interface Foo : NSObject {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;  NSString* bar;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;@property (retain) NSString* bar;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;- (void) test;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;@end&lt;br /&gt;&lt;br /&gt;@implementation Foo {&lt;br /&gt;@synthesize bar;&lt;br /&gt;&lt;br /&gt;- (void) test {&lt;br /&gt; NSString* str = @"Test";&lt;br /&gt;&lt;br /&gt; // this assignment does not use the synthesized setter&lt;br /&gt; // but accesses the instance variable directly&lt;br /&gt; bar = str;&lt;br /&gt;&lt;br /&gt; // same here&lt;br /&gt; self-&gt;bar = str;&lt;br /&gt;&lt;br /&gt; // only this way of accessing uses the setter and thus&lt;br /&gt; // retains the object reference&lt;br /&gt; self.bar = str;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;First of all I did not know about the arrow-way of accessing instance variables, secondly I thought access as displayed in the first assignment would use the setter method.&lt;br /&gt;&lt;br /&gt;Hope this helps in case you're ever going to scratch your head because of this!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/801676594263385159-5313137491197048587?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/5313137491197048587/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2009/10/properties-vs-instance-variables.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/5313137491197048587'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/5313137491197048587'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2009/10/properties-vs-instance-variables.html' title='Properties vs Instance variables'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-871772243864448304</id><published>2009-10-07T10:49:00.002+02:00</published><updated>2009-10-07T10:54:36.895+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='copystrings'/><category scheme='http://www.blogger.com/atom/ns#' term='localization'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='genstrings'/><title type='text'>genstrings / copystrings</title><content type='html'>Setting up an iPhone project I came across some weird behviour with &lt;span style="font-family: courier new;"&gt;genstrings&lt;/span&gt; / &lt;span style="font-family: courier new;"&gt;copystrings&lt;/span&gt; commands.&lt;br /&gt;&lt;br /&gt;In principle, genstrings is responsible for searching your source code for macro statements of the form &lt;span style="font-family: courier new;"&gt;NSLocalizedString(@"keyword", @"description")&lt;/span&gt; and will place an entry in a (UTF-16) text file called &lt;span style="font-family: courier new;"&gt;Localized.strings&lt;/span&gt; for each macro it discovers.&lt;br /&gt;&lt;br /&gt;Now if you use this command to generate the file, add it to your project, localize it (by Right-clicking on the file, choosing "Get Info" and "Make Localizable") everything works great. If, however, you create that file manually (in my case using TextWrangler) the copystrings command will fail during the build process. I'm quite sure that this is somehow related to file permissions on Mac OS X but couldn't quite figure out what was going wrong. After all, the file permissions that you could see in Finder were the same either way.&lt;br /&gt;&lt;br /&gt;If anybody else came across this and solved it (got manual creation of that file to work), let me know!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/801676594263385159-871772243864448304?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/871772243864448304/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2009/10/genstrings-copystrings.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/871772243864448304'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/871772243864448304'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2009/10/genstrings-copystrings.html' title='genstrings / copystrings'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-7403784899997172864</id><published>2009-10-01T10:19:00.002+02:00</published><updated>2009-10-01T10:28:36.255+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='draw'/><category scheme='http://www.blogger.com/atom/ns#' term='paint'/><category scheme='http://www.blogger.com/atom/ns#' term='render'/><category scheme='http://www.blogger.com/atom/ns#' term='j2me'/><category scheme='http://www.blogger.com/atom/ns#' term='2d'/><category scheme='http://www.blogger.com/atom/ns#' term='opengl'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>iPhone drawing</title><content type='html'>I'm not sure whether I just got bad at googling things but apparently, when I first researched bits and pieces about rendering stuff on iPhone, I did not find the way of rendering I was so desperately looking for:&lt;br /&gt;&lt;br /&gt;Instead of diving into OpenGL ES right from the start, I was looking for a rendering mechanism similar to what J2ME offers: subclassing Canvas, overriding the paint() method and adding all of your drawing calls to that method.&lt;br /&gt;&lt;br /&gt;For iPhone I expected to find a similar way of rendering and, sure enough, came across Quartz as iPhone's 2D rendering library of choice. What I did not find, however, was the part where I subclass and add the statements to a particular function in my code. Now, reading the first few lines of Dave Mark's and Jeff LaMarche's chapter on Quartz and OpenGL ES (from their book Beginning iPhone 3 Development), I finally found the missing piece:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Subclass UIView&lt;/li&gt;&lt;li&gt;Override drawRect:&lt;/li&gt;&lt;li&gt;Add Quartz-calls&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;If you're wondering where you can get a handle to the Graphics context (that you'll get automatically as an argument to the method in J2ME), you use &lt;span style="font-family: courier new;"&gt;UIGraphicsGetCurrentContext()&lt;/span&gt; to get a handle to it.&lt;br /&gt;&lt;br /&gt;Maybe this post looks dead-simple, I just hope some people will find it in their quest to discover the information I was looking for myself :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/801676594263385159-7403784899997172864?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/7403784899997172864/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2009/10/iphone-drawing.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/7403784899997172864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/7403784899997172864'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2009/10/iphone-drawing.html' title='iPhone drawing'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-6361489110201656308</id><published>2009-09-26T05:09:00.003+02:00</published><updated>2009-09-26T05:19:14.972+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='malware'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><category scheme='http://www.blogger.com/atom/ns#' term='botnet'/><title type='text'>Mac Security - follow up</title><content type='html'>After recently reinstalling my iMac to make sure that it's save, some time has passed and things seem to be secure. LittleSnitch takes good care of my internet connection and, so far, I have not spotted any troublesome activity.&lt;br /&gt;&lt;br /&gt;Obviously, I'm curious to know whether my system had been compromised at all. I cannot find out, however, since I just completely formatted the hard drive once I had decided to reinstall. I just came across &lt;a href="http://www.heise.de/newsticker/Infektionen-von-Apple-Rechnern-fuer-Kriminelle-unprofitabel--/meldung/145890"&gt;an interesting article at heise.de&lt;/a&gt;, though, which discuss the value of compromised Mac systems. The article &lt;a href="http://www.sophos.com/sophos/docs/eng/marketing_material/samosseiko-vb2009-paper.pdf"&gt;cites the analysis of activities within a malware community&lt;/a&gt; called &lt;span style="font-style: italic;"&gt;Partnerka&lt;/span&gt; where, apparently, malware had been distributed through video codecs.&lt;br /&gt;&lt;br /&gt;Before the infection I had actually tried to install video codes for decoding some weird formats I came across. Could this be the explanation for the troubles I had with my system? In any event it is interesting to see that, contrary to popular (internet) opinion, malware people and botnets are targetting Mac - and seem to be successful doing so.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/801676594263385159-6361489110201656308?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/6361489110201656308/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2009/09/mac-security-follow-up.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/6361489110201656308'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/6361489110201656308'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2009/09/mac-security-follow-up.html' title='Mac Security - follow up'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-4623206581764749099</id><published>2009-09-17T13:20:00.003+02:00</published><updated>2009-09-17T13:23:06.950+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='flex'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><category scheme='http://www.blogger.com/atom/ns#' term='adobe air'/><title type='text'>Adobe AIR, Flex and Mac OS X Dock behaviour</title><content type='html'>Here's a quick pointer implementing the common behaviour of hiding windows when clicking the Exit button used on Mac OS X. Clicking on the dock icon will make the window visible again.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://thanksmister.com/?p=598"&gt;Article at ThanksMister&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Thanks, Mister!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/801676594263385159-4623206581764749099?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/4623206581764749099/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2009/09/adobe-air-flex-and-mac-os-x-dock.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/4623206581764749099'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/4623206581764749099'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2009/09/adobe-air-flex-and-mac-os-x-dock.html' title='Adobe AIR, Flex and Mac OS X Dock behaviour'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-5681176638262190419</id><published>2009-09-15T10:19:00.002+02:00</published><updated>2009-09-15T10:28:37.644+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='chance'/><category scheme='http://www.blogger.com/atom/ns#' term='probability'/><category scheme='http://www.blogger.com/atom/ns#' term='monopoly'/><category scheme='http://www.blogger.com/atom/ns#' term='math'/><title type='text'>Probabilities in Monopoly</title><content type='html'>I just read some paragraphs in a book called "The Art of Game Design: A Book of Lenses" by Jesse Schell. It really is a very interesting book, analyizing the design of games from a rather theoretical standpoint but giving rules of thumb that can guide your designs.&lt;br /&gt;&lt;br /&gt;Anyways, the paragraph I read was an introduction to probabilities for game designers. It was really well-written and a fun read. One thing I have to comment on, though, is the statement that it is "nearly impossible to calculate the probabilities of landing on a particular field in Monopoly &lt;span style="font-style: italic;"&gt;using theoretical means&lt;/span&gt;" (in contrast to simulating a very, very long game). It actually can be done with good thought and knowledge of &lt;a href="http://en.wikipedia.org/wiki/Markov_chain"&gt;Markov Chains&lt;/a&gt;. Googling a bit, you will find really nice articles analyzing the game of Monopoly in this regard. &lt;a href="http://tkcs-collins.com/truman/monopoly/monopoly.shtml"&gt;This&lt;/a&gt; place might be a good start.&lt;br /&gt;&lt;br /&gt;So now that I've given this one away, let me know whether you succeeded in the game by purchasing the most likely fields!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/801676594263385159-5681176638262190419?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/5681176638262190419/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2009/09/probabilities-in-monopoly.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/5681176638262190419'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/5681176638262190419'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2009/09/probabilities-in-monopoly.html' title='Probabilities in Monopoly'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-3809653330437828898</id><published>2009-09-14T17:31:00.003+02:00</published><updated>2009-09-14T17:48:39.087+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='ssl'/><category scheme='http://www.blogger.com/atom/ns#' term='strange'/><title type='text'>SSL errors in Firefox</title><content type='html'>Since recently I have noticed that Firefox, every now and then, tries to access two servers using SSL that have no valid certificates. Both servers are accessed without me requesting anything so it must either be something that another website is using (the last times this has happened I had Gmail open in one of my tabs) or something else is trying to open.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One server is &lt;span style="font-family: courier new;"&gt;int.fmsolutions.pl &lt;/span&gt;which returns a "sec_error_unknown_issuer". I have no idea why anything would try to connect to that server so I'm slightly worried again. My password paranoia is back :-S&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Anybody knows what that server does? Googling only reveals one dodgy SMS login page ...&lt;/div&gt;&lt;br /&gt;The other server was a subdomain of &lt;span style="font-family: courier new;"&gt;blue-cdp.com&lt;/span&gt; which belongs to a company called QPASS. I know these guys from previous work experience where they have acted as a content management solution for a mobile operator. Why would anything on my system connect to that server? The SSL error I see mentions a problem with the server mentioned in the certificate: it contains a wild-card character '*' but that does not seem to match the server my Firefox tried to access.&lt;br /&gt;&lt;br /&gt;Is there any option in Firefox that allows you to see the exact history of URLs that have been accessed recently? Like a log or something?&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/801676594263385159-3809653330437828898?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/3809653330437828898/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2009/09/ssl-errors-in-firefox.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/3809653330437828898'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/3809653330437828898'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2009/09/ssl-errors-in-firefox.html' title='SSL errors in Firefox'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-2445075751250416035</id><published>2009-09-08T10:11:00.004+02:00</published><updated>2009-09-08T10:14:48.435+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wow'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>Mac Security - part III</title><content type='html'>No Blizzard mail since last night informing me of another account cancellation - even though I used my Mac to play and installed one of the addons (QuestHelper). LittleSnitch only detected regular communications going to Blizzard servers. No strange behaviour. I start to feel save again.&lt;br /&gt;&lt;br /&gt;What bugs me is that I still don't know what exactly happened. The only thing I can think of is that, while installing WoW, I downloaded the installer file from a non-official source. This might have been a modified file contain a Trojan or something. Seems rather unlikely, though ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/801676594263385159-2445075751250416035?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/2445075751250416035/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2009/09/mac-security-part-iii.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/2445075751250416035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/2445075751250416035'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2009/09/mac-security-part-iii.html' title='Mac Security - part III'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-2782053212868326502</id><published>2009-09-07T22:08:00.003+02:00</published><updated>2009-09-07T22:13:53.021+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='wow'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>Mac Security - part II</title><content type='html'>My account has been re-activated and Blizzard was kind enough to delete all the characters that had been created without my knowledge. I logged in to their website and changed my password on my Windows machine - which has been equipped with ZoneAlarm in the meantime. Afterwards, I logged in using the game client (once I deleted all the add-ons I had still installed) and verified that things were in order. No breach of security so far (which is about 10 hours).&lt;br /&gt;&lt;br /&gt;I'll be courageous and will log in using my iMac now. Fingers crossed that re-installation fixed the issue.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/801676594263385159-2782053212868326502?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/2782053212868326502/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2009/09/mac-security-part-ii.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/2782053212868326502'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/2782053212868326502'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2009/09/mac-security-part-ii.html' title='Mac Security - part II'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-2530480837116382118</id><published>2009-09-06T19:10:00.002+02:00</published><updated>2009-09-06T19:13:15.506+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cocos2d'/><category scheme='http://www.blogger.com/atom/ns#' term='menu'/><title type='text'>Menus with cocos2d</title><content type='html'>If you intend to use the Menu class in cocos2d, remember that each method used as an invocation target by a MenuItem must take exactly one argument which is going to receive the object that invoked the method. If you don't conform to this, you will see an error message like:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSInvocation setArgument:atIndex:]: index (2) out of bounds [-1, 1]'&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Here's a sample method that will work:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;- (void) doMenuItemAction: (id) sender;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/801676594263385159-2530480837116382118?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/2530480837116382118/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2009/09/menus-with-cocos2d.html#comment-form' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/2530480837116382118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/2530480837116382118'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2009/09/menus-with-cocos2d.html' title='Menus with cocos2d'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-3610917631389822345</id><published>2009-09-05T16:32:00.003+02:00</published><updated>2009-09-05T16:54:12.526+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='keyboard hack'/><category scheme='http://www.blogger.com/atom/ns#' term='wow'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>Mac Security</title><content type='html'>I consider myself a savvy computer user: have been online since well into the 90ies and have programmed loads of apps on desktops, servers and mobile devices. With my approach to using passwords and navigating around the web I felt fairly save - till just recently.&lt;br /&gt;&lt;br /&gt;To drive some iPhone development, I have recently switched to a nice 24" iMac (this doesn't add any value to the story - am just bragging here). Like probably a lot of other users I felt fairly save with my OS X setup and I didn't worry too much about the security setup: I did not install anti virus software nor did I install a personal firewall of any sort. The system is sitting behind a router, though, so direct connections to the system are not getting through.&lt;br /&gt;&lt;br /&gt;Now here's the fun part: since a couple of months I have been playing - and now I admit to it publicly - some World of Warcraft. There were never any issues with my account as long as I was on my Win XP machine.  Once I got the iMac I installed WoW on that system since it's way more powerful than the laptop I had been using before. Things worked smoothly (except for a really bumpy install process) for the first couple of days or so but this week I received notice from Blizzard that my account had been cancelled permanently due to involvement in online trading activities.&lt;br /&gt;&lt;br /&gt;I surely was surprised by this since I have never done anything illegally within the game. I sent Blizzard a notice on re-activating my account since I hadn't done anything violating their ToS and, after a couple of days, received notice that they had reset my password and I could start using the account again. Immediately I went to their site and picked a new password &lt;span style="font-style: italic;"&gt;*that I had never used before*&lt;/span&gt;. The password was of ok strength, I think, looking similar to "bla5623bRealm". I logged in to my account and noticed that, indeed, two characters had been created within my account that I didn't know of. I deleted those characters, verified that nothing majorly had happened to the other chars and logged off to get on with work.&lt;br /&gt;&lt;br /&gt;About four hours later I receive another mail from Blizzard, cancelling my account again due to the very same reason! Through the WoW iPhone app I could see that another six or eight chars had been created within my account. I have, obviously, not shared my password with anybody, not posted it on any websites and - most importantly - I have never, ever used it before. Now I'm obviously quite concerned about the security of my system since the explanations which do &lt;span style="font-style: italic;"&gt;not&lt;/span&gt; imply that my system has been pwned (brute-force attack, Blizzard people using my account, hackers breaking into Blizzard servers) are fairly unlikely.&lt;br /&gt;&lt;br /&gt;Scanning my system using popular virus scanners and rootkit detection software did not detect any oddities and, eventually, I chose to re-install the Mac. Obviously, if something like the &lt;a href="http://www.semiaccurate.com/2009/07/31/apple-keyboard-firmware-hack-demonstrated/"&gt;keyboard hack&lt;/a&gt; made it into the wild, a reinstall won't fix anything. Is there anything else I should've considered as a possible means of intrusion?&lt;br /&gt;&lt;br /&gt;Which also leaves the question through which means I might have received the evil intruder. Have only used a couple of very popular WoW add-ons and software that was recommended on websites. No pr0n apps, no illegal software. Any comments are very much appreciated - I'll post follow-ups as the story develops.&lt;br /&gt;&lt;br /&gt;BTW, is there any easy way to download the firmware from my keyboard for checksum comparisons? I must look pretty paranoid :-D&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/801676594263385159-3610917631389822345?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/3610917631389822345/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2009/09/mac-security.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/3610917631389822345'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/3610917631389822345'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2009/09/mac-security.html' title='Mac Security'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-8549382529896677708</id><published>2009-09-03T23:38:00.002+02:00</published><updated>2009-09-03T23:52:41.735+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cocos2d'/><category scheme='http://www.blogger.com/atom/ns#' term='pixel animation studio'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>Extending cocos2d</title><content type='html'>Today was my first real day of doing something vaguely productive using cocos2d on the iPhone.&lt;br /&gt;&lt;br /&gt;I coded an animation creation framework (aptly called Pixel Animation Studio) some months ago which can be used to compose animations using 2d pixel graphics. Basically, an animation is broken down into frames which in turn are broken down into small fragments. This technique encourages reuse of image fragments and can save a lot of space normally wasted by duplicate content in images. I guess you can see my background as a J2ME engineer shine through ...&lt;br /&gt;&lt;br /&gt;Anyways, to support the animations created using this tool, I need a Sprite class that can be assembled by rendering multiple images instead of a single texture. To get this working, I investigated the CocosNode, TextureNode and Sprite source code to see, how rendering is performed deep within cocos2d. Turns out it's fairly easy to do:&lt;br /&gt;&lt;br /&gt;cocos2d already handles most of the behaviour you need for a Sprite in CocosNode. It takes care of position translations and rendering all the sub-nodes added to a CocosNode. Now you just go ahead, sub-class CocosNode and add all the images you'd like to render as children of type Sprite (or AtlasSprite). cocos2d will take care of the rest!&lt;br /&gt;&lt;br /&gt;Since the animations produced with Pixel Animation Studio are slightly more advanced than the ones provided out of the box by cocos2d (btw, I didn't realize plain 2d, frame-based animations were supported out of the box to begin with - they are just not properly highlighted as a feature on their site), I also had to implement a new IntervalAction. That's pretty straight-forward, too: just subc-class and override the &lt;span style="font-family: courier new;"&gt;+ (void) update: (ccTime) time&lt;/span&gt; method. When instantiating, keep in mind that cocos2d takes parameters in &lt;span style="font-style: italic;"&gt;seconds&lt;/span&gt; for the actions which accept a duration parameter, not in milliseconds.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/801676594263385159-8549382529896677708?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/8549382529896677708/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2009/09/extending-cocos2d.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/8549382529896677708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/8549382529896677708'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2009/09/extending-cocos2d.html' title='Extending cocos2d'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-8105718227980711748</id><published>2009-09-02T21:55:00.003+02:00</published><updated>2009-09-02T22:01:06.198+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='doh'/><category scheme='http://www.blogger.com/atom/ns#' term='objectivec'/><category scheme='http://www.blogger.com/atom/ns#' term='load'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>+ (void) load</title><content type='html'>I just happened run into one of those things that must happen to you if you just go out there and try to learn a new programming language from scratch without using any tutorial books.&lt;br /&gt;&lt;br /&gt;Just for the sake of getting started with some Objective-C coding, I'm implementing some 2D animation functionality based on an animation tool coded in Java. Trying to load the files its creates using Objective-C, I implemented a method called &lt;span style="font-family: courier new;"&gt;load&lt;/span&gt; in one of my classes. Things got properly loaded - but, to my surprise, I also saw some error messages in the console hinting at leaking memory. An autorelease-pool was set up in my main class so I was wondering what could possibly have gone wrong.&lt;br /&gt;&lt;br /&gt;Turns out &lt;span style="font-family: courier new;"&gt;+ (void) load&lt;/span&gt; is method defined in &lt;span style="font-family: courier new;"&gt;NSObject&lt;/span&gt; class which is used for initializing objects. It got called even before my autorelease-pool was initialized, thus the leaking. Keep that in mind if you see error messages saying "No autorelease pool in place" or "Just leaking" even though an autorelease-pool is set up in your main class.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/801676594263385159-8105718227980711748?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/8105718227980711748/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2009/09/void-load.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/8105718227980711748'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/8105718227980711748'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2009/09/void-load.html' title='+ (void) load'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-6011921686307986703</id><published>2009-08-26T23:45:00.002+02:00</published><updated>2009-08-26T23:52:35.998+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xcode'/><category scheme='http://www.blogger.com/atom/ns#' term='subversion'/><category scheme='http://www.blogger.com/atom/ns#' term='svn'/><title type='text'>Xcode and SVN</title><content type='html'>Today was my first time trying to work with Xcode 3 and Subversion. Using two separate Macs to check out the shared project from SVN, I quickly discovered that it was not as straight forward to work with Subversion from inside Xcode as I had hoped (and come to know from NetBeans and Eclipse).&lt;br /&gt;&lt;br /&gt;First of all, only one of the Macs successfully set the SCM repository after the checkout on the other one I had to manually set the repository after checkout. I think I did the very same steps on both Macs but behaviour was different - how strange.&lt;br /&gt;&lt;br /&gt;Next thing I noticed: if you'd like to update your project but have a file already displayed in the editor, make sure you use &lt;span style="font-style: italic;"&gt;Refresh Entire Project&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;before&lt;/span&gt; selecting &lt;span style="font-style: italic;"&gt;Update Entire Project&lt;/span&gt;. It seems that without calling Refresh, the file is indeed updated on the file system but the change won't be visible within the editor unless you choose a different, external editor to open the file.&lt;br /&gt;&lt;br /&gt;If anybody can shed some light on the issue, let me know in the comments!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/801676594263385159-6011921686307986703?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/6011921686307986703/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2009/08/xcode-and-svn.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/6011921686307986703'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/6011921686307986703'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2009/08/xcode-and-svn.html' title='Xcode and SVN'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-7949222852768118336</id><published>2009-08-07T18:21:00.003+02:00</published><updated>2009-08-07T18:24:34.890+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='jsunit'/><title type='text'>JsUnit</title><content type='html'>If you happen to run into problems with the Test Runner page of JsUnit in Firefox, try setting the property &lt;a style="font-family: courier new;" href="http://kb.mozillazine.org/Security.fileuri.strict_origin_policy"&gt;Security.fileuri.strict_origin_policy&lt;/a&gt; on your &lt;span style="font-family:courier new;"&gt;about:config&lt;/span&gt; page to false. Unless you do that change, the Test Runner will come to a halt while displaying the "Opening test page ...." message.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/801676594263385159-7949222852768118336?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/7949222852768118336/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2009/08/jsunit.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/7949222852768118336'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/7949222852768118336'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2009/08/jsunit.html' title='JsUnit'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-4629535274065652631</id><published>2009-08-05T20:49:00.004+02:00</published><updated>2009-08-05T21:02:35.542+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='transactionlog'/><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='backup'/><category scheme='http://www.blogger.com/atom/ns#' term='mssql'/><title type='text'>Transaction Logs in MS SQL Server 2005</title><content type='html'>The other day I tried to find a solution for an excessively large transaction log file in one of our production systems. It grew to an astonishing 40 GB which set off some alarms. Our middleware service provider offered to take care of this problem for a rather high monthly fee that I didn't feel like paying: after all, how difficult could it be to shrink that stupid file and keep it under control?&lt;br /&gt;&lt;br /&gt;Turns out it with a little trickier than I thought. I, actually, have never used MS SQL Server before and have never come across any transaction logs I had to take care off. In my previous server-based project we worked with MySQL which did not provide such a facility (and I shall stand correct if you show me where I missed it). So off I went to find some information about the transaction logs for MS SQL Server and, in theory, things were supposed to be easy: execute two SQL statements, one backing up the transaction log, the other shrinking the log file - that's it.&lt;br /&gt;&lt;br /&gt;Backing up worked (with a 40 GB log it took quite some time, of course) like a charm but shrinking did not seem to work. Once I found the command&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;DBCC SQLPERF (logspace)&lt;/span&gt;&lt;/blockquote&gt;I was at least able to verify that the backup had worked and had really set the records in the log to inactive. After some more trial and error I found that I had just passed the wrong parameter to shrinkfile: instead of the database name it expects the name of the log file (excluding the file extension.&lt;br /&gt;&lt;br /&gt;A long story short, the following two commands executed in SQL Management Studio will successfully backup and shrink your transaction log file:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;USE &lt;database&gt;[database];&lt;/database&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;BACKUP LOG [database] &lt;database&gt; TO DISK = '&lt;filename&gt;[filename]';&lt;/filename&gt;&lt;/database&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;DBCC SHRINKFILE ([name of transaction log without extension or quotes]&lt;logfilename&gt;, 1);&lt;/logfilename&gt;&lt;/span&gt;&lt;/blockquote&gt;Here's a more tangible example:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="font-family:courier new;"&gt;USE BenDB;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; BACKUP LOG BenDB TO DISK = 'C:\Backup\BenDB_log.bak';&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt; DBCC SHRINKFILE (BenDB_log, 1);&lt;/span&gt;&lt;/blockquote&gt;Hope this can save you some time one of these days.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/801676594263385159-4629535274065652631?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/4629535274065652631/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2009/08/transaction-logs-in-ms-sql-server-2005.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/4629535274065652631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/4629535274065652631'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2009/08/transaction-logs-in-ms-sql-server-2005.html' title='Transaction Logs in MS SQL Server 2005'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-6928044406955811850</id><published>2009-07-21T12:41:00.004+02:00</published><updated>2009-07-21T13:24:06.773+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tsp'/><category scheme='http://www.blogger.com/atom/ns#' term='thesis'/><category scheme='http://www.blogger.com/atom/ns#' term='math'/><category scheme='http://www.blogger.com/atom/ns#' term='op'/><title type='text'>Generalizations of the TSP</title><content type='html'>Here's my first post in a row of posts detailing what I'm doing in my thesis - and for what it's good. Typically, math students don't necessarily know whether the contents of their thesis can be applied to anything in the real world at all (I'm exaggerating - but for most of them, it's more difficult to find the connection). In my case, however, it's pretty straight forward:&lt;br /&gt;&lt;br /&gt;Imagine you're working for UPS and you pick up your truck at 7am in the morning to start your delivery tour. Now, if you're a clever driver, you might want to take a moment and consider how to best approach today's deliveries: what's the shortest (or cheapest or fastest or ...) route to take through town delivering all the packages and, after the last delivery, returning to your depot. That's the &lt;a href="http://en.wikipedia.org/wiki/Travelling_salesman_problem"&gt;Traveling Salesman Problem&lt;/a&gt; (TSP) - a very classic example of a problem that's &lt;a href="http://en.wikipedia.org/wiki/NP_%28complexity%29#Why_some_NP_problems_are_hard_to_solve"&gt;hard&lt;/a&gt; to solve to optimality.&lt;br /&gt;&lt;br /&gt;Now UPS offers clients to dispatch packages with high or normal priority. High priority packages will be treated with a higher urgency and will typically be delivered before a normal priority package is delivered. In addition to that, a realistic constraint for the delivery of packages is to impose a latest time for delivery, say you have to finish the delivery of all packages by 5pm (receptionists leave rather early, I hear). Trying to come up with a tour for the driver that takes both extensions into consideration (prioritization of deliveries and maximum time allowed for delivery on a single day) is a generalization of the TSP - the Orienteering Problem (OP).&lt;br /&gt;&lt;br /&gt;There are a lot more variations of the original TSP. The OP, however, should give you an idea of what such a variation / generalization can look like. In my thesis I'm having a look at these kind of generalizations and trying to come up with algorithms that will solve them to optimality (ie. we find the best tour possible, guaranteed!) but take a lot of computation time or algorithms which only come close to the best tour (which we cannot guarantee, however :-( ) but are fairly quick.&lt;br /&gt;&lt;br /&gt;That's enough for a first post - I don't want to scare anybody away before the real fun starts. In the next post I'll try to give a low-math overview of how one can tackle these problems. Let's see whether that's possible!&lt;br /&gt;&lt;br /&gt;PS: For the nit-pickers out there: the OP is not &lt;span style="font-style: italic;"&gt;really&lt;/span&gt; a generalization in the sense that you can solve the TSP by means of an OP. I still like to call it a generalization so bear with me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/801676594263385159-6928044406955811850?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/6928044406955811850/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2009/07/generalizations-of-tsp.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/6928044406955811850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/6928044406955811850'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2009/07/generalizations-of-tsp.html' title='Generalizations of the TSP'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-7139240956950084310</id><published>2009-07-20T11:30:00.002+02:00</published><updated>2009-07-20T11:40:41.511+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='iis'/><title type='text'>IIS and ASP.net</title><content type='html'>This morning I had to deploy an ASP.net-based application to an IIS. Everything had worked fine on the development system but once I deployed it on our production system, an error message was displayed that didn't give me a clue about what could possibly have gone wrong:&lt;br /&gt;&lt;blockquote&gt;Error initializing the AppDomain&lt;/blockquote&gt;Quickly followed by another error:&lt;br /&gt;&lt;blockquote&gt;The request could not be processed because the application domain could not be created. (translation of Die Anforderung konnte nicht ausgeführt werden, weil die Anwendungsdomäne nicht erstellt werden konnte.)&lt;/blockquote&gt;Google didn't find clear steps to fix the issue but hinted at file permission problems. In fact, I had just extracted a zip file on the server into the application directory instead of creating one manually. Therefore permissions of the containing folder were not reused and just set to some defaults. Comparing and adjusting the file permissions (Security in context menu) of the directory with the permissions of the Inetpub directory fixed the problem.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/801676594263385159-7139240956950084310?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/7139240956950084310/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2009/07/iis-and-aspnet.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/7139240956950084310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/7139240956950084310'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2009/07/iis-and-aspnet.html' title='IIS and ASP.net'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-6259594803666169191</id><published>2009-07-19T21:56:00.002+02:00</published><updated>2009-07-19T21:58:40.876+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opengl'/><title type='text'>OpenGL origin</title><content type='html'>Looks like OpenGL is just doing what all the other 3D frameworks are doing, too. At least &lt;a href="http://www.opengl.org/resources/features/KilgardTechniques/oglpitfall/"&gt;this article&lt;/a&gt; implies that 3D frameworks generally adopt the maths view of having the origin in the lower left. Good to know!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/801676594263385159-6259594803666169191?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/6259594803666169191/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2009/07/opengl-origin.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/6259594803666169191'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/6259594803666169191'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2009/07/opengl-origin.html' title='OpenGL origin'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-8364500942307957335</id><published>2009-07-19T21:39:00.002+02:00</published><updated>2009-07-19T21:54:11.338+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cocos2d'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='game'/><title type='text'>cocos2d</title><content type='html'>First time really trying to get something done in iPhone SDK. After struggling ages getting a simple game loop to work - only to discover that I was calling the update routines on the wrong thread - I found a forum post which talked about the &lt;a href="http://www.cocos2d-iphone.org"&gt;cocos2d&lt;/a&gt; iPhone 2D game engine.&lt;br /&gt;&lt;br /&gt;Have now spent most of the day working on a simple Memory-like game. The engine is pretty straight forward to use once you get to know the APIs. There are a couple of things I didn't quite figure out this time, though - any insights are appreciated:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Is there any reason why rendering origin in iPhone / cocos2d / OpenGL seems to be lower left corner instead of upper left? It sure matches the mathematical way of thinking about an origin but AFAIR most of the other frameworks have their origin in the upper left, don't they?&lt;/li&gt;&lt;li&gt;To render the game board, I have assembled a Scene using a Layer and a couple of Sprites contained in that Layer where each of the Sprites was supposed to be touchable. I haven't found a way to get that working other than reacting to touches on the Layer and manually checking whether the touch fell within the bounds of one of the Sprites. There must be a better way to do this, right?&lt;/li&gt;&lt;li&gt;How does memory management work when you replace Scenes using the Director singleton? You access the Scenes via &lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;[Scene node];&lt;/span&gt;&lt;/span&gt; so I assume there's &lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;autorelease&lt;/span&gt;&lt;/span&gt; at work.&lt;/li&gt;&lt;li&gt;Why do &lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;Texture2D.pixelsHigh&lt;/span&gt;&lt;/span&gt; / &lt;span style="font-family: courier new;font-size:85%;" &gt;.pixelsWide&lt;/span&gt; return different values than &lt;span style="font-size:85%;"&gt;&lt;span style="font-family: courier new;"&gt;Texture2D.contentSize&lt;/span&gt;&lt;/span&gt;?&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/801676594263385159-8364500942307957335?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/8364500942307957335/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2009/07/cocos2d.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/8364500942307957335'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/8364500942307957335'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2009/07/cocos2d.html' title='cocos2d'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-5346177236906184993</id><published>2009-07-17T19:14:00.003+02:00</published><updated>2009-07-17T19:21:18.115+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='macbookair'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>MacBook Air</title><content type='html'>Here's another one to start off with: did Apple ever test the first edition MacBook Air in summer time? Don't get me wrong, I love the Air for it's gorgeous design but I just can't stand its' performance!&lt;br /&gt;&lt;br /&gt;Even on colder days, the thing becomes so hot it's barely touchable (at least around the ESC-key). But in summer-time, the thing is hot by default! If it was just for the heat, I can live with that. Whenever it's hot, performance goes down big time, however, down to a point where any letter you type is only displayed on screen about a second later!&lt;br /&gt;&lt;br /&gt;For something as expensive as the Air I would've expect more. Though, as far as I know, the second edition Air does not have the performance problems anymore (it still gets &lt;span style="font-style: italic;"&gt;very&lt;/span&gt; hot, though).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/801676594263385159-5346177236906184993?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/5346177236906184993/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2009/07/macbook-air.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/5346177236906184993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/5346177236906184993'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2009/07/macbook-air.html' title='MacBook Air'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-801676594263385159.post-102188323355731963</id><published>2009-07-17T18:36:00.002+02:00</published><updated>2009-07-17T19:21:04.473+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='music'/><category scheme='http://www.blogger.com/atom/ns#' term='itunes'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>iTunes and Single Tracks</title><content type='html'>So iTunes has this great view on your track collection where you see the cover art for each album you own, one by one.&lt;br /&gt;&lt;br /&gt;But every now and then this list is cluttered by album which only contain a single track - it's like having the single, which you love, but not going for the full album. I have loads of those tracks and they mess up my albums view.&lt;br /&gt;&lt;br /&gt;Why doesn't iTunes filter those one-track or two-track albums and create a single album entry for those labeled "My Single Compilation" (well, any name will do, I guess) and file all of them into that album entry? The cover art could be a nice patchwork created from each of the individual track's album art.&lt;br /&gt;&lt;br /&gt;Hey, Apple, give it a thought!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/801676594263385159-102188323355731963?l=rtort.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rtort.blogspot.com/feeds/102188323355731963/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://rtort.blogspot.com/2009/07/itunes-and-single-tracks.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/102188323355731963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/801676594263385159/posts/default/102188323355731963'/><link rel='alternate' type='text/html' href='http://rtort.blogspot.com/2009/07/itunes-and-single-tracks.html' title='iTunes and Single Tracks'/><author><name>Benjamin</name><uri>http://www.blogger.com/profile/07601856180999532305</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://4.bp.blogspot.com/_NedfMz-IFO8/TElP_mNqnpI/AAAAAAAAACY/7LSfRlzreYg/S220/Foto+am+23-07-2010+um+10.16.jpg'/></author><thr:total>0</thr:total></entry></feed>
