<?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-15902051</id><updated>2011-07-28T16:21:39.471+02:00</updated><category term='Collibra'/><category term='back'/><category term='Semantics cartoon'/><category term='Eclipse Community Belgium'/><title type='text'>Damien's World</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://damientrog.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15902051/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://damientrog.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Damien</name><uri>http://www.blogger.com/profile/12374227311695325950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://3.bp.blogspot.com/-D99xqNcUWtQ/TXN3s_XaoNI/AAAAAAAAACY/V4wuBRdDUnA/s220/Damien_small.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>11</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-15902051.post-8795712141817347189</id><published>2011-03-06T12:20:00.005+01:00</published><updated>2011-03-06T13:05:43.470+01:00</updated><title type='text'>Combining a Cocoa hobby with family and work</title><content type='html'>&lt;div&gt;Since I bought myself an iPad I decided to get my hands dirty again with XCode. I felt immediately at home programming for iOS. The brilliance of the Cocoa framework shows here as well. It is also a great opportunity since it hasn't bloated yet and is simple to learn.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Before my hobby gets out of hand I want to validate whether it is worth spending time on. Balancing my career with spending time with my 1 1/2 month old daughter is not easy. Adding a hobby project as well is not evident. Thus these are my 3 requirements:&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;it should be fun;&lt;/li&gt;&lt;li&gt;it should not prevent me from being with &lt;a href="http://vienna.trog.or.at/"&gt;Vienna&lt;/a&gt; and Evelien (daughter and wife);&lt;/li&gt;&lt;li&gt;it should be in line with &lt;a href="http://www.collibra.com/"&gt;Collibra&lt;/a&gt;.&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;Number one is easy. Designing and programming are my work and hobby. Doing it on the mac with Cocoa makes it gold.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To fulfill number two, I have the rule to only work on my project at home. It's easy to get tempted to just work on it at the office after my hours. I noticed I was getting home at night when the family was already asleep. No need to say that's bad.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I find I can combine spending time with my daughter and program rather well. She sleeps for max 3 hours and then forces me to take a break. I can entertain her with what's on the screen, and get some exercise to play with her. Double win.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To fulfill point three I did some research. Anybody can sense that the mobile market is big and there's a lot of money to be made. I wanted to get some figures though.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Since their introduction Android and iPhone have become the main players on the mobile market. Apple reported to have sold $ 1 billion so far via their App Store (WWDC 2010 keynote) since the start in July 2008. At this time there are currently more than 400 000 apps available accounting for more than &lt;a href="http://www.apple.com/pr/library/2011/01/22appstore.html"&gt;10 billion downloads&lt;/a&gt;. The android market is currently good for about &lt;a href="http://www.stockbriefings.com/google-inc-nasdaqgoog-android-has-200000-apps-2/3179516"&gt;200 000 apps&lt;/a&gt;. We haven't seen anything yet though. The mobile market is expected to triple by 2015 according to &lt;a href="http://www.juniperresearch.com/shop/products/whitepaper/pdf/MAS10_White%20Paper.pdf"&gt;Juniper Research&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The way I see it, is that a mobile app would be a great way to increase visibility to the company. The app should be simple, and allow you to accomplish the most core tasks. In case of &lt;a href="http://www.collibra.com/products/business-semantics-glossary"&gt;Collibra's Glossary&lt;/a&gt; that would be searching for terms and validating definitions.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Stay tuned as I will publish my adventures on getting on the App Store.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15902051-8795712141817347189?l=damientrog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://damientrog.blogspot.com/feeds/8795712141817347189/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15902051&amp;postID=8795712141817347189' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15902051/posts/default/8795712141817347189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15902051/posts/default/8795712141817347189'/><link rel='alternate' type='text/html' href='http://damientrog.blogspot.com/2011/03/combining-cocoa-hobby-with-family-and.html' title='Combining a Cocoa hobby with family and work'/><author><name>Damien</name><uri>http://www.blogger.com/profile/12374227311695325950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://3.bp.blogspot.com/-D99xqNcUWtQ/TXN3s_XaoNI/AAAAAAAAACY/V4wuBRdDUnA/s220/Damien_small.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15902051.post-6187047377333434468</id><published>2009-06-07T20:00:00.006+02:00</published><updated>2009-06-08T09:35:14.115+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Semantics cartoon'/><title type='text'>A cartoon about semantics</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_brjtrRvqguI/Siy-U5LuWnI/AAAAAAAAAB4/tgT0TieWw-o/s1600-h/Page_1.png"&gt;&lt;/a&gt;With this cartoon I try to illustrate semantic with as little words as possible. The scenario is as follows.&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A trading company has an electronic data format about deliveries of goods. A new partner joins the network with a different format.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For each of the symbols the data mapper needs to find out what they mean and how they translate between data formats.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_brjtrRvqguI/Siy-7UcQNeI/AAAAAAAAACA/l93XXb47to8/s1600-h/Page_1.png"&gt;&lt;img src="http://4.bp.blogspot.com/_brjtrRvqguI/Siy-7UcQNeI/AAAAAAAAACA/l93XXb47to8/s400/Page_1.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5344856784090707426" style="cursor: pointer; " /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In this example the data mapper is investigating what A means and how it translates. He thinks hard and remembers that A is the Date of sending the Delivery. By calling up his partner and explaining that he is looking for this Date he finds out that they call it B.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;He takes the classic approach and creates a script that translates A to B.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;One month later another partner joins with again a different data format. Again he thinks hard and finds out A and B are the Date of sending the Delivery.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Because he does not make the meaning clear the mapper has to rely on his memory and make many phone calls. This is clearly error prone and a tiring process.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In Collibra's approach the meaning of the symbols is made explicit. Instead of saying that A equals B, we say what A means and what B means. The translation between data formats can then be derived using this information.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Do not just keep the meaning in your head. Make it explicit and you will save time and many  headaches.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Disclaimer: I have very limited drawing skills, so I relied on what I could find online. The stick figures are by Thor, created in Omnigraffle.&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/15902051-6187047377333434468?l=damientrog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://damientrog.blogspot.com/feeds/6187047377333434468/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15902051&amp;postID=6187047377333434468' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15902051/posts/default/6187047377333434468'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15902051/posts/default/6187047377333434468'/><link rel='alternate' type='text/html' href='http://damientrog.blogspot.com/2009/06/cartoon-about-semantics.html' title='A cartoon about semantics'/><author><name>Damien</name><uri>http://www.blogger.com/profile/12374227311695325950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://3.bp.blogspot.com/-D99xqNcUWtQ/TXN3s_XaoNI/AAAAAAAAACY/V4wuBRdDUnA/s220/Damien_small.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_brjtrRvqguI/Siy-7UcQNeI/AAAAAAAAACA/l93XXb47to8/s72-c/Page_1.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15902051.post-8628732691724978849</id><published>2009-05-11T18:19:00.002+02:00</published><updated>2009-05-11T18:30:43.422+02:00</updated><title type='text'>Moved back to Flanders</title><content type='html'>After living in Brussels for about 3 years, I have moved back to Flanders. I must say I appreciate the relaxing feeling of leaving the city and going home. I grew up in a rural area and this feels like properly going home again.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Brussels is a great city, but not my favorite. Culinary however, I don't think anything will top it price/quality wise.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The first week I experienced a false sense of happiness about traffic. Driving to Collibra took me 25 mins, which is only 5 more mins than before. This morning the came the hard truth with a 1 hour drive. It's still acceptable though.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I live now in Kampenhout in a proper house with a garden. Even before mowing my lawn the first thing I will do is organise a barbecue. Before I didn't even have a terrace, so I have some serious catching up to do.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I am also experimenting with my hifi setup, but that will be a later post.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15902051-8628732691724978849?l=damientrog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://damientrog.blogspot.com/feeds/8628732691724978849/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15902051&amp;postID=8628732691724978849' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15902051/posts/default/8628732691724978849'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15902051/posts/default/8628732691724978849'/><link rel='alternate' type='text/html' href='http://damientrog.blogspot.com/2009/05/moved-back-to-flanders.html' title='Moved back to Flanders'/><author><name>Damien</name><uri>http://www.blogger.com/profile/12374227311695325950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://3.bp.blogspot.com/-D99xqNcUWtQ/TXN3s_XaoNI/AAAAAAAAACY/V4wuBRdDUnA/s220/Damien_small.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15902051.post-5334530867065556551</id><published>2009-02-12T15:29:00.003+01:00</published><updated>2009-02-12T15:33:37.787+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Collibra'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse Community Belgium'/><title type='text'>Belgian Eclipse Community Meeting</title><content type='html'>The following is a copy from my post on the &lt;a href="http://inside.collibra.com/?p=75"&gt;Collibra company blog&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_brjtrRvqguI/SZQyhPqtUxI/AAAAAAAAABY/zodebxWhOxw/s1600-h/eclispe+meeting.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 153px;" src="http://4.bp.blogspot.com/_brjtrRvqguI/SZQyhPqtUxI/AAAAAAAAABY/zodebxWhOxw/s320/eclispe+meeting.png" alt="" id="BLOGGER_PHOTO_ID_5301918208044651282" border="0" /&gt;&lt;/a&gt;Yesterday Hendrik from Sigasi and I organised the first regional Eclipse community meeting in Belgium. We had people from industry (Sigasi, Inventive Designers and Collibra) and academia (VUB students and a researcher from STARLab). Considering the very short notice on which we organised this and the "just-getting-to-know-each-other" intent of the meeting, this is quite reasonable.&lt;br /&gt;&lt;br /&gt;We demonstrated our usage of Eclipse, and it is impressive to see how slick you can make your Eclipse product look. You get lots of stuff for free, but of course, we all had our complaints about lacking documentation and unresolved bug fixes. Nevertheless, in general the benefits far outweigh the negative experiences.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_brjtrRvqguI/SZQypr_OtDI/AAAAAAAAABg/LKpRtQ58B7M/s1600-h/photo.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_brjtrRvqguI/SZQypr_OtDI/AAAAAAAAABg/LKpRtQ58B7M/s320/photo.jpg" alt="" id="BLOGGER_PHOTO_ID_5301918353085871154" border="0" /&gt;&lt;/a&gt;Dieter from Inventive Designers demonstrated Scriptura, an application for document flow control and reporting. They have been working with Eclipse since version 3.0 and have built up extensive experience after all those years. We really look forward to learning more from these guys, as they had to learn about some sharp edges in Eclipse the hard way.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Hendrik showed the Sigasi Hardware Development Tool that basically finally provides a real IDE for the VHDL language. Support for code completion, syntax highlighting, refactoring, etc. These are things we as software engineers take for granted, but are not so common for hardware developers. Eclipse really shines in reuse when you're extending the IDE.&lt;br /&gt;&lt;br /&gt;We of course demonstrated our Collibra Studio that is still hard in development. We received many ideas from the discussions afterwards on how to improve our tools. This really makes this kind of community event very useful. Seeing how others solved problems can work very inspirational. It is tempting to lose focus with all these low hanging fruits :)&lt;br /&gt;&lt;br /&gt;It is really hard to imagine that there was still no organisation of the eclipse community in Belgium. We now took the first steps in what will hopefully become a large community. Though I am confident that this will become a success. The enthusiasm of the participants and the support from the Eclipse foundation make that a sure bet.&lt;br /&gt;&lt;br /&gt;I was actually quite surprised by how helpful the foundation is. Ralph Mueller from the foundation was very supportive and I'd be thrilled to invite him for one of our next events. We will make sure that there is enough time to announce this properly then.&lt;br /&gt;&lt;br /&gt;If you would be interested to join the community, feel free to contact me. You could also take a look at the wiki set up on the Eclipse site.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15902051-5334530867065556551?l=damientrog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://damientrog.blogspot.com/feeds/5334530867065556551/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15902051&amp;postID=5334530867065556551' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15902051/posts/default/5334530867065556551'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15902051/posts/default/5334530867065556551'/><link rel='alternate' type='text/html' href='http://damientrog.blogspot.com/2009/02/belgian-eclipse-community-meeting.html' title='Belgian Eclipse Community Meeting'/><author><name>Damien</name><uri>http://www.blogger.com/profile/12374227311695325950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://3.bp.blogspot.com/-D99xqNcUWtQ/TXN3s_XaoNI/AAAAAAAAACY/V4wuBRdDUnA/s220/Damien_small.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_brjtrRvqguI/SZQyhPqtUxI/AAAAAAAAABY/zodebxWhOxw/s72-c/eclispe+meeting.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15902051.post-913195693462211473</id><published>2009-02-05T18:46:00.002+01:00</published><updated>2009-02-05T18:50:54.052+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='back'/><title type='text'>I'm back</title><content type='html'>I finally did it it! I started blogging again after 2 years and a half of silence. During this time an unimaginable amount of things happened. That of course has the advantage I have a lot of stuff to write about. But that's for a next post :)&lt;br /&gt;&lt;br /&gt;Expect more posts about Collibra (our company), semantic technology, Eclipse, Macs, Wine and my travels.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15902051-913195693462211473?l=damientrog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://damientrog.blogspot.com/feeds/913195693462211473/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15902051&amp;postID=913195693462211473' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15902051/posts/default/913195693462211473'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15902051/posts/default/913195693462211473'/><link rel='alternate' type='text/html' href='http://damientrog.blogspot.com/2009/02/im-back.html' title='I&apos;m back'/><author><name>Damien</name><uri>http://www.blogger.com/profile/12374227311695325950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://3.bp.blogspot.com/-D99xqNcUWtQ/TXN3s_XaoNI/AAAAAAAAACY/V4wuBRdDUnA/s220/Damien_small.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15902051.post-115409606265673445</id><published>2006-07-28T16:14:00.000+02:00</published><updated>2006-07-28T16:37:34.006+02:00</updated><title type='text'>Using Accessory Views in Print Panel</title><content type='html'>&lt;h2&gt;Intended Audience&lt;/h2&gt;&lt;br /&gt;Intended for people having difficulties with accessory views in the print panel. Especially on how to handle option changes in this accessory view.&lt;br /&gt;Level: Intermediate&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Problem&lt;/h2&gt;&lt;br /&gt;Lately for a project I was quite stuck on how to let the user set some options in the print panel. Especially the apple docs were not very helpful, so that's why I decided to write this quick how-to. I also searched the web if there was any information available from other sources, but did not find anything.&lt;br /&gt;&lt;br /&gt;So here's the deal: I have an application that lets teachers create exams. Now the teacher can choose whether (s)he wants to print solutions along with the questions in such an exam (e.g. for teaching assistants whom correct the exams). The most intuitive place to put this option is in the print panel itself. There we add a checkbox "Print solutions". You can see this on the picture below, note that the name of the application is Questions.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/1278/1489/1600/Picture%200.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/1278/1489/400/Picture%200.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;So now we know what our goal is, next we take a look on how we reach this goal.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Solution&lt;/h2&gt;&lt;br /&gt;The checkbox with "print solutions; is contained into a custom view, which is augmented to the print panel. This is also known as an accessory view. I simply add the view to my MainMenu.nib and bind the value of the checkbox to a custom key, named PrintSolutions, in the Shared Defaults. Don't worry if no Shared Defaults instance is shown in MainMenu.nib yet, it will be automatically added when you bind a value to it.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/1278/1489/1600/Picture%202.png"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/1278/1489/400/Picture%202.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now we can query the state of PrintSolutions from anywhere in our applications by asking the shared defaults. We could do this like this:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;[[NSUserDefaultsController sharedUserDefaultsController] values] valueForKey:@"PrintSolutions"];&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;To be able to access our PrintAccessoryView (which contains our checkbox) from code we add an outlet in our AppDelegate (or whichever class that catches the print action). &lt;br /&gt;&lt;br /&gt;&lt;pre&gt; IBOutlet NSView *printAccessoryView;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The next step is to add our view to the print panel. This is where my approach differs from Apple's documentation. But first how the docs of Apple do it:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;- (void)print:(id)sender;&lt;br /&gt;{&lt;br /&gt; // create a printable view for our exam and create a print operation with this view&lt;br /&gt; ...&lt;br /&gt; NSView *examView = [examPrintView printableView];&lt;br /&gt;    NSPrintOperation *op = [NSPrintOperation printOperationWithView:examView];&lt;br /&gt;&lt;br /&gt;    [op setAccessoryView:printAccessoryView];&lt;br /&gt;    [op runOperation];&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;So first we create our view for the exam, not knowing whether the user wants the solutions or not, and create a printoperation that will print this view. Next, we add our accessory view to the panel, so that user can make his choice whether he wants the answers printed or not. Finally we fire the operation away by calling runOperation. When run operation is called the print panel shows up and then our user can click on the checkbox.&lt;br /&gt;&lt;br /&gt;The problem is, that it is already too late now. The printable view for the exam has already been created and passed to the printoperation for printing. Whatever the user clicks in the printing panel will not have any effect. Thus, we need a solution where we first show the panel and afterwards create the view and fire up the printoperation.&lt;br /&gt;&lt;br /&gt;Here is my solution:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;- (void)print:(id)sender;&lt;br /&gt;{&lt;br /&gt; NSPrintPanel *printPanel = [NSPrintPanel printPanel];&lt;br /&gt; [printPanel setAccessoryView:printAccessoryView];&lt;br /&gt; &lt;br /&gt; [printPanel beginSheetWithPrintInfo:[NSPrintInfo sharedPrintInfo] &lt;br /&gt;       modalForWindow:[self window] &lt;br /&gt;          delegate:self &lt;br /&gt;       didEndSelector:@selector(printPanelDidEnd:returnCode:contextInfo:) &lt;br /&gt;       contextInfo:nil];&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;In this approach we just create a print panel and fire away the panel with a callback to the &lt;pre&gt;printPanelDidEnd:returnCode:contextInfo:&lt;/pre&gt; selector. And here's what this looks like:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;- (void)printPanelDidEnd:(NSPrintPanel *)printPanel returnCode:(int)returnCode contextInfo:(void *)contextInfo&lt;br /&gt;{&lt;br /&gt; if (returnCode == NSOKButton) {  &lt;br /&gt;  BOOL printSolutions = [[defaults valueForKey:@"PrintSolutions"] boolValue];&lt;br /&gt;  &lt;br /&gt;  // Create the printable view with or without the solutions&lt;br /&gt;  ...&lt;br /&gt;  NSView *examView = printSolutions ? [examPrintView printableView] : [examPrintView printableViewWithSolutions];&lt;br /&gt;&lt;br /&gt;  // PrintOperation&lt;br /&gt;  NSPrintOperation *printOperation;&lt;br /&gt;  printOperation = [NSPrintOperation printOperationWithView:examView printInfo:printInfo];&lt;br /&gt;  [printOperation setShowsPrintPanel:NO];&lt;br /&gt;  [printOperation setShowsProgressPanel:YES];&lt;br /&gt;  [printOperation runOperation];&lt;br /&gt;  &lt;br /&gt;  // Clean up the sheet&lt;br /&gt;  [NSApp endSheet:[[self window] attachedSheet]]; &lt;br /&gt;  [[[self window] attachedSheet] close];&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Now we have control over our view before we run the printoperation. So we first can check the value of our defaults and build up a different view accordingly. Pay attention that you also turn off showing of the print panel in the print operation with setShowsPrintPanel:NO. Otherwise you will show the print panel twice.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;br /&gt;So now we've learned how to read the options set by the user in the accessory view of the print panel, before running a print operation. I guess the approach found in Apple's docs also works, but is a little trickier and less efficient. When the user makes a change in the accessory view, this could fire up an action that changes the printable view somehow. For example when the user clicks the checkbox, an action &lt;pre&gt;togglePrintSolutions:&lt;/pre&gt; could be fired. This method could in its turn then rebuild the view that was passed to printoperation, etc...&lt;br /&gt;&lt;br /&gt;This is an elegant solution and I am puzzled why Apple didn't put this in its Printing documentation. Or maybe I just missed it. Anyway, I hope this proves helpful to someone.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Acknowledgments&lt;/h2&gt;&lt;br /&gt;I did not come up with this solution entirely by myself. When I could not find any documentation on this, I started looking at open source projects, to see how they solved it. The first one I found which solved my problem was Smultron by Peter Borg. So I am very grateful to Peter for his code, and I owe the solution entirely to him. Incidentally, it even looks to be a nice text editor that is well coded. I advise everyone to check it out.&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;References&lt;/h2&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://developer.apple.com/documentation/Cocoa/Conceptual/Printing/Printing.pdf"&gt;Apple Printing Docs&lt;/a&gt; &lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://smultron.sourceforge.net/"&gt;Smultron&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15902051-115409606265673445?l=damientrog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://damientrog.blogspot.com/feeds/115409606265673445/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15902051&amp;postID=115409606265673445' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15902051/posts/default/115409606265673445'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15902051/posts/default/115409606265673445'/><link rel='alternate' type='text/html' href='http://damientrog.blogspot.com/2006/07/using-accessory-views-in-print-panel.html' title='Using Accessory Views in Print Panel'/><author><name>Damien</name><uri>http://www.blogger.com/profile/12374227311695325950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://3.bp.blogspot.com/-D99xqNcUWtQ/TXN3s_XaoNI/AAAAAAAAACY/V4wuBRdDUnA/s220/Damien_small.png'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15902051.post-113023296647826640</id><published>2005-10-25T11:25:00.000+02:00</published><updated>2005-10-25T11:36:21.256+02:00</updated><title type='text'>Graphical Editing Framework for Cocoa</title><content type='html'>For my apprenticeship I am working on a project in Java in the Eclipse framework. Because we're working on a visual editor we make use of GEF (Graphical Editing Framework). The documentation for this is rather poor, but that's not the point of my post.&lt;br /&gt;&lt;br /&gt;Now I have been searching for a similar framework in Cocoa, but haven't found anything. So here comes my mad megalomanic idea. Let's start a project on sourceforge to make our own framework, based on GEF. Of course making use of the idiosyncrasies of Objective-C and Cocoa, instead of the Java stuff in GEF.&lt;br /&gt;&lt;br /&gt;I really believe such a project could provide a boost in Cocoa application development. Some input from other developers would be nice.&lt;br /&gt;&lt;br /&gt;Mind, that I currently don't have time to immediately start something like that. Just some thoughts and dreams for the moment.&lt;br /&gt;&lt;br /&gt;References:&lt;br /&gt;&lt;a href=http://www.eclipse.org&gt;Eclipse: http://www.eclipse.org&lt;/a&gt;&lt;br /&gt;&lt;a href=http://www.eclipse.org/gef/&gt;Gef: http://www.eclipse.org/gef/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15902051-113023296647826640?l=damientrog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://damientrog.blogspot.com/feeds/113023296647826640/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15902051&amp;postID=113023296647826640' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15902051/posts/default/113023296647826640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15902051/posts/default/113023296647826640'/><link rel='alternate' type='text/html' href='http://damientrog.blogspot.com/2005/10/graphical-editing-framework-for-cocoa.html' title='Graphical Editing Framework for Cocoa'/><author><name>Damien</name><uri>http://www.blogger.com/profile/12374227311695325950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://3.bp.blogspot.com/-D99xqNcUWtQ/TXN3s_XaoNI/AAAAAAAAACY/V4wuBRdDUnA/s220/Damien_small.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15902051.post-112845590801073459</id><published>2005-10-04T21:40:00.000+02:00</published><updated>2005-10-23T23:45:11.476+02:00</updated><title type='text'>Localized strings with a specified localization</title><content type='html'>I have been searching for a way to get a localized string for a specified localization for some time now. Finally I have found the solution. Well to be honest, I was given the solution by a certain Douglas Davidson on the CocoaDev mailing list. Thank you very much Douglas!&lt;br /&gt;&lt;br /&gt;Here's the problem: Assume you have an application which has multiple localizations, but needs to access the localizations besides the preferred localization of the user at runtime. A simple example could be an App that I am currently working on, which among other things prepares exams for teachers. Those exams could be in a different language than the one the program is currently running in. I would like to use something similar to NSLocalizedString for the static text on the exam.&lt;br /&gt;&lt;br /&gt;After finding out this wasn't provided by NSBundle in Cocoa yet, I have decided to make a category which adds support for this.&lt;br /&gt;The important thing here is the macro NSLocalizedStringForLocalization. This is essentially the same as NSLocalizedString, except that you can specify the localization you want. Check out the code:&lt;br /&gt;&lt;a href="http://wilma.vub.ac.be/~dtrog/code_examples/NSBundle_Extensions.h"&gt;NSBundle_Extensions.h&lt;/a&gt;&lt;br /&gt;&lt;a href="http://wilma.vub.ac.be/~dtrog/code_examples/NSBundle_Extensions.m"&gt;NSBundle_Extensions.m&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;[update] The strings dictionary is now cached&lt;br /&gt;[update 2] Fixed bug explained in comments by Jonathon&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15902051-112845590801073459?l=damientrog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://damientrog.blogspot.com/feeds/112845590801073459/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15902051&amp;postID=112845590801073459' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15902051/posts/default/112845590801073459'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15902051/posts/default/112845590801073459'/><link rel='alternate' type='text/html' href='http://damientrog.blogspot.com/2005/10/localized-strings-with-specified.html' title='Localized strings with a specified localization'/><author><name>Damien</name><uri>http://www.blogger.com/profile/12374227311695325950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://3.bp.blogspot.com/-D99xqNcUWtQ/TXN3s_XaoNI/AAAAAAAAACY/V4wuBRdDUnA/s220/Damien_small.png'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15902051.post-112542854865338035</id><published>2005-08-30T20:55:00.000+02:00</published><updated>2006-07-28T16:23:52.340+02:00</updated><title type='text'>Delirium Tremens</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/1278/1489/1600/kallen.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/1278/1489/1600/kallen.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I've tried out a new beer today called Delirium Tremens. It's brewed in Melle (Belgium) which is actually only 10km from where I live. I must say it's a real shame that I didn't try it out any sooner. This is really A-class beer.&lt;br /&gt;&lt;br /&gt;I like it so much I decided to do some research on it, and it turns out that this beer has been elected as best beer in the word in 1997. The description in the image is true poetry and I could only say amen to that.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15902051-112542854865338035?l=damientrog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://damientrog.blogspot.com/feeds/112542854865338035/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15902051&amp;postID=112542854865338035' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15902051/posts/default/112542854865338035'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15902051/posts/default/112542854865338035'/><link rel='alternate' type='text/html' href='http://damientrog.blogspot.com/2005/08/delirium-tremens.html' title='Delirium Tremens'/><author><name>Damien</name><uri>http://www.blogger.com/profile/12374227311695325950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://3.bp.blogspot.com/-D99xqNcUWtQ/TXN3s_XaoNI/AAAAAAAAACY/V4wuBRdDUnA/s220/Damien_small.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15902051.post-112534005952324432</id><published>2005-08-29T20:17:00.000+02:00</published><updated>2005-08-29T21:35:05.813+02:00</updated><title type='text'>Logging method invocations in Objective C</title><content type='html'>Here is a code fragment I use to log method invocations in Objective-C. The great advantage of Objective-C is that you can find out what the name of the method is that is executing. I don't believe this is possible in a language like Java.&lt;br /&gt;&lt;table class="codeTable"&gt;&lt;br /&gt;&lt;tr&gt;&lt;td class="codeHeader"&gt;QSLogMethodInvocation macro&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td  class="codeCell"&gt;// Prints a line in the console stating the name of the&lt;br /&gt;//  method that is invoked.&lt;br /&gt;//&lt;br /&gt;// For example if class Foo has a method bar, the definition&lt;br /&gt;// of bar in the class Foo could contain QSLogMethodInvocation().&lt;br /&gt;// The following message will be logged: Invoked bar from class Foo&lt;br /&gt;#define QSLogMethodInvocation()\&lt;br&gt;   NSLog(@"[LOG] Invoked %@ from class %@",\&lt;br&gt;        [NSString stringWithCString:(char *)_cmd], [self class])&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;table class="codeTable"&gt;&lt;tr&gt;  &lt;td class="codeHeader"&gt;QSLogAbstractMethodInvocationError macro&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td  class="codeCell"&gt;// Prints a line in the console stating an abstract method&lt;br /&gt;// was invoked.&lt;br /&gt;//&lt;br /&gt;// For example if class Foo has an abstract method bar,&lt;br /&gt;// the definition of bar in the class Foo should contain &lt;br /&gt;// QSLogAbstractMethodInvocationError().&lt;br /&gt;// The following message will be logged:&lt;br /&gt;// Error (Foo): abstract method bar invoked&lt;br /&gt;#define QSLogAbstractMethodInvocationError()\&lt;br&gt;    NSLog(@"[LOG] Error (%@): abstract method %@ invoked",\&lt;br&gt;         [self class], [NSString stringWithCString:(char *)_cmd])&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15902051-112534005952324432?l=damientrog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://damientrog.blogspot.com/feeds/112534005952324432/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15902051&amp;postID=112534005952324432' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15902051/posts/default/112534005952324432'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15902051/posts/default/112534005952324432'/><link rel='alternate' type='text/html' href='http://damientrog.blogspot.com/2005/08/logging-method-invocations-in.html' title='Logging method invocations in Objective C'/><author><name>Damien</name><uri>http://www.blogger.com/profile/12374227311695325950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://3.bp.blogspot.com/-D99xqNcUWtQ/TXN3s_XaoNI/AAAAAAAAACY/V4wuBRdDUnA/s220/Damien_small.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15902051.post-112526888805140328</id><published>2005-08-29T00:35:00.000+02:00</published><updated>2005-08-29T00:44:56.166+02:00</updated><title type='text'>First post</title><content type='html'>Here is the classical first post.&lt;br /&gt;&lt;br /&gt;Welcome to my blog! I will be writing some information about my private and professional life on this blog. This will mainly be about development of Cocoa applications and my studies.&lt;br /&gt;&lt;br /&gt;Hopefully this will grow out to be a fun and resourceful venture for me and you readers.&lt;br /&gt;&lt;br /&gt;I am pleasantly surprised by the clean interface of blogger.com. Last year I had a project to develop a blogging application, as a project for my studies, with a group. The results are visible on this site: &lt;a href="http://wilma.vub.ac.be/~se5_2005/"&gt;se5_2005&lt;/a&gt;. Upon request I could start up the blog portal application itself on the server.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15902051-112526888805140328?l=damientrog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://damientrog.blogspot.com/feeds/112526888805140328/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15902051&amp;postID=112526888805140328' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15902051/posts/default/112526888805140328'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15902051/posts/default/112526888805140328'/><link rel='alternate' type='text/html' href='http://damientrog.blogspot.com/2005/08/first-post.html' title='First post'/><author><name>Damien</name><uri>http://www.blogger.com/profile/12374227311695325950</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://3.bp.blogspot.com/-D99xqNcUWtQ/TXN3s_XaoNI/AAAAAAAAACY/V4wuBRdDUnA/s220/Damien_small.png'/></author><thr:total>0</thr:total></entry></feed>
