<?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-7665691180445113014</id><updated>2012-02-16T20:40:24.629+01:00</updated><category term='Story'/><category term='Development'/><category term='day in tatry'/><category term='Xcode'/><category term='JacORB'/><category term='dzień w tatrach'/><category term='script'/><category term='Que'/><category term='SCA'/><category term='Nintendo DS'/><category term='Mac OS X'/><category term='CORBA'/><category term='Cocoa'/><category term='Qub3DS'/><category term='AMI'/><category term='Java'/><category term='Quickies'/><category term='SOA'/><category term='GSoC2008'/><category term='Programming'/><category term='humor'/><category term='Apache Tuscany'/><category term='Erlang'/><title type='text'>Foomatik blog</title><subtitle type='html'>Only tech stuff. News and updates about my projects, random thoughts.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.foomatik.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://blog.foomatik.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Wojtek</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>40</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7665691180445113014.post-7325693249840650556</id><published>2011-07-16T11:36:00.012+02:00</published><updated>2011-07-16T12:16:37.409+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Xcode'/><category scheme='http://www.blogger.com/atom/ns#' term='Quickies'/><category scheme='http://www.blogger.com/atom/ns#' term='Mac OS X'/><title type='text'>Tech quickies: How to restore PowerPC support in Xcode 3.2.6</title><content type='html'>&lt;div style="text-align: left;"&gt;Starting from Xcode 3.2.6  Apple dropped support for PPC architecture. What is even worse there's a big chance that you won't event notice it - I didn't and it caused releasing Que 1.3 build without PPC architecture.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;Fortunately there is still easy way to restore PowerPC builds in Xcode. To do that you just need to change settings for your build target (right click on target and choose "Get Info"). Your current settings (without PPC) should look like:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;img src="http://2.bp.blogspot.com/-TnwhyiW1uD4/TiFfapt00_I/AAAAAAAAAGI/gAEGo7aGQ_M/s1600/Screen%2Bshot%2B2011-07-16%2Bat%2B11.48.09.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5629885920669127666" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; " /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;Click on current architecture (the one marked with red rectangle), popup menu will appear - choose "Other..." option, following sheet should appear:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;img src="http://3.bp.blogspot.com/-fWPwqwo_Lm4/TiFf8oz94XI/AAAAAAAAAGQ/ocVdFFb2X_E/s1600/Screen%2Bshot%2B2011-07-16%2Bat%2B11.48.52.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5629886504542003570" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; " /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;Now you need to edit architecture list, Que app supports i386 and PPC so for my case I deleted $(ARCHS_STANDARD_32_64_BIT) and added two other architectures:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;img src="http://3.bp.blogspot.com/-eFDi3D5W9eo/TiFjoVwWuyI/AAAAAAAAAGg/vSyQnG5z848/s1600/Screen%2Bshot%2B2011-07-16%2Bat%2B11.49.27.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5629890553875708706" style="display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; text-align: center; cursor: pointer; " /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;Click OK and you should be set up. &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;You can easily test if it works for you - make a new build and check if output binary contains selected architecture - to do that just use &lt;b&gt;file&lt;/b&gt; program (Unix command line tool for determining type of FILEs):&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="line-height: 18px; "&gt;&lt;span class="Apple-style-span"&gt;&lt;div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.75em; margin-left: 0px; line-height: 1.3em; "&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal; "&gt;&lt;span class="Apple-style-span" style="line-height: 18px; "&gt;&lt;pre style="background-color: rgb(238, 238, 238); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-top-color: rgb(153, 153, 153); border-right-color: rgb(153, 153, 153); border-bottom-color: rgb(153, 153, 153); border-left-color: rgb(153, 153, 153); line-height: 14px; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; overflow-x: auto; overflow-y: auto;  "&gt;&lt;p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font: normal normal normal 11px/normal Menlo; "&gt;&lt;span class="Apple-style-span" style="white-space: normal; "&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;mymachine:~ wojtek$ &lt;b&gt;file ~/que/trunk/build/Release/Que.app/Contents/MacOS/Que&lt;/b&gt; &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;/Users/wojtek/que/trunk/build/Release/Que.app/Contents/MacOS/Que: Mach-O universal binary with 2 architectures&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;/Users/wojtek/que/trunk/build/Release/Que.app/Contents/MacOS/Que (for architecture ppc7400):&lt;span class="Apple-tab-span" style="white-space: pre; "&gt; &lt;/span&gt;&lt;b&gt;Mach-O executable ppc&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;/Users/wojtek/que/trunk/build/Release/Que.app/Contents/MacOS/Que (for architecture i386):&lt;span class="Apple-tab-span" style="white-space: pre; "&gt; &lt;/span&gt;&lt;b&gt;Mach-O executable i386&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="font-size: 12px; "&gt;&lt;/p&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.75em; margin-left: 0px; line-height: 1.3em; "&gt;&lt;span class="Apple-style-span"&gt;As you can see everything worked fine and Que binary has 2 architectures. That's it.&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7665691180445113014-7325693249840650556?l=blog.foomatik.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.foomatik.com/feeds/7325693249840650556/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7665691180445113014&amp;postID=7325693249840650556' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/7325693249840650556'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/7325693249840650556'/><link rel='alternate' type='text/html' href='http://blog.foomatik.com/2011/07/tech-quickies-how-to-restore-powerpc.html' title='Tech quickies: How to restore PowerPC support in Xcode 3.2.6'/><author><name>Wojtek</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-TnwhyiW1uD4/TiFfapt00_I/AAAAAAAAAGI/gAEGo7aGQ_M/s72-c/Screen%2Bshot%2B2011-07-16%2Bat%2B11.48.09.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7665691180445113014.post-7656601173793618814</id><published>2011-07-05T21:47:00.007+02:00</published><updated>2011-07-16T12:18:55.221+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mac OS X'/><category scheme='http://www.blogger.com/atom/ns#' term='Que'/><title type='text'>Que 1.3.1 is out.</title><content type='html'>This release is mainly quick fix for missing PowerPC architecture - Apple dropped official support for this architecture in Xcode starting from version 3.2.6 - I didn't event notice that 1.3 build wasn't prepared PowerPC.&lt;div&gt;Fortunately there is easy way to make universal build in Xcode 3.2.6, which I will write about in &lt;a href="http://blog.foomatik.com/search/label/Quickies"&gt;Tech Quickies&lt;/a&gt; soon.&lt;/div&gt;&lt;div&gt;&lt;b&gt;Update:&lt;/b&gt; There is &lt;a href="http://blog.foomatik.com/2011/07/tech-quickies-how-to-restore-powerpc.html"&gt;new blog entry on restoring PowerPC architecture in Xcode 3.2.6&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://que.foomatik.com/Que1.3.1.zip"&gt;Download Que 1.3.1 here&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7665691180445113014-7656601173793618814?l=blog.foomatik.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.foomatik.com/feeds/7656601173793618814/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7665691180445113014&amp;postID=7656601173793618814' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/7656601173793618814'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/7656601173793618814'/><link rel='alternate' type='text/html' href='http://blog.foomatik.com/2011/07/que-131-is-out.html' title='Que 1.3.1 is out.'/><author><name>Wojtek</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7665691180445113014.post-7851208841579257228</id><published>2011-06-29T09:03:00.004+02:00</published><updated>2011-07-06T09:27:45.414+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mac OS X'/><category scheme='http://www.blogger.com/atom/ns#' term='Que'/><title type='text'>Que 1.3 and Online dictionaries released!</title><content type='html'>New version of Que goes live. This long lasting phase of development and testing brings brand new category of features called &lt;span style="font-weight: bold;"&gt;Online dictionaries. &lt;/span&gt;Its main purpose is to provide possibility to share dictionaries via internet. Here's what you can do with it:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;browse list of dictionaries&lt;/li&gt;&lt;li&gt;download dictionary you are interested in&lt;/li&gt;&lt;li&gt;upload your dictionary&lt;/li&gt;&lt;/ul&gt;All features are build in application and are extremally easy to use. Here's example window with dictionary list:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://que.foomatik.com/wp/wp-content/uploads/2011/01/online-dictionaries.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 250px; height: 170px;" src="http://que.foomatik.com/wp/wp-content/uploads/2011/01/online-dictionaries.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Online dictionaries&lt;/span&gt; is all about community. It means that it's content is provided by and for users. It's free and to use key features you'll need to follow simple registration process (only nickname, e-mail address and password is required). Once you confirm your e-mail address you are all set up to use all new exciting features.&lt;br /&gt;&lt;br /&gt;As usual, new version of Que also brings some usability improvements which hopefully will make your Que experience even better&lt;span style="font-weight: bold;"&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Are you already Que user? Do you have some dictionaries filled in?&lt;/span&gt; Contribute to Que project and upload your dictionaries.&lt;br /&gt;&lt;span class="Apple-style-span" style=" ;font-size:large;" &gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Requirements&lt;/span&gt;&lt;/span&gt;&lt;div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.75em; margin-left: 0px; line-height: 1.3em; "&gt;&lt;ul&gt;&lt;li&gt;Mac OS X 10.5 or Mac OS X 10.6&lt;/li&gt;&lt;li&gt;Intel or PowerPC processor&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;  font-size:large;" &gt;Feedback&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As usual comments, ideas, suggestions are welcome. Contact me at &lt;a href="mailto:wojtek.janiszewski@gmail.com"&gt;wojtek.janiszewski@gmail.com&lt;/a&gt;.&lt;b&gt;&lt;span class="Apple-style-span" style=" ;font-size:large;" &gt;&lt;br /&gt;&lt;br /&gt;Download&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.75em; margin-left: 0px; line-height: 1.3em; "&gt;&lt;br /&gt;&lt;a href="http://que.foomatik.com/Que1.3.zip"&gt;Download Que 1.3 here&lt;/a&gt;&lt;span class="Apple-style-span" style="font-weight: bold; "&gt;&lt;span class="Apple-style-span" style=" ;font-size:large;" &gt;&lt;br /&gt;&lt;br /&gt;Project home page&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Visit &lt;a href="http://que.foomatik.com/"&gt;que.foomatik.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7665691180445113014-7851208841579257228?l=blog.foomatik.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.foomatik.com/feeds/7851208841579257228/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7665691180445113014&amp;postID=7851208841579257228' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/7851208841579257228'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/7851208841579257228'/><link rel='alternate' type='text/html' href='http://blog.foomatik.com/2011/07/que-13-and-online-dictionaries-released.html' title='Que 1.3 and Online dictionaries released!'/><author><name>Wojtek</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7665691180445113014.post-8574759006454860243</id><published>2011-04-18T20:11:00.002+02:00</published><updated>2011-06-13T09:14:37.166+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Quickies'/><title type='text'>Tech quickies: bulk mail, decent hyperlink matters!</title><content type='html'>&lt;div&gt;&lt;p class="p1"&gt;Sending e-mails from your application can be tricky. Todays spam filters are doing really great job sorting out junk e-mails, but they also can be a problem for legit web creators. There are some resources on the internet about creating proper newsletters, the first thing you want to read is probably &lt;a href="https://mail.google.com/support/bin/answer.py?answer=81126"&gt;Bulk Senders Guidelines&lt;/a&gt; by Google.&lt;/p&gt;&lt;p class="p1"&gt;Recently I bumped into problem registration e-mails were classified as spam, even with signed DKIM and all other juicy stuff. Long story short, the registration e-mail had registration confirmation hyperlink in it and obviously it was too long, ie:&lt;/p&gt;&lt;p class="p1"&gt;&lt;a href="http://host.tld/registration/confirmRegistration.do?id=123&amp;amp;confirmationCode=FJK947MNHL89BHGFJHMMNG"&gt;http://host.tld/registration/confirmRegistration.do?id=123&amp;amp;confirmationCode=FJK947MNHL89BHGFJHMMNG&lt;/a&gt;&lt;/p&gt;&lt;p class="p1"&gt;The solution was to cut link to shorter form, as ie:&lt;/p&gt;&lt;p class="p1"&gt;&lt;a href="http://host.tld/cr.do?id=123&amp;amp;cc=FJK947MNHL89BHGFJHMMNG"&gt;http://host.tld/cr.do?id=123&amp;amp;cc=FJK947MNHL89BHGFJHMMNG&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7665691180445113014-8574759006454860243?l=blog.foomatik.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.foomatik.com/feeds/8574759006454860243/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7665691180445113014&amp;postID=8574759006454860243' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/8574759006454860243'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/8574759006454860243'/><link rel='alternate' type='text/html' href='http://blog.foomatik.com/2011/06/bulk-mail-decent-hyperlink-matters.html' title='Tech quickies: bulk mail, decent hyperlink matters!'/><author><name>Wojtek</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7665691180445113014.post-1720630812496391060</id><published>2011-03-25T21:57:00.003+01:00</published><updated>2011-05-29T22:16:16.092+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Que'/><title type='text'>Happy 1st birthday Que!</title><content type='html'>&lt;a href="http://www.budgetsavvydiva.com/wp-content/uploads/2011/03/birthday-cake1.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 100px; height: 105px;" src="http://www.budgetsavvydiva.com/wp-content/uploads/2011/03/birthday-cake1.jpg" border="0" alt="" /&gt;&lt;/a&gt;I'm proud to announce that exactly one year ago &lt;a href="http://blog.foomatik.com/2010/03/que-for-mac-os-x-memorizing-and.html"&gt;first version of Que was released&lt;/a&gt;. This is my first such long term, non profit and personal project. Hope it will last for many years!&lt;br /&gt;&lt;br /&gt;This is great occasion to show some numbers!&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;over &lt;b&gt;1&lt;/b&gt; year of development&lt;/li&gt;&lt;li&gt;&lt;b&gt;2&lt;/b&gt; different hosting providers used&lt;/li&gt;&lt;li&gt;$&lt;b&gt;3&lt;/b&gt; donation received (thanks!)&lt;/li&gt;&lt;li&gt;&lt;b&gt;5&lt;/b&gt; versions released (1.0, 1.1, 1.1.1, 1.2, 1.2.1)&lt;/li&gt;&lt;li&gt;almost &lt;b&gt;6&lt;/b&gt; language versions (French in progress)&lt;/li&gt;&lt;li&gt;&lt;b&gt;11&lt;/b&gt; hours spent on website recovery after first provider server crash&lt;/li&gt;&lt;li&gt;$&lt;b&gt;54&lt;/b&gt; spent on hosting providers, domain&lt;/li&gt;&lt;li&gt;&lt;b&gt;119&lt;/b&gt; returning users (10 and more application launches)&lt;/li&gt;&lt;li&gt;&lt;b&gt;127&lt;/b&gt; SVN commits&lt;/li&gt;&lt;li&gt;&lt;b&gt;5754&lt;/b&gt; que.foomatik.com visits&lt;/li&gt;&lt;li&gt;&lt;b&gt;9523&lt;/b&gt; lines of Objective-C code (without header files)&lt;/li&gt;&lt;li&gt;&lt;b&gt;9823&lt;/b&gt; downloads (+ downloads hosted outside foomatik.com)&lt;/li&gt;&lt;li&gt;&lt;b&gt;13489&lt;/b&gt; registered application launches (+ launches without internet access or without application update check) &lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"&gt;&lt;b&gt;infinite&lt;/b&gt;&lt;/span&gt; amount of fun!&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Thanks for staying with me!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7665691180445113014-1720630812496391060?l=blog.foomatik.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.foomatik.com/feeds/1720630812496391060/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7665691180445113014&amp;postID=1720630812496391060' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/1720630812496391060'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/1720630812496391060'/><link rel='alternate' type='text/html' href='http://blog.foomatik.com/2011/05/happy-1st-birthday-que.html' title='Happy 1st birthday Que!'/><author><name>Wojtek</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7665691180445113014.post-3063926057763454007</id><published>2011-02-27T21:23:00.004+01:00</published><updated>2011-05-29T21:33:16.261+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Que'/><title type='text'>Russian and Ukrainian translations for Que, 1.2.1 release is out.</title><content type='html'>Que 1.2.1 version is out! It's just quick release which brings Russian and Ukrainian translations (thanks to Alexander Zhurovich and Illarion Khapersky). Currently I'm actively involved in development of stunning features, scheduled for 1.3 release, stay tuned for details.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://que.foomatik.com/Que1.2.1.zip"&gt;Download Que 1.2.1 here&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7665691180445113014-3063926057763454007?l=blog.foomatik.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.foomatik.com/feeds/3063926057763454007/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7665691180445113014&amp;postID=3063926057763454007' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/3063926057763454007'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/3063926057763454007'/><link rel='alternate' type='text/html' href='http://blog.foomatik.com/2011/02/russian-and-ukrainian-translations-for.html' title='Russian and Ukrainian translations for Que, 1.2.1 release is out.'/><author><name>Wojtek</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7665691180445113014.post-7349237559163636947</id><published>2011-01-09T17:27:00.005+01:00</published><updated>2011-01-09T17:42:48.632+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mac OS X'/><category scheme='http://www.blogger.com/atom/ns#' term='Que'/><title type='text'>Que 1.2 is out!</title><content type='html'>Que 1.2 is ready for downloads!&lt;div&gt;This release brings, in general, usability improvements. Now you can use word inspector to show and edit word properties, as well as see it's usages in files. Furthermore I've added new word property - comments - which will be useful in various cases, ie. commenting on word prononciation.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://que.foomatik.com/wp-content/uploads/2011/01/main.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 243px;" src="http://que.foomatik.com/wp-content/uploads/2011/01/main.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;Some of you will be pleased with possibility to hide unused dictionary columns (if you don't need "date added" for example). From now on you can also easily see which words doesn't belong to any file (helpful for missing entries), just use menu "Dictionary" on the left side. &lt;/div&gt;&lt;div&gt;There are also some more minor usability enhancements, just check them out by yourself!&lt;/div&gt;&lt;div&gt;What are the plans for now? Little break from coding and focus on planning new, exciting features which I hope will bring Que to the new level! I also didn't miss Apple releasing Mac App Store, which I'm thinking of too. Stay tuned.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.75em; margin-left: 0px; line-height: 1.3em; font-weight: bold; "&gt;&lt;span class="Apple-style-span"  style=" ;font-size:large;"&gt;Requirements&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.75em; margin-left: 0px; line-height: 1.3em; "&gt;&lt;ul&gt;&lt;li&gt;Mac OS X 10.5 or Mac OS X 10.6&lt;/li&gt;&lt;li&gt;Intel or PowerPC processor&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;span class="Apple-style-span"  style="font-weight: bold;  font-size:large;"&gt;Feedback&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As usual comments, ideas, suggestions are welcome. Contact me at &lt;a href="mailto:wojtek.janiszewski@gmail.com"&gt;wojtek.janiszewski@gmail.com&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.75em; margin-left: 0px; line-height: 1.3em; "&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style=" ;font-size:large;"&gt;Download&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.75em; margin-left: 0px; line-height: 1.3em; "&gt;&lt;br /&gt;&lt;a href="http://que.foomatik.com/Que1.2.zip"&gt;Download Que 1.2 here&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.75em; margin-left: 0px; line-height: 1.3em; "&gt;&lt;span class="Apple-style-span" style="font-weight: bold; "&gt;&lt;span class="Apple-style-span"  style=" ;font-size:large;"&gt;Project home page&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.75em; margin-left: 0px; line-height: 1.3em; "&gt;&lt;br /&gt;Visit &lt;a href="http://que.foomatik.com/"&gt;que.foomatik.com&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7665691180445113014-7349237559163636947?l=blog.foomatik.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.foomatik.com/feeds/7349237559163636947/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7665691180445113014&amp;postID=7349237559163636947' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/7349237559163636947'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/7349237559163636947'/><link rel='alternate' type='text/html' href='http://blog.foomatik.com/2011/01/que-12-is-out.html' title='Que 1.2 is out!'/><author><name>Wojtek</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7665691180445113014.post-6077089831851051595</id><published>2011-01-01T16:08:00.011+01:00</published><updated>2011-01-09T08:42:32.690+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mac OS X'/><category scheme='http://www.blogger.com/atom/ns#' term='Que'/><title type='text'>Que 1.2 development is almost over!</title><content type='html'>&lt;div style="text-align: left;"&gt;I'm really excited to tell you that major features scheduled for 1.2 release of Que are finished! Now it's time for project to enter tests phase which means you can expect this new peace of software to try really soon.&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Major changes:&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Inspector added, which simplifies working with word properties (see attached screenshot).&lt;/li&gt;&lt;li&gt;New word property added - comments.&lt;/li&gt;&lt;li&gt;Now you can choose which columns to display in dictionary view.&lt;/li&gt;&lt;li&gt;Navigation enhancements - special files: All words, Words without files.&lt;/li&gt;&lt;li&gt;Few Quiz usability enhancements.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;a href="http://que.foomatik.com/wp-content/uploads/que-1.2-preview.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 250px; height: 160px;" src="http://que.foomatik.com/wp-content/uploads/que-1.2-preview.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Most of above mentioned changes are ideas which came out from Que users. I'd like to thank you all for this great response I've received since releasing 1.1!&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/7665691180445113014-6077089831851051595?l=blog.foomatik.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.foomatik.com/feeds/6077089831851051595/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7665691180445113014&amp;postID=6077089831851051595' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/6077089831851051595'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/6077089831851051595'/><link rel='alternate' type='text/html' href='http://blog.foomatik.com/2011/01/que-12-development-is-almost-over.html' title='Que 1.2 development is almost over!'/><author><name>Wojtek</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7665691180445113014.post-5259727222970167941</id><published>2010-12-06T20:39:00.006+01:00</published><updated>2010-12-06T21:17:37.541+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dzień w tatrach'/><category scheme='http://www.blogger.com/atom/ns#' term='day in tatry'/><category scheme='http://www.blogger.com/atom/ns#' term='script'/><title type='text'>Day in Tatry mountains (Dzień w Tatrach)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://foomatik.com/img/tatry_button.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 100px; height: 100px;" src="http://foomatik.com/img/tatry_button.png" border="0" alt="" /&gt;&lt;/a&gt;I prefer not to write about my non-tech life on a tech blog (yes, I have some non-tech life and I quite enjoy it!:)) but I have to give you little background on project origin.&lt;div&gt;&lt;br /&gt;&lt;div&gt;&lt;i&gt;Recently I became sort of mountain geek person, which manifests ie. in various mountain journeys and hikes. Unfortunately most of my time I spend in the-flattest-part-of-Poland so usually I can admire mountains only via static webcams.&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;- Well here's some space for optimization - says the other geek in me, the Computer Geek - Instead of visiting this webcam couple times a day why not to create Unix script to capture webcam frames and make video of it? It could upload it on Youtube, generate HTML and do it every day. I bet other people would be also pleased with daily Tatry panoramas. And after a year you would have this huge archive!&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;- Well... let's code! Uhm, I mean, you code. - agreed Mountain Geek.&lt;/i&gt;&lt;/div&gt;&lt;div&gt;Thanks to powerful *nix scripting and command line capabilities it was possible for me to complete this weekend project easily delivering quite elegant solution. Here's what I used:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Bash script (shame on me?)&lt;/li&gt;&lt;li&gt;cron&lt;/li&gt;&lt;li&gt;wget&lt;/li&gt;&lt;li&gt;ffmpeg&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/youtube-upload/"&gt;youtube-upload&lt;/a&gt; (uses &lt;a href="http://code.google.com/p/gdata-python-client/"&gt;gdata-python-client&lt;/a&gt; library)&lt;/li&gt;&lt;li&gt;... and other basic command line tools&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;Script output can be found on &lt;a href="http://tatry.foomatik.com/"&gt;project page&lt;/a&gt;, updated daily.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here's the first (official!) video captured and published. Enjoy!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;object type="application/x-shockwave-flash" width="640" height="400" data="http://www.youtube.com/v/6Wn44Uid1ro"&gt;&lt;param name="movie" value="http://www.youtube.com/v/6Wn44Uid1ro"&gt;&lt;a href="http://get.adobe.com/flashplayer/" target="blank"&gt;&lt;img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get flash player to play to this file" width="88" height="31" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7665691180445113014-5259727222970167941?l=blog.foomatik.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.foomatik.com/feeds/5259727222970167941/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7665691180445113014&amp;postID=5259727222970167941' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/5259727222970167941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/5259727222970167941'/><link rel='alternate' type='text/html' href='http://blog.foomatik.com/2010/12/day-in-tatry-mountains-dzien-w-tatrach.html' title='Day in Tatry mountains (Dzień w Tatrach)'/><author><name>Wojtek</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7665691180445113014.post-5211185286597361612</id><published>2010-09-30T20:22:00.011+02:00</published><updated>2010-09-30T20:36:20.941+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Story'/><category scheme='http://www.blogger.com/atom/ns#' term='Programming'/><category scheme='http://www.blogger.com/atom/ns#' term='Development'/><title type='text'>Environment hell</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://dariuszpod.republika.pl/msdos/nakladki/pliki/vc.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 210px; height: 100px;" src="http://dariuszpod.republika.pl/msdos/nakladki/pliki/vc.png" border="0" alt="" /&gt;&lt;/a&gt;Long time ago, when there was no Internet, software was only distributed physically and run locally on users machines, developers had to cope with various possible runtime environments. Multitude of operating systems versions, hardware and installed libraries provided a little hell for a programmer to prepare his software to run everywhere. Not to mention performing tests on major combinations of components (not to mention all combinations, because nearly impossible). The truth is those day aren’t over which I (unfortunately) had to find out recently, while testing Que. It started with that I found out that my little piece of software behaved little bit different on various Mac OS X versions. Basically Que supports two latest major OS X editions (10.5 and 10.6) which I test on and I assumed every 10.5.x and 10.6.x will be OK. The biggest surprise for me was when I booted 10.5.6, which behaved different to 10.5.8.&lt;br /&gt;&lt;br /&gt;“So what, am I supposed to check every 10.5 and 10.6 release and redo all test scenarios?” I said to myself? Not to mention about installing, upgrading, deleting various OS X editions. Not to mention that I own only one Mac here...&lt;br /&gt;Then I just immediately recalled the beauty of thin client idea, web apps and all modern stuff which is going on right now. One code, run on remote machines and results returned as HTMLs, displayed the same way everywhere. Only one environment for your code to run and test. So I started to miss web development again.&lt;br /&gt;&lt;br /&gt;But it’s not so great as it sounds and the story about environment hell returns. Recently while doing some web related development work I started to struggle with problems with displaying UI components on various web browsers. Does it sound familiar to you? Bet you heard about programmers frustrations with weird Internet Explorer behaviors. But that’s not only the IE; we have couple more modern web browsers which we should provide support for: Firefox, Opera, Chrome, Safari... I didn’t realize about those subtle differences which can make hell out of your work day.&lt;br /&gt;&lt;br /&gt;So again, check your code on all browsers again, test them all... but hey, wait there’s also Firefox 3.4.7f  which can’t display this Javascript construction... and hey, in IE8 and older you cannot use opacity in CSS... and man, this Chrome sends some weird HTTP header, which cause application server to respond with some exotic content type, which your code doesn’t treat as a text, but something it cannot parse, so appears as a bug instead.&lt;br /&gt;&lt;br /&gt;Well, why I am actually complaining? I should remember that it passed only 40 years since the UNIX era started and IT is still a child, a spoiled and hyperactive teenager who thinks is grownup; it's developing fast, strong but still making so many mistakes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7665691180445113014-5211185286597361612?l=blog.foomatik.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.foomatik.com/feeds/5211185286597361612/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7665691180445113014&amp;postID=5211185286597361612' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/5211185286597361612'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/5211185286597361612'/><link rel='alternate' type='text/html' href='http://blog.foomatik.com/2010/09/environment-hell.html' title='Environment hell'/><author><name>Wojtek</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7665691180445113014.post-468006991397688928</id><published>2010-08-08T17:12:00.003+02:00</published><updated>2010-08-08T18:36:41.083+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mac OS X'/><category scheme='http://www.blogger.com/atom/ns#' term='Que'/><title type='text'>Dutch translation for Que, 1.1.1 release is out.</title><content type='html'>Que 1.1.1 version is out! It's just quick release which brings new, Dutch translation (thanks to Eddy Groen). New features are scheduled for version 1.2.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://que.foomatik.com/Que1.1.1.zip"&gt;Download Que 1.1.1 here&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7665691180445113014-468006991397688928?l=blog.foomatik.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.foomatik.com/feeds/468006991397688928/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7665691180445113014&amp;postID=468006991397688928' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/468006991397688928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/468006991397688928'/><link rel='alternate' type='text/html' href='http://blog.foomatik.com/2010/08/dutch-translation-for-que-111-release.html' title='Dutch translation for Que, 1.1.1 release is out.'/><author><name>Wojtek</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7665691180445113014.post-6105879356494565797</id><published>2010-07-22T21:57:00.016+02:00</published><updated>2010-07-22T22:23:01.749+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mac OS X'/><category scheme='http://www.blogger.com/atom/ns#' term='Que'/><title type='text'>Que 1.1 released!</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: rgb(85, 26, 139);"&gt;&lt;span class="Apple-style-span" style="text-decoration: underline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://que.foomatik.com/"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 128px; height: 128px;" src="http://que.foomatik.com/wp-content/themes/ultralight/images/logo.png" alt="" border="0" /&gt;&lt;/a&gt;At least, next version of Que is available. It introduces new great features and I'm all excited to start using it for my own language learning purposes.&lt;br /&gt;&lt;br /&gt;The most important changes are:&lt;br /&gt;- Advanced word grouping, you can create files and folders and organize them into hierarchical structure&lt;br /&gt;- Import/export features, comma separated values (CSV) format is supported&lt;br /&gt;&lt;br /&gt;Que 1.1 also brings many other little enhancements, UI candies and I strongly recommend you to test it by your own.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://que.foomatik.com/wp-content/uploads/2010/07/adding-words.png"&gt;&lt;img style="float: right; margin: 0pt 0pt 10px 10px; cursor: pointer; width: 240px; height: 160px;" src="http://que.foomatik.com/wp-content/uploads/2010/07/adding-words.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Thank you for being patient, have fun!&lt;br /&gt;&lt;br /&gt;&lt;div style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Requirements&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Mac OS X 10.5 or Mac OS X 10.6&lt;/li&gt;&lt;li&gt;Intel or PowerPC processor&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;span style="font-weight: bold;font-size:large;" class="Apple-style-span" &gt;Feedback&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As usual comments, ideas, suggestions are welcome. Contact me at &lt;a href="mailto:wojtek.janiszewski@gmail.com"&gt;wojtek.janiszewski@gmail.com&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Download&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;a href="http://que.foomatik.com/Que11.zip"&gt;Download Que 1.1 here&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Project home page&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Visit &lt;a href="http://que.foomatik.com/"&gt;que.foomatik.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/7665691180445113014-6105879356494565797?l=blog.foomatik.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.foomatik.com/feeds/6105879356494565797/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7665691180445113014&amp;postID=6105879356494565797' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/6105879356494565797'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/6105879356494565797'/><link rel='alternate' type='text/html' href='http://blog.foomatik.com/2010/07/que-11-released.html' title='Que 1.1 released!'/><author><name>Wojtek</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7665691180445113014.post-4729197932023695984</id><published>2010-06-20T20:52:00.007+02:00</published><updated>2011-07-16T12:19:24.397+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cocoa'/><category scheme='http://www.blogger.com/atom/ns#' term='Quickies'/><category scheme='http://www.blogger.com/atom/ns#' term='Mac OS X'/><title type='text'>Tech quickies: Deselecting row in NSOutlineView with Highlight set to Source List</title><content type='html'>&lt;a href="http://beakersblog.files.wordpress.com/2009/11/puzzle-thumb-300x300.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 100px; height: 100px;" src="http://beakersblog.files.wordpress.com/2009/11/puzzle-thumb-300x300.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;i&gt;I am starting new series of posts on my tech blog: &lt;b&gt;Tech quickies&lt;/b&gt;. The idea is to publish short articles about features of technologies I am working on, issues regarding using them or anything which can be interesting from programmers point of view. But to the point.&lt;/i&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;div&gt;&lt;b&gt;Problem&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;Recently while developing &lt;a href="http://que.foomatik.com/"&gt;Que&lt;/a&gt; 1.1 I bumped into following problem: I couldn't deselect rows in my NSOutlineView just by clicking in the area with no row visible. It appears that NSOutlineView with Highlight attribute set to Source List (Interface Builder) cannot do that - the only way to unselect row is to click it with your mouse while holding down command key - pretty strange and definitely  not intuitive.&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Solution&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;I couldn't find any solution on the internet but wrote few lines of code which perfectly do what is missing. What's the approach? We want to intercept mouse event and check if it points to any row (do what is normally done) or just onto empty space (unselect all). Pretty simple, as well as code which does the trick. The first thing you need to do is to create new class which should inherit from NSOutlineView. The second and the last is to override following method and put some really simple logic in:&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-style: normal;"&gt;&lt;span class="Apple-style-span" style="  line-height: 18px; font-family:Trebuchet, 'Trebuchet MS', Arial, sans-serif;font-size:14px;"&gt;&lt;pre style="color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-top-color: rgb(153, 153, 153); border-right-color: rgb(153, 153, 153); border-bottom-color: rgb(153, 153, 153); border-left-color: rgb(153, 153, 153); line-height: 14px; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; overflow-x: auto; overflow-y: auto; width: 682px;   font-family:'Andale Mono', 'Lucida Console', Monaco, fixed, monospace;font-size:12px;"&gt;&lt;span class="Apple-style-span" style="font-family:monospace;"&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"&gt;- (&lt;span style="color:#ba2da2;"&gt;void&lt;/span&gt;)mouseDown:(&lt;span style="color:#703daa;"&gt;NSEvent&lt;/span&gt; *)theEvent {&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color:#3d1e81;"&gt;&lt;span style="color:#000000;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color:#703daa;"&gt;NSPoint&lt;/span&gt;&lt;span style="color:#000000;"&gt; point = [&lt;/span&gt;&lt;span style="color:#ba2da2;"&gt;self&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;convertPoint&lt;span style="color:#000000;"&gt;:[theEvent &lt;/span&gt;locationInWindow&lt;span style="color:#000000;"&gt;] &lt;/span&gt;fromView&lt;span style="color:#000000;"&gt;:&lt;/span&gt;&lt;span style="color:#ba2da2;"&gt;nil&lt;/span&gt;&lt;span style="color:#000000;"&gt;];&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;span style="color:#ba2da2;"&gt;int&lt;/span&gt; row = [&lt;span style="color:#ba2da2;"&gt;self&lt;/span&gt; &lt;span style="color:#3d1e81;"&gt;rowAtPoint&lt;/span&gt;:point];&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;span style="color:#ba2da2;"&gt;if&lt;/span&gt; (row &amp;gt;= &lt;span style="color:#252bd8;"&gt;0&lt;/span&gt;) {&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;[&lt;span style="color:#ba2da2;"&gt;super&lt;/span&gt; &lt;span style="color:#3d1e81;"&gt;mouseDown&lt;/span&gt;:theEvent];&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;} &lt;span style="color:#ba2da2;"&gt;else&lt;/span&gt; {&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color:#3d1e81;"&gt;&lt;span style="color:#000000;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;[&lt;/span&gt;&lt;span style="color:#ba2da2;"&gt;self&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;deselectAll&lt;span style="color:#000000;"&gt;:&lt;/span&gt;&lt;span style="color:#ba2da2;"&gt;nil&lt;/span&gt;&lt;span style="color:#000000;"&gt;];&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;}&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo"&gt;}&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That's it, enjoy!&lt;span style="font-style:italic;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7665691180445113014-4729197932023695984?l=blog.foomatik.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.foomatik.com/feeds/4729197932023695984/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7665691180445113014&amp;postID=4729197932023695984' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/4729197932023695984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/4729197932023695984'/><link rel='alternate' type='text/html' href='http://blog.foomatik.com/2010/06/tech-quickies-deselecting-row-in.html' title='Tech quickies: Deselecting row in NSOutlineView with Highlight set to Source List'/><author><name>Wojtek</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7665691180445113014.post-4691094845368095975</id><published>2010-06-14T21:19:00.004+02:00</published><updated>2010-06-14T21:59:11.069+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mac OS X'/><category scheme='http://www.blogger.com/atom/ns#' term='Que'/><title type='text'>Que 1.1 almost ready!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.business-strategy-innovation.com/uploaded_images/Incubator-722867.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 141px; height: 160px;" src="http://www.business-strategy-innovation.com/uploaded_images/Incubator-722867.png" border="0" alt="" /&gt;&lt;/a&gt;Que is alive and all &lt;b&gt;major features for 1.1 release are finished&lt;/b&gt;! I've spent decent amount of time on &lt;b&gt;import/export&lt;/b&gt; features lately, made it easy as possible and fun to use, think you will like it - &lt;b&gt;it's just drag and drop&lt;/b&gt;! I also didn't forget about few &lt;b&gt;UI candies&lt;/b&gt; here and there. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Now it's time for Que to enter last phase: &lt;i&gt;polishing &amp;amp; testing&lt;/i&gt;. There is also some space to add few minor features, but not sure about that. First of all I'd like just to make sure that everything is just &lt;b&gt;right&lt;/b&gt; and I didn't forget anything. &lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;b&gt;What's new:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Que remembers position size and location.&lt;/li&gt;&lt;li&gt;Advanced word grouping - hierarchical files and folders.&lt;/li&gt;&lt;li&gt;Improved search access by CMD + F shortcut.&lt;/li&gt;&lt;li&gt;Importing items from CSV (comma separated values) files.&lt;/li&gt;&lt;li&gt;Exporting items to CSV files.&lt;/li&gt;&lt;li&gt;Dragging words, files and folders out of the application to Finder will export items.&lt;/li&gt;&lt;li&gt;Dragging files from Finder to application will import items.&lt;/li&gt;&lt;li&gt;Creating new files by dragging words to group view. &lt;/li&gt;&lt;li&gt;Facultative words can be configured to ignored or not while taking quiz.&lt;/li&gt;&lt;li&gt;Lots of little UI improvements.&lt;/li&gt;&lt;li&gt;All the things I don't remember :)&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;I'm all excited about incoming release, it's always fun to release new software!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7665691180445113014-4691094845368095975?l=blog.foomatik.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.foomatik.com/feeds/4691094845368095975/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7665691180445113014&amp;postID=4691094845368095975' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/4691094845368095975'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/4691094845368095975'/><link rel='alternate' type='text/html' href='http://blog.foomatik.com/2010/06/que-11-almost-ready.html' title='Que 1.1 almost ready!'/><author><name>Wojtek</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7665691180445113014.post-2337116761863280314</id><published>2010-05-09T23:19:00.012+02:00</published><updated>2010-05-10T23:10:04.336+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mac OS X'/><category scheme='http://www.blogger.com/atom/ns#' term='Que'/><title type='text'>Que 1.1 preview: User Interface</title><content type='html'>&lt;div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://brasil.cel.agh.edu.pl/~09urmastyna/image/laboratorium.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 150px; height: 106px;" src="http://brasil.cel.agh.edu.pl/~09urmastyna/image/laboratorium.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;I’d like to show you some of user interface changes which are going to be available in the next Que release, version 1.1.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold; "&gt;Grouping&lt;/span&gt;&lt;br /&gt;The biggest UI change is words grouping. Those of you who used Que 1.0 knows that it is only available to group words without any hierarchy. Que 1.1 introduces new model, which allows you to create folders and files. Files are meant to store words and purpose of folders is storing objects like files or other folders. Please take a quick look at screenshot below to see an example:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_F_UzqhdTHE0/S-cnLySxA1I/AAAAAAAAAFQ/KVDRLeEOj_8/s1600/que-ss-09-05-2010.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 138px;" src="http://2.bp.blogspot.com/_F_UzqhdTHE0/S-cnLySxA1I/AAAAAAAAAFQ/KVDRLeEOj_8/s200/que-ss-09-05-2010.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5469383355897283410" /&gt;&lt;/a&gt;&lt;br /&gt;As you see you can organize your files and folders into nice structures, which can help you keeping your words in order. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Drag and drop&lt;/span&gt;&lt;br /&gt;You can simply rearrange your folders structure. Just drag some files and/or folders and drop them on another folder. &lt;br /&gt;&lt;br /&gt;If you drag portion of words into groups view, a green file named “New file” will be shown (as in the picture). New file will be created only if you drop dragged words on this new green group. What a simple way to create new groups, isn’t it?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Miscellaneous &lt;/span&gt;&lt;br /&gt;There are also some minor button rearrangements on the application toolbar, few little touches to give the application fresh look.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Feedback&lt;/span&gt;&lt;br /&gt;If you want to read more about Que 1.1 improvements please stay tuned. If you have any suggestions or ideas for new features or how to improve existing ones I would be glad to hear from you.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7665691180445113014-2337116761863280314?l=blog.foomatik.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.foomatik.com/feeds/2337116761863280314/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7665691180445113014&amp;postID=2337116761863280314' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/2337116761863280314'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/2337116761863280314'/><link rel='alternate' type='text/html' href='http://blog.foomatik.com/2010/05/que-11-preview-user-interface.html' title='Que 1.1 preview: User Interface'/><author><name>Wojtek</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_F_UzqhdTHE0/S-cnLySxA1I/AAAAAAAAAFQ/KVDRLeEOj_8/s72-c/que-ss-09-05-2010.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7665691180445113014.post-8832258804660095043</id><published>2010-04-13T22:41:00.008+02:00</published><updated>2010-04-13T23:09:41.700+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mac OS X'/><category scheme='http://www.blogger.com/atom/ns#' term='Que'/><title type='text'>Que 1.1 development in progress!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.pps.jussieu.fr/~gc/img/workinprog.gif"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 155px; height: 132px;" src="http://www.pps.jussieu.fr/~gc/img/workinprog.gif" border="0" alt="" /&gt;&lt;/a&gt;Development of the new version of Que (1.1) started! I have many ideas for new features which I would like to see in the next versions, but obviously cannot implement them at once. The list is big and I have to pick only the most important things and unfortunately the decision is not so obvious.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;What you can expect in Que 1.1?&lt;/span&gt;&lt;br /&gt;One of the highest priorities for Que development is neat and highly usable user interface. You can expect improvements in UI which will come gradually in every release. What’s the big deal about it? My main concert about user experience comes from impressions taken from many other Mac apps. I just want Que to match (or even exceed) the standard.&lt;br /&gt;&lt;br /&gt;Some users were interested in exporting and importing features. Lets not get into the reasons why I didn’t include those features in Que 1.0, I would like to assure you that it will appear in Que 1.1. I cannot tell right now what formats are going to be supported, I’m still doing some research to find most popular and universal ones.&lt;br /&gt;&lt;br /&gt;There would be probably some extra features and I don’t want to give away all secrets right now. I am also open to users request, if you have any idea for Que development feel free to write about it (comment on post, or e-mail - preferred).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;When it will be released? &lt;/span&gt;&lt;br /&gt;When it will be done, I can't promise any date mainly because it’s a side project, I cannot work on it full time. The second reason is that I pay more attention to quality than deadlines - it better to be little late than incomplete. I can only assure that you won’t wait long.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7665691180445113014-8832258804660095043?l=blog.foomatik.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.foomatik.com/feeds/8832258804660095043/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7665691180445113014&amp;postID=8832258804660095043' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/8832258804660095043'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/8832258804660095043'/><link rel='alternate' type='text/html' href='http://blog.foomatik.com/2010/04/que-11-development-in-progress.html' title='Que 1.1 development in progress!'/><author><name>Wojtek</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7665691180445113014.post-3437214646403431982</id><published>2010-03-25T09:00:00.025+01:00</published><updated>2010-03-25T21:29:58.163+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mac OS X'/><category scheme='http://www.blogger.com/atom/ns#' term='Que'/><title type='text'>Que for Mac OS X: memorizing and recalling words from foreign languages made simple!</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span"  style="color:#551A8B;"&gt;&lt;span class="Apple-style-span" style="text-decoration: underline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://que.foomatik.com"&gt;&lt;/a&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://que.foomatik.com"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 128px; height: 128px;" src="http://que.foomatik.com/wp-content/themes/ultralight/images/logo.png" border="0" alt="" /&gt;&lt;/a&gt;I am happy to announce first version of my new application, Mac OS X vocabulary learning tool. What is the idea?&lt;br /&gt;&lt;div&gt;&lt;br /&gt;It’s really easy to memorize and recall words just when you start learning new language, but imagine how hard could it be to recall words which you learned months ago? The solution is to constantly train and recall all words you learned. Que allows you to store words from various languages and tests your knowledge, which if done systematically will make learning and recalling vocabulary easier.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://que.foomatik.com/gfx/que-screen.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 300px; height: 215px;" src="http://que.foomatik.com/gfx/que-screen.png" border="0" alt="" /&gt;&lt;/a&gt;&lt;div&gt;&lt;div&gt;Que has a friendly, lightweight user interface with English and Polish translations available. It focuses on key features and does them well. To start add dictionary and specify facultative words for every language. You can easily add synonyms for words and translation using commas. Groups words into categories (example: lessons) via drag and drop. Take a quiz to test your knowledge: chose from seven different test categories like "New words", "Difficult words", specific lessons and more. Review your results and repeat wrong answers.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0); font-weight: bold; "&gt;Requirements&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Mac OS X 10.5 or Mac OS X 10.6&lt;/li&gt;&lt;li&gt;Intel or PowerPC processor&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Download&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://que.foomatik.com/Que.zip"&gt;Download Que 1.0 here&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold; "&gt;&lt;span class="Apple-style-span"  style="font-size:large;"&gt;Project home page&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Visit &lt;a href="http://que.foomatik.com/"&gt;que.foomatik.com&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: center; "&gt;&lt;span class="Apple-style-span"  style="color:#0000EE;"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0); "&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7665691180445113014-3437214646403431982?l=blog.foomatik.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.foomatik.com/feeds/3437214646403431982/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7665691180445113014&amp;postID=3437214646403431982' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/3437214646403431982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/3437214646403431982'/><link rel='alternate' type='text/html' href='http://blog.foomatik.com/2010/03/que-for-mac-os-x-memorizing-and.html' title='Que for Mac OS X: memorizing and recalling words from foreign languages made simple!'/><author><name>Wojtek</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7665691180445113014.post-7486316981783025635</id><published>2010-03-18T12:59:00.008+01:00</published><updated>2010-03-25T09:18:59.616+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Apache Tuscany'/><category scheme='http://www.blogger.com/atom/ns#' term='Erlang'/><title type='text'>Apache Tuscany SCA Java 1.6 binary modules for Erlang binding</title><content type='html'>&lt;span class="Apple-tab-span" style="white-space:pre"&gt;&lt;div&gt;&lt;/div&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;As far as you may (or not) know, Erlang binding is available only in source distribution. I mentioned it &lt;a href="http://wojtekj.blogspot.com/2010/02/erlang-binding-released-in-apache.html"&gt;previously&lt;/a&gt; and it means you have to build Tuscany by yourself, which can be time consuming. Not anymore! If you want to just play with Erlang binding, you can use binaries from official maven repository:&lt;/span&gt;&lt;/span&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://repo1.maven.org/maven2//org/apache/tuscany/sca/tuscany-binding-erlang/1.6/"&gt;http://repo1.maven.org/maven2//org/apache/tuscany/sca/tuscany-binding-erlang/1.6/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;&lt;a href="http://repo1.maven.org/maven2//org/apache/tuscany/sca/tuscany-binding-erlang-runtime/1.6/"&gt;http://repo1.maven.org/maven2//org/apache/tuscany/sca/tuscany-binding-erlang-runtime/1.6/ &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;It's really simple to enable Erlang binding in your maven project, you should add following dependencies:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;pre   style=" color: rgb(0, 0, 0); background-color: rgb(238, 238, 238);  border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-top-color: rgb(153, 153, 153); border-right-color: rgb(153, 153, 153); border-bottom-color: rgb(153, 153, 153); border-left-color: rgb(153, 153, 153); line-height: 14px; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; overflow-x: auto; overflow-y: auto; width: 682px; font-family:'Andale Mono', 'Lucida Console', Monaco, fixed, monospace;font-size:12px;"&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre; "&gt; &lt;/span&gt;&amp;lt;groupId&amp;gt;org.apache.tuscany.sca&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre; "&gt; &lt;/span&gt;&amp;lt;artifactId&amp;gt;tuscany-binding-erlang&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre; "&gt; &lt;/span&gt;&amp;lt;version&amp;gt;1.6&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;and:&lt;pre   style="color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: dashed; border-right-style: dashed; border-bottom-style: dashed; border-left-style: dashed; border-top-color: rgb(153, 153, 153); border-right-color: rgb(153, 153, 153); border-bottom-color: rgb(153, 153, 153); border-left-color: rgb(153, 153, 153); line-height: 14px; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; overflow-x: auto; overflow-y: auto; width: 682px; font-family:'Andale Mono', 'Lucida Console', Monaco, fixed, monospace;font-size:12px;"&gt;&lt;code&gt;&amp;lt;dependency&amp;gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre; "&gt; &lt;/span&gt;&amp;lt;groupId&amp;gt;org.apache.tuscany.sca&amp;lt;/groupId&amp;gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre; "&gt; &lt;/span&gt;&amp;lt;artifactId&amp;gt;tuscany-binding-erlang-runtime&amp;lt;/artifactId&amp;gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre; "&gt; &lt;/span&gt;&amp;lt;version&amp;gt;1.6&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;/dependency&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;Remember to include other dependencies required to run Tuscany environment.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7665691180445113014-7486316981783025635?l=blog.foomatik.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.foomatik.com/feeds/7486316981783025635/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7665691180445113014&amp;postID=7486316981783025635' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/7486316981783025635'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/7486316981783025635'/><link rel='alternate' type='text/html' href='http://blog.foomatik.com/2010/03/apache-tuscany-sca-java-16-binary.html' title='Apache Tuscany SCA Java 1.6 binary modules for Erlang binding'/><author><name>Wojtek</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7665691180445113014.post-7266220835591271164</id><published>2010-02-24T11:37:00.006+01:00</published><updated>2010-02-24T16:51:12.767+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Apache Tuscany'/><category scheme='http://www.blogger.com/atom/ns#' term='Erlang'/><title type='text'>Erlang binding released in Apache Tuscany SCA Java 1.6 (February 2010)</title><content type='html'>I'm little late but still proud to announce Apache Tuscany SCA Java 1.6, which is first release containing my latest contribution to Apache Tuscany, Erlang binding. Note that Erlang binding is available &lt;b&gt;only in&lt;/b&gt; &lt;b&gt;source distribution&lt;/b&gt;. Enjoy!&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Source distribution, as well as binaries are available under official Apache Tuscany download page:&lt;/div&gt;&lt;div&gt;&lt;a href="http://tuscany.apache.org/sca-java-1x-releases.html"&gt;http://tuscany.apache.org/sca-java-1x-releases.html&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Erlang binding documentation page can be found under:&lt;/div&gt;&lt;div&gt;&lt;a href="http://tuscany.apache.org/sca-java-bindingerlang.html"&gt;http://tuscany.apache.org/sca-java-bindingerlang.html&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Due to problems with build process for Erlang binding we had to throw it away from binary distribution. The main problem was that Erlang binding module JUnit tests, as well as samples requires Erlang distribution installed, which cannot be smoothly automatized (it requires compiling C/C++ code, which requires compilers and tools...).&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7665691180445113014-7266220835591271164?l=blog.foomatik.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.foomatik.com/feeds/7266220835591271164/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7665691180445113014&amp;postID=7266220835591271164' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/7266220835591271164'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/7266220835591271164'/><link rel='alternate' type='text/html' href='http://blog.foomatik.com/2010/02/erlang-binding-released-in-apache.html' title='Erlang binding released in Apache Tuscany SCA Java 1.6 (February 2010)'/><author><name>Wojtek</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7665691180445113014.post-4503186120725436697</id><published>2009-06-17T17:39:00.004+02:00</published><updated>2009-06-17T18:02:09.785+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Apache Tuscany'/><category scheme='http://www.blogger.com/atom/ns#' term='Erlang'/><title type='text'>Finished Erlang binding extension for Apache Tuscany</title><content type='html'>Hi folks,&lt;br /&gt;I'd like to announce that I've finished coding Erlang extension for Apache Tuscany SCA Java (see &lt;a href="http://wojtekj.blogspot.com/2008/11/integracja-erlanga-z-sca-apache-tuscany.html"&gt;previous&lt;/a&gt;  &lt;a href="http://wojtekj.blogspot.com/2009/03/working-on-erlang-binding-extension-for.html"&gt;announcements&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;The code is currently committed to 1.x source line and hopefully will appear in official Apache Tuscany distribution in the future. Those of you who would like to try it right now must compile it from the 1.x source manually.&lt;br /&gt;&lt;br /&gt;Please refer to &lt;a href="http://tuscany.apache.org/sca-java-bindingerlang.html"&gt;official documentation&lt;/a&gt; for features and usage instructions.&lt;br /&gt;&lt;br /&gt;Whole Erlang related work is part of my master thesis (it looks like I'm going to graduate shortly!) which is generally about extending SCA runtime, Apache Tuscany. I feel really satisfied with work I did - it's great to be able to fulfil university responsibilities with something which could be helpful for others. I'm also glad for having another possibility to contribute to open source community (and hope there will be more opportunities).&lt;br /&gt;&lt;br /&gt;I'm really curious about usefulness of this extension - I'm looking forward for hearing users opinions, it's really interesting for me how you are going to use it and which features would be best/worst for your scenarios.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7665691180445113014-4503186120725436697?l=blog.foomatik.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.foomatik.com/feeds/4503186120725436697/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7665691180445113014&amp;postID=4503186120725436697' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/4503186120725436697'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/4503186120725436697'/><link rel='alternate' type='text/html' href='http://blog.foomatik.com/2009/06/finished-erlang-binding-extension-for.html' title='Finished Erlang binding extension for Apache Tuscany'/><author><name>Wojtek</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7665691180445113014.post-686790844470411945</id><published>2009-03-24T22:08:00.003+01:00</published><updated>2009-03-30T23:26:20.015+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Apache Tuscany'/><category scheme='http://www.blogger.com/atom/ns#' term='Erlang'/><title type='text'>Working on Erlang binding extension for Apache Tuscany</title><content type='html'>As I've &lt;a href="http://wojtekj.blogspot.com/2008/11/integracja-erlanga-z-sca-apache-tuscany.html"&gt;announced before&lt;/a&gt;, I decided to continue work on Erlang binding. In fact I've started one month ago, and with few days per week I managed to complete following features:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Client RPC (invoking Erlang functions)&lt;/li&gt;&lt;li&gt;Sending Erlang messages to remote Erlang mboxes by executing methods backed by Erlang reference bindings&lt;/li&gt;&lt;li&gt;Service RPC (exposing SCA components operations as Erlang functions)&lt;/li&gt;&lt;li&gt;Exposing SCA components operations as Erlang message boxes&lt;/li&gt;&lt;li&gt;Erlang cookies (which are something like passwords which value should match on both communicating nodes)&lt;/li&gt;&lt;li&gt;Timeouts for services, which allows user to define acceptable time between client connects and sends it's messages (this feature allows ie. to prevent stealing thread)&lt;/li&gt;&lt;li&gt;Timeouts for references, which allows to define acceptable response time&lt;/li&gt;&lt;/ul&gt;I'm still thinking about process linking implementation, which doesn't appear to fit smoothly into SCA model. It's not critical feature, but still worth implementing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7665691180445113014-686790844470411945?l=blog.foomatik.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.foomatik.com/feeds/686790844470411945/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7665691180445113014&amp;postID=686790844470411945' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/686790844470411945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/686790844470411945'/><link rel='alternate' type='text/html' href='http://blog.foomatik.com/2009/03/working-on-erlang-binding-extension-for.html' title='Working on Erlang binding extension for Apache Tuscany'/><author><name>Wojtek</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7665691180445113014.post-9101912439749343746</id><published>2009-02-03T21:52:00.008+01:00</published><updated>2009-02-03T22:16:53.663+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='humor'/><title type='text'>What MSDN knows about Linux?</title><content type='html'>&lt;span style="font-style: italic;"&gt;I'm back after a little break, which was caused by some university responsibilities. I really had much work at the end of winter semester, I made one little and one big project, which I'm hoping to write about in the future. I'm also kinda confused about future of this blog - after I've released Qub3DS I'm noticing many visitors outside Poland (&lt;span style="font-weight: bold;"&gt;and I'm hoping you are not  those which left my blog opened on browsers tab ;p&lt;/span&gt;) , so I'd like to give them chance to understand this content. So this is why I'm writing again in English.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;But to the point...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Just type "Linux" query to the &lt;a href="http://msdn.microsoft.com/"&gt;MSDN search engine&lt;/a&gt;. First result can make you laught, especially if you are some wicket computer geek ;). It may look like a some easter egg, but it's still there for few years.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7665691180445113014-9101912439749343746?l=blog.foomatik.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.foomatik.com/feeds/9101912439749343746/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7665691180445113014&amp;postID=9101912439749343746' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/9101912439749343746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/9101912439749343746'/><link rel='alternate' type='text/html' href='http://blog.foomatik.com/2009/02/what-msdn-knows-about-linux.html' title='What MSDN knows about Linux?'/><author><name>Wojtek</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7665691180445113014.post-1147729445268727216</id><published>2008-12-14T23:55:00.022+01:00</published><updated>2008-12-15T15:41:34.878+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Nintendo DS'/><category scheme='http://www.blogger.com/atom/ns#' term='Qub3DS'/><title type='text'>Qub3DS for Nintendo DS - homebrew game</title><content type='html'>Qub3DS is a Nintendo DS port of Qub3D, a tetris like mini-game from Grand Theft Auto IV.&lt;br /&gt;&lt;br /&gt;I've finally managed to release first version. I haven't been coding games for ages so it was fun and little break from doing enterprise and Java stuff. I don't have much experience in game programming, this is actually first game which I'm releasing to public so please be patient. ;)&lt;br /&gt;&lt;br /&gt;It uses only one screen, no touch screen input, it's controlled simply by D-Pad, A and Start. If you weren't playing the original Qub3D game you'll have to learn intuitively those non standard game rules. Game looks like:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_F_UzqhdTHE0/SUZSpg5iJkI/AAAAAAAAABw/-A6lDFk3VL4/s1600-h/game.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 256px; height: 192px;" src="http://1.bp.blogspot.com/_F_UzqhdTHE0/SUZSpg5iJkI/AAAAAAAAABw/-A6lDFk3VL4/s400/game.png" alt="" id="BLOGGER_PHOTO_ID_5279998486297847362" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Download&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://people.apache.org/%7Ewjaniszewski/Qub3DS-1.0.zip"&gt;Download Qub3DS 1.0&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Inspiration&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;I decided to create game based on original Qub3D tetris like game, which appears as mini-game in GTA IV. I wanted to rip all original rules and port them to DS (so maybe *inspiration* is not appropriate word?)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Reality&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;What was successfully ported:&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;original block moving rules (however it looks that Rockstar guys didn't spent too much time on inventing them, so some oddities could be found)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;original block pattern matching (which means that blocks dissapears in the same fashion as in original game)&lt;/li&gt;&lt;li&gt;saving hi scores&lt;/li&gt;&lt;li&gt;other stuff which I can't remember right now?&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;What's different:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;audio/video obviously differs&lt;/li&gt;&lt;li&gt;score calculation rules weren't clear enough to me so I've introduced my own score system&lt;/li&gt;&lt;li&gt;other things which I didn't noticed?&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Future&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;There's always more to do:&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;gathering and responding to users (if there will be any ;)) feedback&lt;/li&gt;&lt;li&gt;improving (graphics, sounds, game screens)&lt;/li&gt;&lt;li&gt;bugfixing &lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Installing, running&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;To run this game simply copy it to your DS hombrew hardware and then execute. There's no need to use DLDI patcher, but doing this will allow you to save your high scores.&lt;br /&gt;Note that game will create a little file on your device when using DLDI patch. This files name is "qub3scr" and it stores your highscores.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Media&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Here's some Qub3DS running on real Nintendo DS machine:&lt;br /&gt;&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/HUdvEea0B2M&amp;amp;hl=pl&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/HUdvEea0B2M&amp;amp;hl=pl&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="344" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;And here's some gameplay from original version:&lt;br /&gt;&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Ib3yPaVpKBg&amp;amp;hl=pl&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/Ib3yPaVpKBg&amp;amp;hl=pl&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="344" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Feedback?&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Please let me know what do you think about Qub3DS.&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/7665691180445113014-1147729445268727216?l=blog.foomatik.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.foomatik.com/feeds/1147729445268727216/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7665691180445113014&amp;postID=1147729445268727216' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/1147729445268727216'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/1147729445268727216'/><link rel='alternate' type='text/html' href='http://blog.foomatik.com/2008/12/qub3ds-for-nintendo-ds-homebrew-game.html' title='Qub3DS for Nintendo DS - homebrew game'/><author><name>Wojtek</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_F_UzqhdTHE0/SUZSpg5iJkI/AAAAAAAAABw/-A6lDFk3VL4/s72-c/game.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7665691180445113014.post-8934337039973610705</id><published>2008-11-22T01:16:00.004+01:00</published><updated>2008-11-26T13:24:21.478+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Apache Tuscany'/><category scheme='http://www.blogger.com/atom/ns#' term='SCA'/><category scheme='http://www.blogger.com/atom/ns#' term='Erlang'/><title type='text'>Integracja Erlanga z SCA (Apache Tuscany)</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://tbn0.google.com/images?q=tbn:H_1MKWFne6RIFM:http://www.erlang-services.com/images/erlang_studiok.bmp"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 132px; height: 118px;" src="http://tbn0.google.com/images?q=tbn:H_1MKWFne6RIFM:http://www.erlang-services.com/images/erlang_studiok.bmp" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Nie będę ukrywał, że lubie egzotyczne tematy. Jeszcze dwa tygodnie temu o Erlangu nie miałem bladago pojęcia, postanowiłem jednak przymierzyć się do integracji tegoż z Javową implementacją SCA, którą jest Apache Tuscany (;)). W wyniku moich krótkich poszukiwań powstał &lt;a href="http://cwiki.apache.org/confluence/display/TUSCANYWIKI/Integration+with+Erlang"&gt;dokument&lt;/a&gt;, do którego gorąco zapraszam. Być może znajdzie się ktoś, kto patrząc doświadczonym okiem "Erlangowca" wskaże mi to i owo?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7665691180445113014-8934337039973610705?l=blog.foomatik.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.foomatik.com/feeds/8934337039973610705/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7665691180445113014&amp;postID=8934337039973610705' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/8934337039973610705'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/8934337039973610705'/><link rel='alternate' type='text/html' href='http://blog.foomatik.com/2008/11/integracja-erlanga-z-sca-apache-tuscany.html' title='Integracja Erlanga z SCA (Apache Tuscany)'/><author><name>Wojtek</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7665691180445113014.post-1090191196557442158</id><published>2008-10-23T15:29:00.006+02:00</published><updated>2008-10-23T15:42:15.303+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GSoC2008'/><title type='text'>Certified Google Summer of Code 2008 participant</title><content type='html'>Dwa dni temu listonosz zaskoczył mnie przesyłką wprost z Mountain View, CA, która to zawierała długo wyczekiwany certyfikat::&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_F_UzqhdTHE0/SQB9GEzOIsI/AAAAAAAAABk/xN_nFXlv8Qo/s1600-h/gsoc_cert.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 147px;" src="http://1.bp.blogspot.com/_F_UzqhdTHE0/SQB9GEzOIsI/AAAAAAAAABk/xN_nFXlv8Qo/s400/gsoc_cert.jpg" alt="" id="BLOGGER_PHOTO_ID_5260341908090004162" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;W przesyłce znalazł się również tematyczny t-shirt. Tymczasem w najbliższej przyszłości czeka mnie ponowne zanurzenie w rozwój Apache Tuscany, wybór projektu na Google Summer of Code 2009 oraz schrupanie zakurzonego "&lt;a href="http://www.amazon.com/Beautiful-Code-Leading-Programmers-Practice/dp/0596510047/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1224769043&amp;amp;sr=8-1"&gt;Beautiful Code&lt;/a&gt;" (książka ta została sprezentowana każdemu studentowi który zakwalifikował się do GSoC2008).&lt;br /&gt;&lt;br /&gt;Przy okazji: w weekend „zaliczyłem” Bieszczady – foto raport do obejrzenia &lt;a href="http://users.pjwstk.edu.pl/%7Es5473/20081018"&gt;tutaj&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7665691180445113014-1090191196557442158?l=blog.foomatik.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.foomatik.com/feeds/1090191196557442158/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7665691180445113014&amp;postID=1090191196557442158' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/1090191196557442158'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/1090191196557442158'/><link rel='alternate' type='text/html' href='http://blog.foomatik.com/2008/10/certified-google-summer-of-code-2008.html' title='Certified Google Summer of Code 2008 participant'/><author><name>Wojtek</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_F_UzqhdTHE0/SQB9GEzOIsI/AAAAAAAAABk/xN_nFXlv8Qo/s72-c/gsoc_cert.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7665691180445113014.post-4613231085979899673</id><published>2008-10-11T20:18:00.008+02:00</published><updated>2008-10-22T23:27:42.190+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GSoC2008'/><title type='text'>Google Summer of Code 2008 zakończone!</title><content type='html'>Mam przyjemność ogłosić, iż tegoroczne Google Summer of Code 2008 ukończyłem z sukcesem. Wg. &lt;a href="http://code.google.com/soc/2008/"&gt;danych&lt;/a&gt; przedstawionych przez Google 83% z 1125 uczestników programu ukończyło swoje projekty z wynikiem pozytywnym. Każdy z uczestników został zobowiązany do wysłania kodu powstałego w czasie trwania projektu. Źódła projektów Apache Software Foundation znajdują się w &lt;a href="http://code.google.com/p/google-summer-of-code-2008-asf/downloads/list"&gt;repozytorium&lt;/a&gt;, natomiast mój projekt można pobrać &lt;a href="http://google-summer-of-code-2008-asf.googlecode.com/files/Wojciech_Janiszewski.tar.gz"&gt;tutaj&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Co pozatym? Dwa tygodnie temu wróciłem z długo wyczekiwanych wakacji, zapraszam więc do obejrzenia &lt;a href="http://users.pjwstk.edu.pl/%7Es5473/20080907/"&gt;galerii z wyprawy&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7665691180445113014-4613231085979899673?l=blog.foomatik.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.foomatik.com/feeds/4613231085979899673/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7665691180445113014&amp;postID=4613231085979899673' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/4613231085979899673'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/4613231085979899673'/><link rel='alternate' type='text/html' href='http://blog.foomatik.com/2008/10/google-summer-of-code-2008-zakoczone.html' title='Google Summer of Code 2008 zakończone!'/><author><name>Wojtek</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7665691180445113014.post-5084274131757958509</id><published>2008-08-18T14:42:00.006+02:00</published><updated>2008-08-18T15:08:15.138+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Apache Tuscany'/><category scheme='http://www.blogger.com/atom/ns#' term='GSoC2008'/><title type='text'>Ostatni dzień Google Summer of Code 2008</title><content type='html'>Na dzisiaj przypada ostatni dzień GSoC 2008. W związku z tym chciałbym opublikować listę rzeczy które zostały ukończone w trakcie programu.&lt;br /&gt;&lt;br /&gt;1. Co zostało zrobione w pierwszej fazie? (26 maj - 07 lipiec)&lt;br /&gt;&lt;ul&gt;&lt;li&gt;ogólnie rozszerzenie binding.corba&lt;/li&gt;&lt;li&gt;rozszerzenia hostujące (host-corba, host-corba-jdk)&lt;/li&gt;&lt;li&gt;testy JUnit dla poszczególnych modułów&lt;/li&gt;&lt;li&gt;testy integracyjne&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;2. Co zostało zrobione w drugiej fazie? (08 lipiec - 18 sierpień)&lt;br /&gt;&lt;ul&gt;&lt;li&gt;refaktoring modułów host-corba, host-corba-jdk&lt;/li&gt;&lt;li&gt;utworzenie modułu host-corba-jee&lt;/li&gt;&lt;li&gt;dodanie mapowania operacji CORBA do metod Java&lt;/li&gt;&lt;li&gt;domyślne wiązanie sca (binding.sca) po protokole CORBA (z użyciem binding.corba)&lt;/li&gt;&lt;li&gt;utworzenie modułu host-corba-jse-tns rozszerzającego host-corba-jse poprzez autostart serwera nazw CORBA&lt;/li&gt;&lt;li&gt;dodanie obsługi tablic i unii&lt;/li&gt;&lt;li&gt;dokumentacja wiązania CORBA w postaci podstrony WWW projektu Apache Tuscany&lt;/li&gt;&lt;li&gt;testy JUnit dla poszczególnych modułów&lt;br /&gt;&lt;/li&gt;&lt;li&gt;testy integracyjne&lt;/li&gt;&lt;/ul&gt;3. Co nie zostało zrobione?&lt;br /&gt;&lt;ul&gt;&lt;li&gt;rozszerzenie dla wsparcia języka IDL (planowane pierwotnie, jednak wyparte przez inne zadania)&lt;/li&gt;&lt;/ul&gt;Już niedługo po zakończeniu programu studenci oraz mentorzy będą mogli ponownie wypełnić stosowny formularz, tym razem tzw. "final evaluations". Koniec trwania programu nie oznacza dla mnie jednocześnie końca przygody z Apache Tuscany. Wręcz przeciwnie - razem z dołączeniem do grona commiterów chciałbym dalej rozwijać projekt, a swój wkład w ramach możliwości publikować w formie pracy magisterskiej. Stay tuned.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7665691180445113014-5084274131757958509?l=blog.foomatik.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.foomatik.com/feeds/5084274131757958509/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7665691180445113014&amp;postID=5084274131757958509' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/5084274131757958509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/5084274131757958509'/><link rel='alternate' type='text/html' href='http://blog.foomatik.com/2008/08/ostatni-dzie-google-summer-of-code-2008.html' title='Ostatni dzień Google Summer of Code 2008'/><author><name>Wojtek</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7665691180445113014.post-4171715474454842498</id><published>2008-08-09T14:26:00.003+02:00</published><updated>2008-08-09T14:32:16.728+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Apache Tuscany'/><title type='text'>Apache Tuscany 1.3 wydane!</title><content type='html'>5 sierpnia 2008 zespół Apache Tuscany ogłosił kolejną wersję implementacji SCA. Zapraszam na &lt;a href="http://tuscany.apache.org/sca-java-13.html"&gt;stronę wydania&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7665691180445113014-4171715474454842498?l=blog.foomatik.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.foomatik.com/feeds/4171715474454842498/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7665691180445113014&amp;postID=4171715474454842498' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/4171715474454842498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/4171715474454842498'/><link rel='alternate' type='text/html' href='http://blog.foomatik.com/2008/08/apache-tuscany-13-wydane.html' title='Apache Tuscany 1.3 wydane!'/><author><name>Wojtek</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7665691180445113014.post-8441252707072571954</id><published>2008-07-31T12:34:00.005+02:00</published><updated>2008-07-31T17:23:19.070+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Apache Tuscany'/><category scheme='http://www.blogger.com/atom/ns#' term='GSoC2008'/><title type='text'>"Wojtek Janiszewski voted as a Tuscany committer"</title><content type='html'>Tytuł tego wpisu to jednocześnie tytuł maila który pojawił się 29 lipca na deweloperskiej liście mailingowej projektu Apache Tuscany. Zostałem więc oficjalnie przyjęty do grona commiterów! Bardzo miła nowina. Emocje wprawdzie zdążyły opaść, bo pierwsze nieoficjalne sygnały zaczęły docierać do mnie już dwa tygodnie wcześniej, jednak mimo wszystko chyba do dziś nie widzę pełnego obrazu nowych możliwości, jak i obowiązków. Tak czy inaczej, ciekawe dokąd jeszcze zaprowadzi mnie udział w tegorocznym Google Summer of Code?&lt;br /&gt;&lt;br /&gt;Kim jest commiter? Krótko mówiąc jest osobą posiadająca prawo zapisu do repozytorium kodu hostowanego przez Apache Software Foundation. Będąc wcześniej kontrybutorem (contributor) aby dodać kolejny kawałek kodu do repozytorium musiałem uploadować łatkę do JIRY oraz czekać na weryfikację i commit któregoś z commiterów. Teraz oprócz "szaleństwa po svn'ie" mam kilka dodatkowych przywilejów - dla dociekliwych polecam &lt;a href="http://www.apache.org/dev/committers.html"&gt;FAQ&lt;/a&gt; i &lt;a href="http://www.apache.org/dev/new-committers-guide.html"&gt;Guide for new commiters&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7665691180445113014-8441252707072571954?l=blog.foomatik.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.foomatik.com/feeds/8441252707072571954/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7665691180445113014&amp;postID=8441252707072571954' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/8441252707072571954'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/8441252707072571954'/><link rel='alternate' type='text/html' href='http://blog.foomatik.com/2008/07/wojtek-janiszewski-voted-as-tuscany.html' title='&quot;Wojtek Janiszewski voted as a Tuscany committer&quot;'/><author><name>Wojtek</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7665691180445113014.post-6053925984089577716</id><published>2008-07-16T00:13:00.012+02:00</published><updated>2008-07-17T00:19:30.079+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GSoC2008'/><title type='text'>Jaki status? Google Summer of Code mid-term evaluation!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://tbn0.google.com/images?q=tbn:ITrwgcFNemBrlM:http://carmodyconsulting.net/db4/00314/carmodyconsulting.net/_uimages/survey.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 150px;" src="http://tbn0.google.com/images?q=tbn:ITrwgcFNemBrlM:http://carmodyconsulting.net/db4/00314/carmodyconsulting.net/_uimages/survey.jpg" alt="" border="0" /&gt;&lt;/a&gt;Stało się! 14 lipca o godzinie 23 "czasu polskiego" upłynął* termin składania mid-term evaluations**. Co to oznacza? Że wreszcie oficjalna informacja o kontynuowaniu projektu stała się dostępna. Zdziwiłem się jednak (a i pewnie nie tylko ja) że do takiej informacji w prosty sposób się nie dostanę. I to ani przez web-aplikację Google'a, ani też e-maila z automatu nie dostałem (jak w przypadku potwierdzenia o zakwalifikowaniu się do GSoC). Każdy dostał polecenie spytać swojego mentora.&lt;br /&gt;&lt;br /&gt;Co mój mentor na to? Właśnie wysłałem mu maila z zapytaniem, ale to już chyba nieistotne, bo ponad tydzień temu gratulował mi na liście mailingowej z okazji dostarczenia pierwszej funkcjonalności. Ale cóż, wszyscy zawsze lubimy i czekamy tylko na te oficjalne informacje.&lt;br /&gt;&lt;br /&gt;Update: otrzymałem odpowiedź od mentora i tak jak wcześniej podejrzewałem, wszystko jest w porządku. Ba, po treści e-maila wnioskuję nawet, że wyniki mojej pracy przewyższyły oczekiwania. &lt;span style="font-weight: bold;"&gt;Nice.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;* Napisałem upłynął - tak było w teorii. W praktyce jeszcze przez niecałe dwie godziny można było edytować formatkę. Nie wiem jeszcze do końca jak to działa, ale ma na pewno związek z architekturą aplikacji Google'a - w innych rejonach geograficznych możliwość edycji została wyłączona o czasie.&lt;br /&gt;&lt;br /&gt;** mid-term evaluation - ocena projektu na półmetku. Wypełniana przy pomocy formularza na stronach odnośnie Google Summer of Code przez studenta jak i jego mentora. Od mentora zależy, czy student będzie mógł dalej uczestniczyć w programie. No i oczywiście czy dostanie pieniądze. Od studenta nie zależy nic ;) - taki feedback.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7665691180445113014-6053925984089577716?l=blog.foomatik.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.foomatik.com/feeds/6053925984089577716/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7665691180445113014&amp;postID=6053925984089577716' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/6053925984089577716'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/6053925984089577716'/><link rel='alternate' type='text/html' href='http://blog.foomatik.com/2008/07/jaki-status-google-summer-of-code-mid.html' title='Jaki status? Google Summer of Code mid-term evaluation!'/><author><name>Wojtek</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7665691180445113014.post-2285058808642172005</id><published>2008-06-26T14:20:00.024+02:00</published><updated>2008-07-11T00:44:13.414+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GSoC2008'/><title type='text'>Google Summer of Code 2008 - wrażenia z pierwszej linii</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://amarok.kde.org/files/google-soc-code-trans.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px;" src="http://amarok.kde.org/files/google-soc-code-trans.png" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Ostatnio na blogu jest mało technicznie, także i ten wpis będzie bardziej "miękki". Jako że dziś mija miesiąc od rozpoczęcia pierwszego etapu programowania w Google Summer of Code postanowiłem podzielić się swoimi wrażeniami.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Harmonogram GSoC można znaleźć &lt;a href="http://code.google.com/opensource/gsoc/2008/faqs.html#0.1_timeline"&gt;tutaj&lt;/a&gt; i nie wdając się w zbędne szczegóły - programowanie odbywa się w dwóch fazach:&lt;ul&gt;&lt;li&gt;pierwsza (26 maja - 6 lipca)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;druga (14 lipca - 17 sierpnia)&lt;/li&gt;&lt;/ul&gt;Po zakończeniu każdej z nich, mentorzy oraz studenci oceniają wzajemnie swoją pracę, po czym jeżeli ocena jest pozytywna to student otrzymuje ratę stypendium.&lt;br /&gt;&lt;br /&gt;Zbliżam się więc nieuchronnie do końca pierwszej fazy i nie zapeszając, myślę że wszystko pójdzie zgodnie z planem. Więcej szczegółów odnośnie postępów można znaleźć na &lt;a href="http://cwiki.apache.org/confluence/display/TUSCANYWIKI/CORBA+support+for+Apache+Tuscany"&gt;wiki&lt;/a&gt; oraz w &lt;a href="http://marc.info/?l=tuscany-dev&amp;amp;r=1&amp;amp;w=2"&gt;archiwum&lt;/a&gt; listy mailingowej dev@tuscany.apache.org.&lt;br /&gt;&lt;br /&gt;Jakie są moje osobiste wrażenia z uczestnictwa w Google Summer of Code 2008? Część z nich będzie dotyczyć nie tyle co GSoC, a pracy zdalnej nad projektem open-source'owym.&lt;br /&gt;&lt;ul&gt;&lt;li&gt; &lt;span style="font-weight: bold;"&gt;komunikacja w projekcie&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;&lt;/span&gt;- członkowie projektu są pomocni, aczkolwiek nic chyba nie zastąpi rozmowy "na żywo". Ponadto mimo średnio-zaawansowanej znajomości języka angielskiego nadal nie jest moim język natywnym. Ma to też swoje plusy - wypowiedzi czytane są staranniej, a charakter komunikacji, że tak się wyrażę, asynchroniczny, sprawia że odpowiedzi są (bywają;)) przemyślane.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;zajęcia poza (studia) &lt;/span&gt;- ideą GSoC jest wdrażanie studentów w rozwój oprogramowania open-source'owego w wakacje, wtedy gdy nie mają obowiązków związanych ze szkołą. W praktyce okazuje się, że to właściwie Amerykanie kończą semestr letni z końcem maja (moment rozpoczęcia kodowania w GSoC), a studenci innych krajów (jak np. PL) muszą połączyć start projektu z najbardziej intensywnym okresem na studiach - przygotowaniami do sesji oraz sesją letnią (założę się, że niektórzy mogą być sceptyczni co do ostatniego;)). Ja już szczęśliwie mam prawie wszystko pchnięte do przodu, ale mimo wszystko będę pamiętał czerwiec jako jeden z bardziej intensywnych miesięcy.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;praca w domu &lt;/span&gt;- z jednej strony fajnie, bo nie trzeba tracić czasu na dojazdy i wszystko niby jest pod ręką, z drugiej kwestia mobilizacji, gospodynie-sąsiadki ubijające mięso na schabowego (zainspirowany zdarzeniem mającym akurat miejsce), ekipy remontowe oraz bandy dzieciaków pod oknem (Dzień Świra?:)).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;elastyczny czas pracy &lt;/span&gt;- tak, to jest plus. Tuż po rozpoczęciu doceniłem, że mogę spokojnie posiedzieć dłużej w nocy, nie martwiąc się że nie wstanę do pracy. W praktyce okazuje się czasem, że potrzebując pomocy od mentora (mieszkającego w San Francisco) muszę dostosować się do jego godzin pracy - wtedy to już ciężko nazwać to elastycznym czasem pracy.&lt;/li&gt;&lt;/ul&gt;Tak czy inaczej, odczucia mam pozytywne, zwłaszcza że postępy są odczuwalne. Optymistycznie patrzę więc w przyszłość i wiąże nadzieje z nadchodzącymi dwoma miesiącami pracy przy Apache Tuscany.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7665691180445113014-2285058808642172005?l=blog.foomatik.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.foomatik.com/feeds/2285058808642172005/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7665691180445113014&amp;postID=2285058808642172005' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/2285058808642172005'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/2285058808642172005'/><link rel='alternate' type='text/html' href='http://blog.foomatik.com/2008/06/wraenia-z-google-summer-of-code-2008.html' title='Google Summer of Code 2008 - wrażenia z pierwszej linii'/><author><name>Wojtek</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7665691180445113014.post-3691769217098162137</id><published>2008-06-18T10:08:00.005+02:00</published><updated>2008-07-11T00:42:23.368+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Apache Tuscany'/><title type='text'>Apache Tuscany wyszedł z inkubatora!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://incubator.apache.org/tuscany/images/TuscanyLogo.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 191px;" src="http://incubator.apache.org/tuscany/images/TuscanyLogo.jpg" alt="" border="0" /&gt;&lt;/a&gt;              &lt;style&gt;  &lt;!--   @page { size: 21cm 29.7cm; margin: 2cm }   P { margin-bottom: 0.21cm }   A:link { color: #000080; text-decoration: underline }  --&gt;&lt;/style&gt;To już trzeci z rzędu odgrzewany kotlet – 21 maja 2008 Apache Tuscany został ogłoszony oficjalnym projektem Apache Software Foundation.&lt;br /&gt;&lt;br /&gt;Dlaczego postanowiłem dziś o tym napisać? Ano dlatego, że wczoraj projekt przeszedł małe trzęsienie ziemi: zmiany w lokalizacji repozytorium kodu, zmiany w adresach list mailingowych, zmianę domeny na &lt;a href="http://tuscany.apache.org/"&gt;http://tuscany.apache.org/&lt;/a&gt; (na http://www.apache.org/ nie ma jeszcze linka).  Aż miło patrzeć na rozwój projektu, a śledzę go prawie 2 miesiące.    &lt;p style="margin-bottom: 0cm;"&gt;Ciekawostka: do Google Summer of Code 2008 zostały zakwalifikowane 32 tematy prac, w obrębie 22 projektów zgłoszonych przez Apache Software Foundation. Jednym z nich jest Apache Tuscany, w którym aktualnie bierze udział 6-ciu GsoC studentów realizujących 5 tematów. Tuscany cieszy się zainteresowaniem :)&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7665691180445113014-3691769217098162137?l=blog.foomatik.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.foomatik.com/feeds/3691769217098162137/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7665691180445113014&amp;postID=3691769217098162137' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/3691769217098162137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/3691769217098162137'/><link rel='alternate' type='text/html' href='http://blog.foomatik.com/2008/06/apache-tuscany-whodzi-z-inkubatora.html' title='Apache Tuscany wyszedł z inkubatora!'/><author><name>Wojtek</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7665691180445113014.post-8717058299373215918</id><published>2008-06-14T20:12:00.010+02:00</published><updated>2008-07-11T00:38:17.114+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Apache Tuscany'/><category scheme='http://www.blogger.com/atom/ns#' term='GSoC2008'/><title type='text'>Google Summer of Code 2008</title><content type='html'>&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 300px; height: 300px;" src="http://www.theebgar.net/files/images_post/GSOC2008_1F/soc08300x300_white.jpg" alt="" border="0" /&gt;News jest spóźniony. Przeraźliwie spóźniony. Ale nie mogę o tym nie napisać. 21 kwietnia otrzymałem informację, że zakwalifikowałem się do Google Summer of Code 2008. Nie mogłem uwierzyć! &lt;p style="margin-bottom: 0cm;"&gt;Ale jak to się stało? Na przełomie marca i kwietnia 2008 roku zacząłem się starać o udział w tegorocznym Google Summer of Code. Właściwie to, gdy ogłoszeno programu byłem trochę sceptycznie nastawiony, jednak kilka rozmów rozjaśniło mi w głowie – "w tym roku spróbuję" - rzekłem do siebie w myślach. Zacząłem od przeglądania dostępnych projektów, wiedziałem że będzie raczej Java, więc na początek zacząłem od listy Apache Software Foundation. Po krótkim przeglądzie kodu Derby i oglądania kwiatków typu metody o nazwach „useMe”, stwierdziłem że grzebanie w... ;) tzn. że Derby nie jest dla mnie. Dalszy przegląd zaowocował poznaniem takich terminów jak... Toskania, czyli rejon geograficzny we Włoszech i tędy krótka droga już do Apache Tuscany (a może to było odwrotnie?;)). Zobaczyłem ciekawe tematy, jak np. portowanie Tuscany na Google-owego Androida, jednak mając świadomość silnej konkurencji wybrałem niszę dla siebie, którą jest również ciekawy projekt, a po naszemu mniej więcej „Wsparcie dla CORBA w Apache Tuscany”  - stworzenie binding extension, interface extension dla obiektów CORBA i języka IDL. Dalej poszło już samo, skontaktowałem się z potencjalnymi mentorami, zapisałem do listy mailingowej i zacząłem pisać podanie, które okazało się być wystarczająco dobre. Po drodze otrzymałem jeszcze miłą niespodziankę, w postaci przedłużenia deadline-u podań o tydzień, co być może uratowało sprawę.&lt;br /&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;Uczestnictwo w GSoC2008 wiązało się również z podjęciem ważnego wyboru – rezygnacji z pracy zarobkowej. W końcu obowiązków byłoby za dużo, a stypendium fundowane przez Google nie jest wcale takie niskie. Tak więc prawie po dwóch latach ponownie prowadzę żywot wesołego studenta. ;)&lt;br /&gt;&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;Jak wygląda postęp prac? Właściwie to czasowo jestem prawie w połowie pierwszego (z dwóch) etapu. Aktualnie pracuję nad reference bindingiem dla CORBY, a do okolic 7 lipca chciałbym ukończyć service binding. Życie jest jednak brutalne, i od dłuższego czasu zamiast wesoło kodować, ustalam kolejne szczegóły, bo jednak chyba okazało się, że autor tematu miał co innego niż ja na myśli.&lt;/p&gt;  &lt;p style="margin-bottom: 0cm;"&gt;Trzymajcie kciuki!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7665691180445113014-8717058299373215918?l=blog.foomatik.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.foomatik.com/feeds/8717058299373215918/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7665691180445113014&amp;postID=8717058299373215918' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/8717058299373215918'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/8717058299373215918'/><link rel='alternate' type='text/html' href='http://blog.foomatik.com/2008/06/google-summer-of-code-2008.html' title='Google Summer of Code 2008'/><author><name>Wojtek</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7665691180445113014.post-7699490379388499707</id><published>2008-05-17T20:41:00.004+02:00</published><updated>2008-07-11T00:33:33.957+02:00</updated><title type='text'>Pragmatyczne blogowanie</title><content type='html'>Czytąc sobie "Pragmatczynego programistę" natrafiwszy na rozdział o wersjonowaniu wszystkiego-co-się-rusza ;) zdałem sobię sprawę, że dobrze by było przetrzymywać wpisy z bloga w prywatnym SVN-ie. Takowego prywatnego posiadam, a kopii tekstów prócz bloggera nie mam - co jest złe. Kolejnym złem jest, że edytor wpisów z bloggera jest, delikatnie mówiąc, ułomny - brak w nim możliwości chociażby cytowania kodu źródłowego, a sposób w jaki go wstawiam (copy-paste z generatora bloku kodu gdzieś na www) sprawia, że kody często się rozjeżdzaja. Tak naprawdę to pewne możliwości przynośi edytor kodu HTML z bloggera, ale dzisiaj nikt o zdrowych zmysłach nie pisze czystego HTML (przepraszam tych o niezdrowych zmysłach :D). Wszystko to mało wygodne, mało pragmatyczne, mało genertyczne i bardzo chaotyczne.&lt;br /&gt;&lt;br /&gt;Wniosek nasuwa się jeden - użyć jakiegoś Worda, przechowywać wersje w SVN-ie (bieda, bo binarki), generować z tego HTML i wklejać do bloggera, lub - pisać posty w Tex, wersjonować (plain text!) generować dokumenty do HTML, i metodologią Copiego-Paste-a aplikować do bloggera.&lt;br /&gt;To drugie bardziej mi się podoba, niestety jak narazie na etapie tworzenia środowiska dla Tex i tego, abym mógł generować HTML, co jak się okazuje, sprawą banalną wcale nie jest.&lt;br /&gt;&lt;br /&gt;Oczywiście ten post nie jest również zwersjonowany, a im później opracuję rozwiązanie, tym więcej roboty będę miał.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7665691180445113014-7699490379388499707?l=blog.foomatik.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.foomatik.com/feeds/7699490379388499707/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7665691180445113014&amp;postID=7699490379388499707' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/7699490379388499707'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/7699490379388499707'/><link rel='alternate' type='text/html' href='http://blog.foomatik.com/2008/05/pragmatyczne-blogowanie.html' title='Pragmatyczne blogowanie'/><author><name>Wojtek</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7665691180445113014.post-3823619143109315404</id><published>2008-05-07T10:28:00.091+02:00</published><updated>2008-12-11T02:01:18.498+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Apache Tuscany'/><category scheme='http://www.blogger.com/atom/ns#' term='SCA'/><title type='text'>Rozszerzanie Apache Tuscany: typy wiązań (Extension bindings)</title><content type='html'>Rozszerzanie Apache Tuscany o nowe typy wiązań pozwala na wprowadzanie nowych protokołów komunikacji. Typy wiązań wykorzystywane są więc przez:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;referencje (references), w celu przetłumaczenia wywołania na protokół specyficzny dla danej usługi&lt;/li&gt;&lt;li&gt;usługi (services), w celu opisania protokołu jaki zostanie użyty przez klientów korzystających z komponentu&lt;/li&gt;&lt;/ul&gt;Dla przykładu, wiązanie WebService (WS) pozwala na wywoływanie metod usługi WS (binding zapewnia nam implementację komunikacji z WS), a także na wystawienie światu kompozytu poprzez WS.&lt;br /&gt;&lt;br /&gt;Temat rozszerzania Apache Tuscany został całkiem obszernie opisany w &lt;a href="http://incubator.apache.org/tuscany/sca-java-extension-development-guide.data/ExtendingTuscany-V01.pdf"&gt;dokumencie PDF&lt;/a&gt;. Dodatkowe informacje można znaleźć na  dość niekompletnym &lt;a href="http://incubator.apache.org/tuscany/sca-java-extension-development-guide.html"&gt;WIKI&lt;/a&gt;. Implementację modułów wiązań można znaleźć w kodzie źródłowym Tuscany-ego (java/sca/modules/binding-*), a przykładowy kod przedstawiony w dokumencie PDF w java/sca/samples/binding-echo-extension.&lt;br /&gt;&lt;br /&gt;W tym wpisie postaram się przedstawić krok po kroku implementację typowego rozszerzenia. Zamierzam zaimplementować prosty protokół pozwalający wywoływać zdalnie operacje. Jego zasada działania to:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;usługa działa przesyłając prosty tekst pomiędzy socketami (TCP), identyfikatorem usługi jest więc nazwa hosta i port&lt;/li&gt;&lt;li&gt;po nawiązaniu połączenia serwer oczekuje od klienta nazwy operacji do wywołania, operacje nie mogą posiadać argumentów wywołania, a zwracają zawsze ciąg znaków. Nazwa operacji kończona jest znakami CR LF tak, aby można było ją wywołać po naciśnięciu klawisza enter w telnecie.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;po przesłaniu nazwy operacji serwer wywołuje operację i zwraca napis klientowi, po czym zamyka połączenie&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1. Przygotowanie&lt;/span&gt;&lt;br /&gt;Będą nam potrzebne:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;tracdycyjnie już dowolne środowisko programistyczne&lt;/li&gt;&lt;li&gt;dystrybucja Apache Tuscany w wersji 1.1&lt;/li&gt;&lt;li&gt;pewna wiedza z zakresu SCA/Tuscany, najlepiej mieć już za sobą jakiś przykład z użyciem Tuscany&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;2. Utworzenie interfejsu reprezentującego zadeklarowane wiązanie&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Interfejs będzie Javowym odpowiednikiem zadeklarowanego w pliku .composite wiązania:&lt;br /&gt;&lt;/span&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;package demo;&lt;br /&gt;&lt;br /&gt;import javax.xml.namespace.QName;&lt;br /&gt;&lt;br /&gt;import org.apache.tuscany.sca.assembly.Binding;&lt;br /&gt;import org.apache.tuscany.sca.assembly.xml.Constants;&lt;br /&gt;&lt;br /&gt;public interface DemoBinding extends Binding {&lt;br /&gt; &lt;br /&gt; QName BINDING_DEMO_QNAME = new QName(Constants.SCA10_TUSCANY_NS, "binding.demo");&lt;br /&gt; &lt;br /&gt; int getPort();&lt;br /&gt; &lt;br /&gt; void setPort(int port);&lt;br /&gt; &lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;span&gt;Metody getPort() i setPort() umieściłem ponieważ wiązanie będzie dodatkowo opisywane przez port nasłuchu usługi, np:&lt;br /&gt;&lt;/span&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&amp;lt;tuscany:binding.demo URI="somehost" port="2048"/&amp;gt;&lt;/code&gt;&lt;/pre&gt;Interfejs domyślnie posiada getter i setter dla URI; skorzystamy z nich w celu przechowania nazwy hosta.&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;3. Implementacja szkieletu&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Architektura Tuscany wymaga stworzenia szeregu klas obsługujących rozszerzenie.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;3.1 Klasa DemoBindingImpl&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Implementacja interfejsu DemoBinding - prosta klasa przechowująca informacje o wiązaniu z pliku composite.&lt;br /&gt;&lt;/span&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;package demo.impl;&lt;br /&gt;&lt;br /&gt;import demo.DemoBinding;&lt;br /&gt;&lt;br /&gt;public class DemoBindingImpl implements DemoBinding {&lt;br /&gt;&lt;br /&gt; private String name;&lt;br /&gt; private String URI;&lt;br /&gt; private int port;&lt;br /&gt;&lt;br /&gt; public boolean isUnresolved() {&lt;br /&gt;  return false;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void setUnresolved(boolean unresolved) {&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public String getName() {&lt;br /&gt;  return name;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void setName(String name) {&lt;br /&gt;  this.name = name;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public String getURI() {&lt;br /&gt;  return URI;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void setURI(String uri) {&lt;br /&gt;  URI = uri;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; @Override&lt;br /&gt; public Object clone() throws CloneNotSupportedException {&lt;br /&gt;  return super.clone();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public int getPort() {&lt;br /&gt;  return port;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void setPort(int port) {&lt;br /&gt;  this.port = port; &lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt; 3.2 Klasa DemoBindingProcessor&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;Klasa odpowiedzialna za przeczytanie (oraz zapisanie, czego jeszcze nie przetestowałem) konfiguracji bindingu z pliku composite. Warto przyjżeć się metodzie read(), która pokazuje jak tworzony jest obiekt implementujący interfejs DemoBinding.&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;package demo.impl;&lt;br /&gt;&lt;br /&gt;import javax.xml.namespace.QName;&lt;br /&gt;import javax.xml.stream.XMLStreamException;&lt;br /&gt;import javax.xml.stream.XMLStreamReader;&lt;br /&gt;import javax.xml.stream.XMLStreamWriter;&lt;br /&gt;&lt;br /&gt;import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessor;&lt;br /&gt;import org.apache.tuscany.sca.contribution.resolver.ModelResolver;&lt;br /&gt;import org.apache.tuscany.sca.contribution.service.ContributionReadException;&lt;br /&gt;import org.apache.tuscany.sca.contribution.service.ContributionResolveException;&lt;br /&gt;import org.apache.tuscany.sca.contribution.service.ContributionWriteException;&lt;br /&gt;&lt;br /&gt;import demo.DemoBinding;&lt;br /&gt;&lt;br /&gt;public class DemoBindingProcessor implements StAXArtifactProcessor&lt;demobinding&gt; {&lt;br /&gt;&lt;br /&gt; public QName getArtifactType() {&lt;br /&gt; return DemoBinding.BINDING_DEMO_QNAME;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public DemoBinding read(XMLStreamReader reader)&lt;br /&gt;   throws ContributionReadException, XMLStreamException {&lt;br /&gt;  DemoBinding binding = new DemoBindingImpl();&lt;br /&gt;  binding.setURI(reader.getAttributeValue(null, "URI"));&lt;br /&gt;  try {&lt;br /&gt;   binding.setPort(Integer.parseInt(reader.getAttributeValue(null, "port")));&lt;br /&gt;  } catch (NumberFormatException e) {&lt;br /&gt;  }&lt;br /&gt;  return binding;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void write(DemoBinding binding, XMLStreamWriter writer)&lt;br /&gt;   throws ContributionWriteException, XMLStreamException {&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public Class&lt;demobinding&gt; getModelType() {&lt;br /&gt;  return DemoBinding.class;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void resolve(DemoBinding arg0, ModelResolver arg1)&lt;br /&gt;  throws ContributionResolveException {&lt;br /&gt; }&lt;br /&gt;}&lt;demobinding&gt;&lt;demobinding&gt;&lt;demobinding&gt;&lt;demobinding&gt;&lt;demobinding&gt;&lt;demobinding&gt;&lt;demobinding&gt;&lt;demobinding&gt;&lt;br /&gt;&lt;/demobinding&gt;&lt;/demobinding&gt;&lt;/demobinding&gt;&lt;/demobinding&gt;&lt;/demobinding&gt;&lt;/demobinding&gt;&lt;/demobinding&gt;&lt;/demobinding&gt;&lt;/code&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt; 3.3 Klasa DemoInvoker&lt;br /&gt;&lt;/span&gt;&lt;span&gt;To klasa która tłumaczy wywołania Tuscany na wywołanie usługi implementowanego przez nas typu. Przykładowy reference binding będzie łączyć się do socketu na zadanym hoście i porcie, przesyłać nazwę żądanej operacji i zwracać wynik otrzymany z połączenia sieciowego:&lt;br /&gt;&lt;/span&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;package demo.impl;&lt;br /&gt;&lt;br /&gt;import java.io.OutputStream;&lt;br /&gt;import java.net.Socket;&lt;br /&gt;&lt;br /&gt;import org.apache.tuscany.sca.invocation.Invoker;&lt;br /&gt;import org.apache.tuscany.sca.invocation.Message;&lt;br /&gt;&lt;br /&gt;import demo.DemoBinding;&lt;br /&gt;&lt;br /&gt;public class DemoInvoker implements Invoker {&lt;br /&gt;&lt;br /&gt; private DemoBinding binding;&lt;br /&gt; &lt;br /&gt; public DemoInvoker(DemoBinding binding) {&lt;br /&gt;  this.binding = binding;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public Message invoke(Message msg) {&lt;br /&gt;  try {&lt;br /&gt;   Socket socket = new Socket(binding.getURI(), binding.getPort());&lt;br /&gt;   OutputStream output = socket.getOutputStream();&lt;br /&gt;   output.write(msg.getOperation().getName().concat("\r\n").getBytes());&lt;br /&gt;   output.flush();&lt;br /&gt;   byte[] buffer = new byte[1024];&lt;br /&gt;   int read = socket.getInputStream().read(buffer);&lt;br /&gt;   socket.close();&lt;br /&gt;   msg.setBody(new String(buffer).substring(0, read- 1));&lt;br /&gt;   return msg;&lt;br /&gt;  } catch (Exception e) {&lt;br /&gt;  }&lt;br /&gt;  return msg;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt; 3.4 Klasa DemoReferenceBindingProvider&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Implementacja interfejsu ReferenceBindingProvider - dostawcy wiązania referencji, twórcy invokera:&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;package demo.impl;&lt;br /&gt;&lt;br /&gt;import org.apache.tuscany.sca.interfacedef.InterfaceContract;&lt;br /&gt;import org.apache.tuscany.sca.interfacedef.Operation;&lt;br /&gt;import org.apache.tuscany.sca.invocation.Invoker;&lt;br /&gt;import org.apache.tuscany.sca.provider.ReferenceBindingProvider;&lt;br /&gt;&lt;br /&gt;import demo.DemoBinding;&lt;br /&gt;&lt;br /&gt;public class DemoReferenceBindingProvider implements ReferenceBindingProvider {&lt;br /&gt;&lt;br /&gt; private DemoBinding binding;&lt;br /&gt;&lt;br /&gt; public DemoReferenceBindingProvider(DemoBinding binding) {&lt;br /&gt;  this.binding = binding;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public Invoker createInvoker(Operation operation) {&lt;br /&gt;  return new DemoInvoker(binding);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public InterfaceContract getBindingInterfaceContract() {&lt;br /&gt;  return null;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void start() {&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void stop() {&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public boolean supportsOneWayInvocation() {&lt;br /&gt;  return false;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;demobinding&gt;&lt;demobinding&gt;&lt;br /&gt;&lt;/demobinding&gt;&lt;/demobinding&gt;&lt;/code&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;3.5 Klasa DemoServiceRunnable&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Klasa implementująca logikę odpowiedzialną za udostępnienie komponentu jako usługi. Założyłem, że usługa będzie nasłuchiwać na zadanym porcie, a po podłączeniu klienta zwracać wynik metody o nazwie przesłanej przez klienta. Podana metoda zostanie wywołana w komponencie powiązanym z tą usługą. Jeżeli klient prześle nazwę metody nie istniejącej dla interfejsu podpiętego pod wiązanie, to serwer zwróci stosowną informację:&lt;br /&gt;&lt;/span&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;package demo.impl;&lt;br /&gt;&lt;br /&gt;import java.net.ServerSocket;&lt;br /&gt;import java.net.Socket;&lt;br /&gt;import java.util.List;&lt;br /&gt;&lt;br /&gt;import org.apache.tuscany.sca.interfacedef.Operation;&lt;br /&gt;import org.apache.tuscany.sca.runtime.RuntimeComponentService;&lt;br /&gt;&lt;br /&gt;import demo.DemoBinding;&lt;br /&gt;&lt;br /&gt;public class DemoServiceRunnable implements Runnable {&lt;br /&gt;&lt;br /&gt; private RuntimeComponentService service;&lt;br /&gt; private DemoBinding binding;&lt;br /&gt; &lt;br /&gt; public DemoServiceRunnable(RuntimeComponentService service, DemoBinding binding) {&lt;br /&gt;  this.service = service;&lt;br /&gt;  this.binding = binding;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; private boolean active;&lt;br /&gt;&lt;br /&gt; public boolean isActive() {&lt;br /&gt;  return active;&lt;br /&gt; }&lt;br /&gt;  &lt;br /&gt; public void setActive(boolean active) {&lt;br /&gt;  this.active = active;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public void run() {&lt;br /&gt;  active = true;&lt;br /&gt;  try {&lt;br /&gt;   ServerSocket ssocket = new ServerSocket(binding.getPort());&lt;br /&gt;   while (isActive()) {&lt;br /&gt;    Socket csocket = ssocket.accept();&lt;br /&gt;    handleRequest(csocket);&lt;br /&gt;   }&lt;br /&gt;  } catch (Exception e) {&lt;br /&gt;   e.printStackTrace();&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; private void handleRequest(Socket csocket) throws Exception {&lt;br /&gt;  byte[] buffer = new byte[1024];&lt;br /&gt;  csocket.getInputStream().available();&lt;br /&gt;  int read = csocket.getInputStream().read(buffer);&lt;br /&gt;  String requestedOperation = new String(buffer);&lt;br /&gt;  requestedOperation = requestedOperation.substring(0, read - 2);&lt;br /&gt;  List&lt;operation&gt; operations = service.getInterfaceContract().getInterface().getOperations();&lt;br /&gt;  String retString = null;&lt;br /&gt;  for (Operation operation : operations) {&lt;br /&gt;   if (operation.getName().equals(requestedOperation)) {&lt;br /&gt;    retString = (String) service.getRuntimeWire(binding).invoke(operation, new Object[0]) + "\nBinding name: " + binding.getName();&lt;br /&gt;    break;&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  if (retString == null) {&lt;br /&gt;   retString = "Requested operation " + requestedOperation + " not found!";&lt;br /&gt;  }&lt;br /&gt;  csocket.getOutputStream().write(new String(retString + "\n").getBytes());&lt;br /&gt;  csocket.getOutputStream().flush();    &lt;br /&gt;  csocket.close();&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt;}&lt;operation&gt;&lt;operation&gt;&lt;operation&gt;&lt;operation&gt;&lt;operation&gt;&lt;br /&gt;&lt;/operation&gt;&lt;/operation&gt;&lt;/operation&gt;&lt;/operation&gt;&lt;/operation&gt;&lt;/code&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;3.6 Klasa DemoServiceBindingProvider&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Implementacja interfejsu ServiceBindingProvider - dostawcy wiązania usługi:&lt;/span&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;package demo.impl;&lt;br /&gt;&lt;br /&gt;import org.apache.tuscany.sca.interfacedef.InterfaceContract;&lt;br /&gt;import org.apache.tuscany.sca.provider.ServiceBindingProvider;&lt;br /&gt;import org.apache.tuscany.sca.runtime.RuntimeComponentService;&lt;br /&gt;&lt;br /&gt;import demo.DemoBinding;&lt;br /&gt;&lt;br /&gt;public class DemoServiceBindingProvider implements ServiceBindingProvider {&lt;br /&gt;&lt;br /&gt; private DemoServiceRunnable serviceHandler;&lt;br /&gt; private RuntimeComponentService service;&lt;br /&gt;&lt;br /&gt; public DemoServiceBindingProvider(RuntimeComponentService service, DemoBinding binding) {&lt;br /&gt;  this.service = service;&lt;br /&gt;  this.serviceHandler = new DemoServiceRunnable(service, binding);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public InterfaceContract getBindingInterfaceContract() {&lt;br /&gt;  return service.getInterfaceContract();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void start() {&lt;br /&gt;  Thread thread = new Thread(serviceHandler);&lt;br /&gt;  thread.start();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void stop() {&lt;br /&gt;  serviceHandler.setActive(false);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public boolean supportsOneWayInvocation() {&lt;br /&gt;  return false;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt; 3.7 DemoBindingProviderFactory&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Implementacja interfejsu BindingProviderFactory - fabryki dostawców referencji i usług:&lt;/span&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;package demo.impl;&lt;br /&gt;&lt;br /&gt;import org.apache.tuscany.sca.provider.BindingProviderFactory;&lt;br /&gt;import org.apache.tuscany.sca.provider.ReferenceBindingProvider;&lt;br /&gt;import org.apache.tuscany.sca.provider.ServiceBindingProvider;&lt;br /&gt;import org.apache.tuscany.sca.runtime.RuntimeComponent;&lt;br /&gt;import org.apache.tuscany.sca.runtime.RuntimeComponentReference;&lt;br /&gt;import org.apache.tuscany.sca.runtime.RuntimeComponentService;&lt;br /&gt;&lt;br /&gt;import demo.DemoBinding;&lt;br /&gt;&lt;br /&gt;public class DemoBindingProviderFactory implements BindingProviderFactory&lt;demobinding&gt; {&lt;br /&gt;&lt;br /&gt; public ReferenceBindingProvider createReferenceBindingProvider(RuntimeComponent rc, RuntimeComponentReference rcr, DemoBinding binding) {&lt;br /&gt;  return new DemoReferenceBindingProvider(binding);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public ServiceBindingProvider createServiceBindingProvider(RuntimeComponent rc, RuntimeComponentService rcs, DemoBinding binding) {&lt;br /&gt;  return new DemoServiceBindingProvider(rcs, binding);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public Class&lt;demobinding&gt; getModelType() {&lt;br /&gt;  return DemoBinding.class;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;demobinding&gt;&lt;demobinding&gt;&lt;demobinding&gt;&lt;demobinding&gt;&lt;demobinding&gt;&lt;demobinding&gt;&lt;demobinding&gt;&lt;demobinding&gt;&lt;demobinding&gt;&lt;demobinding&gt;&lt;br /&gt;&lt;/demobinding&gt;&lt;/demobinding&gt;&lt;/demobinding&gt;&lt;/demobinding&gt;&lt;/demobinding&gt;&lt;/demobinding&gt;&lt;/demobinding&gt;&lt;/demobinding&gt;&lt;/demobinding&gt;&lt;/demobinding&gt;&lt;/code&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt; 4. Integrownie rozszerzenia z Apache Tuscany&lt;/span&gt;&lt;br /&gt;Włączenie rozszerzenia sprowadza się do stworzenia klasy aktywatora oraz wskazania jej w jednym z plików konfiguracyjnych.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4.1 Aktywator&lt;/span&gt; - klasa demo.activation.DemoModuleActivator interfejsu ModuleActivator:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;package demo.activation;&lt;br /&gt;&lt;br /&gt;import org.apache.tuscany.sca.contribution.processor.StAXArtifactProcessorExtensionPoint;&lt;br /&gt;import org.apache.tuscany.sca.core.ExtensionPointRegistry;&lt;br /&gt;import org.apache.tuscany.sca.core.ModuleActivator;&lt;br /&gt;import org.apache.tuscany.sca.provider.ProviderFactoryExtensionPoint;&lt;br /&gt;&lt;br /&gt;import demo.impl.DemoBindingProcessor;&lt;br /&gt;import demo.impl.DemoBindingProviderFactory;&lt;br /&gt;&lt;br /&gt;public class DemoModuleActivator implements ModuleActivator {&lt;br /&gt;&lt;br /&gt; public void start(ExtensionPointRegistry registry) {&lt;br /&gt;  StAXArtifactProcessorExtensionPoint processors = registry.getExtensionPoint(StAXArtifactProcessorExtensionPoint.class);&lt;br /&gt;  processors.addArtifactProcessor(new DemoBindingProcessor());&lt;br /&gt;  ProviderFactoryExtensionPoint providerFactories = registry.getExtensionPoint(ProviderFactoryExtensionPoint.class);&lt;br /&gt;  providerFactories.addProviderFactory(new DemoBindingProviderFactory());  &lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void stop(ExtensionPointRegistry arg0) {  &lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Interfejs posiada dwie metody: start() i stop(), wykonywane odpowiednio przy starcie i zatrzymaniu modułu.&lt;br /&gt;Rozszerzenia rejestrujemy w Tuscany w tzw. extension pointach, i tak w powyższej klasie wykorzystujemy extension pointy:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;StAXArtifactProcessorExtensionPoint - rejestr procesorów artefaktów DOM, w naszym przypadku zarejestrujemy uprzednio stworzony DemoBindingProcessor&lt;br /&gt;&lt;/li&gt;&lt;li&gt;ProviderFactoryExtensionPoint - rejestr fabryk dostawców rozszerzeń, w naszym przypadku zarejestrujemy DemoBindingProviderFactory&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;4.2 Konfiguracja&lt;/span&gt;&lt;br /&gt;Należy dopisać do pliku META-INF/services/org.apache.tuscany.sca.core.ModuleActivator nazwę klasy aktywatora:&lt;br /&gt;&lt;br /&gt;demo.activation.DemoModuleActivator&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;5. Test&lt;/span&gt;, czyli pokażmy że to działa&lt;br /&gt;Scenariusz testu przewiduje:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;wystawienie usługi poprzez "gniazdkowy" ;) protokół&lt;/li&gt;&lt;li&gt;wywołanie zdalnej operacji poprzez "gniazdkowy" protokół. Nie będziemy pisać osobnej usługi działającej wg. tego protokołu - wykorzystamy usługę opisaną w poprzednim punkcie, która będzie "wystawiana" przez Tuscany&lt;/li&gt;&lt;/ul&gt;Poniżej diagram kompozytu, który stworzymy (zrobiłem go przy użyciu &lt;span style="font-weight: bold;"&gt;dia&lt;/span&gt;, właściwie to istnieje plugin dla eclipse umożliwiający tworzenie takich diagramów i pliki composite przy pomocy GUI, jednak miałem pewne trudności z jego poprawną instalacją).&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_F_UzqhdTHE0/SCLn0-lZ_1I/AAAAAAAAAAU/E4j_TNwL7uk/s1600-h/1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 411px; height: 244px;" src="http://1.bp.blogspot.com/_F_UzqhdTHE0/SCLn0-lZ_1I/AAAAAAAAAAU/E4j_TNwL7uk/s400/1.png" alt="" id="BLOGGER_PHOTO_ID_5197971817278078802" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;5.1 Interfejs demo.test.RemoteDemoInterface&lt;/span&gt; będzie interfejsem skojarzonym z reference bindingiem:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;package demo.test;&lt;br /&gt;&lt;br /&gt;import org.osoa.sca.annotations.Remotable;&lt;br /&gt;&lt;br /&gt;@Remotable&lt;br /&gt;public interface RemoteDemoInterface  {&lt;br /&gt;&lt;br /&gt; String executeServiceTest();&lt;br /&gt; &lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;5.2 Interfejs demo.test.BindingTest&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Lista operacji udostępnianych poprzez nasz protokół:&lt;br /&gt;&lt;/span&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;package demo.test;&lt;br /&gt;&lt;br /&gt;public interface BindingTest {&lt;br /&gt;&lt;br /&gt; String executeServiceTest();&lt;br /&gt; &lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;5.3 Klasa demo.test.BindingTestImpl&lt;/span&gt; posłuży nam za implementację komponentu oraz miejsce przetestowania bindingu:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;package demo.test;&lt;br /&gt;&lt;br /&gt;import org.apache.tuscany.sca.host.embedded.SCADomain;&lt;br /&gt;import org.osoa.sca.annotations.Reference;&lt;br /&gt;&lt;br /&gt;public class BindingTestImpl implements BindingTest {&lt;br /&gt;&lt;br /&gt; private RemoteDemoInterface demoBinding;&lt;br /&gt; &lt;br /&gt; @Reference&lt;br /&gt; public void setDemoBinding(RemoteDemoInterface demoBinding) {&lt;br /&gt;  this.demoBinding = demoBinding;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public String executeReferenceTest() {&lt;br /&gt;  return demoBinding.executeServiceTest();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public String executeServiceTest() {&lt;br /&gt;  return "This is method for service";&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public static void main(String[] args) {&lt;br /&gt;  SCADomain domain = SCADomain.newInstance("demo/test/BindingTest.composite");&lt;br /&gt;  BindingTestImpl test = domain.getService(BindingTestImpl.class, "BindingTest");&lt;br /&gt;  System.out.println(test.executeReferenceTest());&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;span&gt;Metoda executeServiceTest() jest przeznaczona do użytku klientów service bindingu. Metoda executeReferenceTest() zostanie wywołana lokalnie (z metody uruchomieniowej main) i spowoduje zdalne wywołanie usługi, a finalnie metody executeServiceTest().&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;5.4&lt;/span&gt; Stwórzmy plik demo/test/&lt;span style="font-weight: bold;"&gt;BindingTest.composite&lt;/span&gt; opisujący referencję i usługi dla stworzonych reference/service bindingów:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&amp;lt;composite xmlns="http://www.osoa.org/xmlns/sca/1.0"&lt;br /&gt;         xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.0"&lt;br /&gt;         targetNamespace="http://sample"&lt;br /&gt;         xmlns:sample="http://sample"&lt;br /&gt;         name="BindingTestComposite"&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;component name="BindingTest"&amp;gt;&lt;br /&gt;  &amp;lt;implementation.java class="demo.test.BindingTestImpl" /&amp;gt;&lt;br /&gt; &amp;lt;/component&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;reference name="DemoReference" promote="BindingTest/demoBinding"&amp;gt;&lt;br /&gt;  &amp;lt;tuscany:binding.demo URI="localhost" port="2048"/&amp;gt;&lt;br /&gt; &amp;lt;/reference&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;service name="DemoServiceBinding" promote="BindingTest"&amp;gt;&lt;br /&gt;  &amp;lt;interface.java interface="demo.test.BindingTest"/&amp;gt;&lt;br /&gt;  &amp;lt;tuscany:binding.demo port="2048"/&amp;gt;&lt;br /&gt; &amp;lt;/service&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/composite&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Wynik działania klasy uruchomieniowej:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;This is method for service&lt;br /&gt;Binding name: DemoServiceBinding2048&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;W celu przetestowania service bindingu podłączmy się telnetem do Tuscany-ego na port 2048, wywołajmy dozwoloną (executeServiceTest) oraz nie istniejącą (executeNonExistingTest) operację (kolorem &lt;span style="color: rgb(51, 51, 255);"&gt;niebieskim&lt;/span&gt; oznaczyłem tekst wprowadzany przez użytkownika):&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;span style="font-weight: bold;"&gt;jnk@blackhawk:~$&lt;/span&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;telnet localhost 2048&lt;/span&gt;&lt;br /&gt;Trying 127.0.0.1...&lt;br /&gt;Connected to localhost.&lt;br /&gt;Escape character is '^]'.&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;executeServiceTest&lt;/span&gt;&lt;br /&gt;This is method for service&lt;br /&gt;Binding name: DemoServiceBinding2048&lt;br /&gt;Connection closed by foreign host.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;jnk@blackhawk:~$&lt;/span&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;telnet localhost 2048&lt;/span&gt;&lt;br /&gt;Trying 127.0.0.1...&lt;br /&gt;Connected to localhost.&lt;br /&gt;Escape character is '^]'.&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;executeNonExistingTest&lt;/span&gt;&lt;br /&gt;Requested operation executeNonExistingTest not found!&lt;br /&gt;Connection closed by foreign host.&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7665691180445113014-3823619143109315404?l=blog.foomatik.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.foomatik.com/feeds/3823619143109315404/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7665691180445113014&amp;postID=3823619143109315404' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/3823619143109315404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/3823619143109315404'/><link rel='alternate' type='text/html' href='http://blog.foomatik.com/2008/05/rozszerzanie-apache-tuscany-typy-wiza.html' title='Rozszerzanie Apache Tuscany: typy wiązań (Extension bindings)'/><author><name>Wojtek</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_F_UzqhdTHE0/SCLn0-lZ_1I/AAAAAAAAAAU/E4j_TNwL7uk/s72-c/1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7665691180445113014.post-7585303297804774774</id><published>2008-05-01T18:19:00.024+02:00</published><updated>2008-07-11T00:11:14.088+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CORBA'/><category scheme='http://www.blogger.com/atom/ns#' term='AMI'/><category scheme='http://www.blogger.com/atom/ns#' term='JacORB'/><title type='text'>Asynchroniczne wołanie metod (AMI) w JacORB</title><content type='html'>W tym wpisie spróbuję pokazać tzw. Asynchronous Method Invocation (AMI) w prostej aplikacji z  użyciem CORBA. Potrzebne będą nam:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;raczej dowolne środowisko programistyczne dla Javy&lt;/li&gt;&lt;li&gt;zainstalowana dystrubucja JacORB (&lt;a href="http://www.jacorb.org/"&gt;strona JacORB&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;Przykładowy program znajduje się w dystrubucji JacORBa, w katalogu demo/ami.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Jak zrezalizowano asynchroniczne wołanie metod?&lt;/span&gt;&lt;br /&gt;Klient woła metodę odległego obiektu, a w celu otrzymania wyniku udostępnia interfejs zwrotny, również poprzez CORBA. Klient udostępnia 2 metody zwrotne dla serwera:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Metodę - punkt przekazania wyniku działania metody serwera.&lt;/li&gt;&lt;li&gt;Metodę wyjątku, pozwalającą przekazać do klienta napotkany na serwerze wyjątek.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;font-size:130%;" &gt;Przykładowa aplikacja krok po kroku&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Stwórzmy zdalny obiekt, który wywoływany asynchronicznie będzie dostarczał usługę dzielenia dwóch liczb całkowitych.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;1. Interfejs zdalnego obiektu.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;Nasz zdalny obiekt (Calc) będzie posiadał jedną metodę - dzielenie dwóch liczb. Zapiszmy to w pliku &lt;/span&gt;&lt;span&gt;calc.idl w głównym drzewie ze źródłami projektu:&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;module demo {&lt;br /&gt; interface Calc {&lt;br /&gt;     double div(in long p1, in long p2);&lt;br /&gt; };&lt;br /&gt;};&lt;/pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;2. Wygenerowanie szkieletów i namiastek&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;Posłużymy się skryptem idl w binariach JacORBa. Kompilację pliku calc.idl wykonujemy poprzez polecenie idl -ami_callback calc.idl. Przełącznik -ami_callback spowoduje wygenerowanie dodatkowych klas, odpowiedzialnych za dostarczenie bazy dla komunikacji asynchronicznej.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;3. Implementacja logiki&lt;/span&gt;&lt;br /&gt;Otrzymany zestaw klas pozwala nam na impementację obiektu serwera oraz wspomnianych w pkt. 1 metod klienta.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3.1 Logika serwera&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;Stwórzmy klasę CalcPOAImpl, która będzie specjalizacją abstrakcyjnej klasy CalcPOA. Zaimplementujmy logikę aplikacji poprzez implementację metody div:&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;package demo;&lt;br /&gt;&lt;br /&gt;public class CalcPOAImpl extends CalcPOA {&lt;br /&gt;&lt;br /&gt; public double div(int p1, int p2) {&lt;br /&gt;  return p1 / p2;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;  &lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;3.2 Metody zwrotne (klient)&lt;br /&gt;&lt;/span&gt;Stwórzmy klasę AMI_CalcHandlerPOAImpl, która będzie specjalizacją abstrakcyjnej klasy AMI_CalcHandlerPOA. Zaimplementujmy logikę klienta w przypadku zwrócenia wyniku przez serwer (metoda div) bądź podniesienia wyjątku (div_excep):&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; &lt;/span&gt; &lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;package demo;&lt;br /&gt;&lt;br /&gt;import org.omg.Messaging.ExceptionHolder;&lt;br /&gt;&lt;br /&gt;public class AMI_CalcHandlerPOAImpl extends AMI_CalcHandlerPOA {&lt;br /&gt;&lt;br /&gt; public void div(double ami_return_val) {&lt;br /&gt;  System.out.println("Klient: serwer zwrócił wynik: " + ami_return_val);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void div_excep(ExceptionHolder excep_holder) {&lt;br /&gt;  System.out.println("Klient: serwer podniósł wyjątek");&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;  &lt;span style="font-weight: bold;"&gt;4. Implementacja serwera i klienta&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;Implementacja serwera:&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt; &lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;package demo;&lt;br /&gt;&lt;br /&gt;import org.omg.CORBA.*;&lt;br /&gt;import org.omg.PortableServer.*;&lt;br /&gt;&lt;br /&gt;public class MyServer {&lt;br /&gt; public static void main(String args[]) {&lt;br /&gt;  try {&lt;br /&gt;   ORB orb = ORB.init(args, null);&lt;br /&gt;   POA poa = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));&lt;br /&gt;   poa.the_POAManager().activate();&lt;br /&gt;   CalcPOAImpl s = new CalcPOAImpl();&lt;br /&gt;   org.omg.CORBA.Object obj = poa.servant_to_reference(s);&lt;br /&gt;   orb.object_to_string(obj);&lt;br /&gt;   System.out.println(orb.object_to_string(obj));&lt;br /&gt;   orb.run();&lt;br /&gt;  } catch (Exception e) {&lt;br /&gt;   System.out.println("ERROR : " + e);&lt;br /&gt;   e.printStackTrace(System.out);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;  Implementacja klienta:&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt; &lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;package demo;&lt;br /&gt;&lt;br /&gt;import org.omg.CORBA.*;&lt;br /&gt;import org.omg.PortableServer.*;&lt;br /&gt;&lt;br /&gt;public class MyClient {&lt;br /&gt;&lt;br /&gt; public static void main(String[] args) throws Exception {&lt;br /&gt;  if (args.length != 1) {&lt;br /&gt;   System.out.println("Usage: object reference");&lt;br /&gt;   System.exit(1);&lt;br /&gt;  }&lt;br /&gt;  try {&lt;br /&gt;   ORB orb = (ORB) ORB.init(args, null);&lt;br /&gt;   POA poa = (POA) POAHelper.narrow(orb.resolve_initial_references("RootPOA"));&lt;br /&gt;   poa.the_POAManager().activate();&lt;br /&gt;   org.omg.CORBA.Object obj = orb.string_to_object(args[0]);&lt;br /&gt;   Calc s = (Calc) CalcHelper.narrow(obj);&lt;br /&gt;   AMI_CalcHandler h = (AMI_CalcHandler) new AMI_CalcHandlerPOAImpl()._this(orb);&lt;br /&gt;   System.out.print("* 1 / 1 = ");&lt;br /&gt;   ((_CalcStub) s).sendc_div(h, 1, 1);&lt;br /&gt;   System.out.print("* 1 / 0 = ");&lt;br /&gt;   ((_CalcStub) s).sendc_div(h, 1, 0);&lt;br /&gt;   try {&lt;br /&gt;     Thread.sleep(10000);&lt;br /&gt;   } catch (InterruptedException ex) {&lt;br /&gt;    ex.printStackTrace();&lt;br /&gt;   }&lt;br /&gt;  } catch (Exception ex) {&lt;br /&gt;   System.err.println(ex);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;ior_file&gt;&lt;br /&gt;&lt;/ior_file&gt;&lt;/pre&gt;I wreszcie &lt;span style="font-weight: bold;"&gt;5. Uruchamianie&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Zarówno serwer jak i klienta możemy uruchomić skryptem &lt;span style="font-weight: bold;"&gt;jaco&lt;/span&gt; znajdującym się w katolugu bin JacORBa. Innym wyjściem jest dodanie parametrów JVM np. ze środowiska programistycznego:&lt;br /&gt;&lt;/span&gt; &lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;-Djacorb.home=&lt;ścieżka do JacORB&gt;&lt;br /&gt;-Dorg.omg.CORBA.ORBClass=org.jacorb.orb.ORB&lt;br /&gt;-Dorg.omg.CORBA.ORBSingletonClass=org.jacorb.orb.ORBSingleton&lt;br /&gt;&lt;/pre&gt;  &lt;span&gt;&lt;span&gt;Serwer po uruchomieniu wypisze na ekran łańcuch znaków będący referencją do serwowanego obiektu CORBA. Argumentem uruchomienia klienta jest właśnie ta poprzednio podana referencja.&lt;br /&gt;&lt;br /&gt;Przykładowy klient wykona dwa razy zdalną metodę, pierwszy raz poprawnie, drugi raz prowokując podniesienie wyjątku dzielenia przez 0. Wynikiem działania klienta powinno być:&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;span&gt;&lt;span&gt;* 1 / 1 = Klient: serwer zwrócił wynik: 1.0&lt;br /&gt;* 1 / 0 = Klient: serwer podniósł wyjątek&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;Powodzenia!&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7665691180445113014-7585303297804774774?l=blog.foomatik.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.foomatik.com/feeds/7585303297804774774/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7665691180445113014&amp;postID=7585303297804774774' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/7585303297804774774'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/7585303297804774774'/><link rel='alternate' type='text/html' href='http://blog.foomatik.com/2008/05/asynchroniczne-woanie-metod-ami-w.html' title='Asynchroniczne wołanie metod (AMI) w JacORB'/><author><name>Wojtek</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7665691180445113014.post-863497793900781908</id><published>2008-04-20T17:07:00.047+02:00</published><updated>2010-03-18T13:01:00.647+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Apache Tuscany'/><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='SCA'/><title type='text'>Wprowadzenie do Service Component Architecture cz. 3: Przykładowa aplikacja</title><content type='html'>W tym wpisie zaprezentuję proces tworzenia prostej aplikacji z wykorzystaniem SCA.&lt;br /&gt;&lt;br /&gt;Wymagania:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Dowolne środowisko programistyczne Java&lt;/li&gt;&lt;li&gt;Dystrybucja Apache Tuscany SCA Java&lt;/li&gt;&lt;li&gt;Serwer aplikacyjny lub kontener serwletów z możliwością wystawienia usługi WebService&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Scenariusz.&lt;/span&gt;&lt;br /&gt;Wyobraźmy sobie, że chcemy stworzyć program pobierający zlokalizowany stan danego konta bankowego. Zlokalizowany oznacza, że stan konta zostanie podany w konkretnej walucie, zależnej od parametru. Program będzie udostępniał swiatu swoje usługi poprzez interfejs WebService.&lt;br /&gt;&lt;br /&gt;Przyjmijmy, że mamy dostęp do:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;usługi (WebService) pobierającą stan konta bankowego w PLN.&lt;/li&gt;&lt;li&gt;implementację klienta, który skonwertuje daną wartość do podanej waluty (żeby było ciekawiej, jest to klient w... JavaScript!).&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;1. Utworzenie interfejsów&lt;/span&gt;&lt;br /&gt;Mamy dostęp i musimy skorzystać z dwóch zewnętrznych komponentów programowych (WebService i funkcja JavaScript). Aby uzyskać do nich dostęp stwórzmy ich interfejsy.&lt;br /&gt;&lt;br /&gt;AccountInfo.java - interfejs usługi dostępu do stanu konta (docelowym obiektem jest WebService)&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;package demo;&lt;br /&gt;&lt;br /&gt;import org.osoa.sca.annotations.Remotable;&lt;br /&gt;&lt;br /&gt;@Remotable&lt;br /&gt;public interface AccountInfo {&lt;br /&gt;&lt;br /&gt;double getAccountInfo(int accountId);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;CurrencyConverter.java - interfejs usługi konwersji waluty (docelowo JavaScript)&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;package demo;&lt;br /&gt;&lt;br /&gt;public interface CurrencyConverter {&lt;br /&gt;&lt;br /&gt;double convert(double amount, String currencyCode);&lt;br /&gt;&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;LocalizedAccountInfo.java - interfejs wystawianej przez nas usługi&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;package demo;&lt;br /&gt;&lt;br /&gt;public interface LocalizedAccountInfo {&lt;br /&gt;&lt;br /&gt;double getAccountInfo(int accountId, String currencyCode);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;2. Utworzenie usług&lt;/span&gt;&lt;br /&gt;Musimy także zasymulować istnienie wspomnianych usług, stwórzmy więc funkcję JavaScript w pliku script/cconvert.js:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;function convert(amount, currencyCode) {&lt;br /&gt;&lt;br /&gt;if (currencyCode == "PLN") {&lt;br /&gt; return amount;&lt;br /&gt;} else if (currencyCode == "USD") {&lt;br /&gt; return amount / 2;&lt;br /&gt;} else if (currencyCode == "EUR") {&lt;br /&gt; return amount / 3;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Pozostał jeszcze WebService pobierający stan konta. Ustalmy, że stan konta będzie taki jak jego identyfikator - przykład:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;package demo;&lt;br /&gt;&lt;br /&gt;import javax.jws.WebMethod;&lt;br /&gt;import javax.jws.WebParam;&lt;br /&gt;import javax.jws.WebService;&lt;br /&gt;&lt;br /&gt;@WebService()&lt;br /&gt;public class AccountService {&lt;br /&gt;&lt;br /&gt;@WebMethod(operationName = "getAccountInfo")&lt;br /&gt;public double getAccountInfo(@WebParam(name = "accountId") int accountId) {&lt;br /&gt; return accountId;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Implementację i deployment usługi pozostawiam czytelnikowi. Co będzie nam potrzebne, to działający WebService, oraz jego WSDL, który musi znaleźć się w katalogu "wsdl" w projekcie.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3. Utworzenie implementacji&lt;/span&gt;&lt;br /&gt;Stwórzmy teraz klasę implementującą naszą logikę. Pamiętajmy, że będziemy mieć do dyspozycji obiekty dostępu do implementacji informacji o stanie konta (AccountInfo.java) oraz konwertera waluty (CurrencyConverter.java). Wykorzystajmy je więc i opakujmy setterami:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;package demo;&lt;br /&gt;&lt;br /&gt;import org.osoa.sca.annotations.Reference;&lt;br /&gt;&lt;br /&gt;public class LocalizedAccountInfoImpl implements LocalizedAccountInfo {&lt;br /&gt;&lt;br /&gt;private AccountInfo accountInfo;&lt;br /&gt;private CurrencyConverter currencyConverter;&lt;br /&gt;&lt;br /&gt;@Reference&lt;br /&gt;public void setCurrencyConverter(CurrencyConverter currencyConverter) {&lt;br /&gt; this.currencyConverter = currencyConverter;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@Reference&lt;br /&gt;public void setAccountInfo(AccountInfo accountInfo) {&lt;br /&gt; this.accountInfo = accountInfo;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public double getAccountInfo(int accountId, String currencyCode) {&lt;br /&gt; double amount = accountInfo.getAccountInfo(accountId);&lt;br /&gt; return currencyConverter.convert(amount, currencyCode);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Adnotacja @Reference przy setterach mówi środowisku uruchomieniowemu, że należy "podmapować" jeden ze skonfigurowanych dalej obiektów do danego pola.&lt;br /&gt;&lt;br /&gt;Logika aplikacji w oparciu o zewnętrzne komponenty znajduje się w metodzie getAccountInfo(...).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4. Konfiguracja Apache Tuscany.&lt;/span&gt;&lt;br /&gt;Stwórzmy plik konfiguracyjny AccountInfo.composite.&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&amp;lt;composite xmlns="http://www.osoa.org/xmlns/sca/1.0"&lt;br /&gt;xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.0"&lt;br /&gt;targetNamespace="http://sample"&lt;br /&gt;xmlns:sample="http://sample"&lt;br /&gt;name="Bank"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/composite&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;4.1 Definicja referencji do konwertera walut.&lt;/span&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&amp;lt;component name="CurrencyConverter"&amp;gt;&lt;br /&gt;&amp;lt;tuscany:implementation.script script="script/cconvert.js"/&amp;gt;&lt;br /&gt;&amp;lt;/component&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4.2 Definicja komponentu LocalizedAccountInfo z wbudowaną referencją do usługi AccountInfo.&lt;br /&gt;&lt;/span&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&amp;lt;component name="LocalizedAccountInfo"&amp;gt;&lt;br /&gt;&amp;lt;implementation.java class="demo.LocalizedAccountInfoImpl" /&amp;gt;&lt;br /&gt;&amp;lt;reference name="currencyConverter" target="CurrencyConverter"/&amp;gt;&lt;br /&gt;&amp;lt;reference name="accountInfo"&amp;gt;&lt;br /&gt;&amp;lt;binding.ws wsdlElement="http://demo/#wsdl.port(AccountServiceService/AccountServicePort)"/&amp;gt;&lt;br /&gt;&amp;lt;/reference&amp;gt;&lt;br /&gt;&amp;lt;/component&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Mając tak stworzony plik konfiguracyjny, przetestujmy działanie kompozycji tworząc klasę startową LocalizedAccountInfoTest.java:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;package demo;&lt;br /&gt;&lt;br /&gt;import org.apache.tuscany.sca.host.embedded.SCADomain;&lt;br /&gt;&lt;br /&gt;public class LocalizedAccountInfoTest {&lt;br /&gt;&lt;br /&gt;public static void main(String[] args) {&lt;br /&gt; SCADomain domain = SCADomain.newInstance("AccountInfo.composite");&lt;br /&gt; LocalizedAccountInfo lai = domain.getService(LocalizedAccountInfo.class, "LocalizedAccountInfo");&lt;br /&gt; System.out.println(lai.getAccountInfo(100, "PLN"));&lt;br /&gt; System.out.println(lai.getAccountInfo(100, "EUR"));&lt;br /&gt; System.out.println(lai.getAccountInfo(100, "USD"));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Uruchomienie klasy startowej powinno nam dać rezultat:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:courier new;"&gt;100.0&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;33.333333333333336&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;50.0&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;5. Udostępnienie kompozytu poprzez usługę WebService.&lt;/span&gt;&lt;br /&gt;Aby udostępnić nasz komponent jako WebService zmodyfikujmy plik konfiguracyjny AccountInfo.composite dodając:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&amp;lt;service name="WSLocalizedAccountInfo" promote="LocalizedAccountInfo"&amp;gt;&lt;br /&gt;&amp;lt;interface.java interface="demo.LocalizedAccountInfo"/&amp;gt;&lt;br /&gt;&amp;lt;binding.ws uri="http://localhost:9000/LocalizedAccountInfo"/&amp;gt;&lt;br /&gt;&amp;lt;/service&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Finalnie plik konfiguracyjny AccountInfo.composite powinien zawierać:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&amp;lt;composite xmlns="http://www.osoa.org/xmlns/sca/1.0"&lt;br /&gt;xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.0"&lt;br /&gt;targetNamespace="http://sample"&lt;br /&gt;xmlns:sample="http://sample"&lt;br /&gt;name="Bank"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;component name="LocalizedAccountInfo"&amp;gt;&lt;br /&gt;&amp;lt;implementation.java class="demo.LocalizedAccountInfoImpl" /&amp;gt;&lt;br /&gt;&amp;lt;reference name="currencyConverter" target="CurrencyConverter"/&amp;gt;&lt;br /&gt;&amp;lt;reference name="accountInfo"&amp;gt;&lt;br /&gt; &amp;lt;binding.ws wsdlElement="http://demo/#wsdl.port(AccountServiceService/AccountServicePort)"/&amp;gt;&lt;br /&gt;&amp;lt;/reference&amp;gt;&lt;br /&gt;&amp;lt;/component&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;component name="CurrencyConverter"&amp;gt;&lt;br /&gt;&amp;lt;tuscany:implementation.script script="script/cconvert.js"/&amp;gt;&lt;br /&gt;&amp;lt;/component&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;service name="WSLocalizedAccountInfo" promote="LocalizedAccountInfo"&amp;gt;&lt;br /&gt;&amp;lt;interface.java interface="demo.LocalizedAccountInfo"/&amp;gt;&lt;br /&gt;&amp;lt;binding.ws uri="http://localhost:9000/LocalizedAccountInfo"/&amp;gt;&lt;br /&gt;&amp;lt;/service&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/composite&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Poprzez ten wpis zdefiniowaliśmy usługę WebService, bazującą na interfejsie java demo.LocalizedAccountInfo (mogliśmy równie dobrze podać interfejs WSDL), "wystawiającą" komponent LoclizedAccountInfo, wiążąc go z podanym URI. Po ponownym uruchomieniu klasy startowej środowisko Apache Tuscany uruchomi wbudowany kontener serwletów Jetty i udostępni WebService. Sprawdźmy to więc poprzez odwiedzenie adresu http://localhost:9000/LocalizedAccountInfo?wsdl.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;6. Deployment w kontenerze serwletów.&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Temat nie jest jeszcze rozpoznany.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7665691180445113014-863497793900781908?l=blog.foomatik.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.foomatik.com/feeds/863497793900781908/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7665691180445113014&amp;postID=863497793900781908' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/863497793900781908'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/863497793900781908'/><link rel='alternate' type='text/html' href='http://blog.foomatik.com/2008/04/wprowadzenie-do-service-component_2440.html' title='Wprowadzenie do Service Component Architecture cz. 3: Przykładowa aplikacja'/><author><name>Wojtek</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7665691180445113014.post-3877913619201584325</id><published>2008-04-20T15:54:00.017+02:00</published><updated>2008-07-10T23:40:23.189+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Apache Tuscany'/><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='SCA'/><title type='text'>Wprowadzenie do Service Component Architecture cz. 2: Apache Tuscany</title><content type='html'>&lt;a href="http://incubator.apache.org/tuscany/"&gt;Apache Tuscany&lt;/a&gt; został oparty na specyfikacjach zdefiowanych przez &lt;a href="http://www.oasis-opencsa.org/"&gt;Open CSA&lt;/a&gt;: &lt;ul&gt; &lt;li&gt; Service Component Architecture (SCA) &lt;/li&gt; &lt;li&gt; Service Data Object (SDO) &lt;/li&gt; &lt;li&gt; Data Access Service (DAS) &lt;/li&gt; &lt;/ul&gt; Wspomniane technologie są od siebie niezależne oraz dostarczają pełnej infrastruktury do budowy aplikacji opartych na SOA. W tym wpisie interesuje mnie tylko SCA, więc pozostałe (SDO i DAS) postaram się omijać.&lt;br /&gt;&lt;br /&gt;Aktualnie Apache Tuscany znajduje się w inkubatorze Apache Podprojekt SCA posiada &lt;b&gt;3 implementacje&lt;/b&gt;: &lt;ul&gt; &lt;li&gt; SCA Java, aktualnie wersja 1.1 &lt;/li&gt; &lt;li&gt; SCA Natvie, z implementacją w C++ &lt;/li&gt; &lt;li&gt; SCA PHP &lt;/li&gt; &lt;/ul&gt; &lt;b&gt;Podstawowe elementy:&lt;/b&gt; &lt;ul&gt; &lt;li&gt; Komponent (component) – udostępnia/konsumuje usługi &lt;/li&gt; &lt;li&gt; Usługa (service) - deklaracja usługi udostępnianej na zewnątrz &lt;/li&gt; &lt;li&gt; Referencja (reference) – deklaracja odniesienia do zewnętrznej usługi &lt;/li&gt; &lt;li&gt; Implementacja (implementation) – programowy komponent wykorzystywany w tworzeniu usługi &lt;/li&gt; &lt;li&gt; Interfejs – definicja operacji biznesowych udostępnianych przez usługę (Java, WSDL) &lt;/li&gt; &lt;li&gt; Kompozyt – zestaw komponentów, usług, referencji &lt;/li&gt; &lt;/ul&gt; &lt;b&gt;Środowiska uruchomieniowe:&lt;/b&gt; &lt;ul&gt; &lt;li&gt; aplikacja standalone &lt;/li&gt; &lt;li&gt; udostępnianie usług poprzez wbudowany kontener serwletów (Apache, Jetty) &lt;/li&gt; &lt;li&gt; w kontenerze serwletów &lt;/li&gt; &lt;li&gt; serwer aplikacji JEE &lt;/li&gt; &lt;li&gt; OSGi &lt;/li&gt; &lt;/ul&gt; &lt;b&gt;Rozszerzanie Apache Tuscany:&lt;/b&gt; Architektura Apache Tuscany pozwala na łatwe rozszerzanie silnika o nowe elementy, zwane "extension modules": &lt;ul&gt; &lt;li&gt; typy implementacji (implementation types) &lt;/li&gt; &lt;li&gt; typy wiązań (binding types) &lt;/li&gt; &lt;li&gt; typy wiązań danych (data binding types) &lt;/li&gt; &lt;li&gt; typy interfejsów (interface types) &lt;/li&gt; &lt;/ul&gt; Tuscany wprowadza pojęcie "extension point", czyli definicji miejsca w którym można dodać rozszerzenie. W celu pobrania większej ilości informacji polecam zapoznać się &lt;a href="http://incubator.apache.org/tuscany/sca-java-extension-development-guide.data/ExtendingTuscany-V01.pdf"&gt;dokumentem PDF&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7665691180445113014-3877913619201584325?l=blog.foomatik.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.foomatik.com/feeds/3877913619201584325/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7665691180445113014&amp;postID=3877913619201584325' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/3877913619201584325'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/3877913619201584325'/><link rel='alternate' type='text/html' href='http://blog.foomatik.com/2008/04/wprowadzenie-do-service-component_20.html' title='Wprowadzenie do Service Component Architecture cz. 2: Apache Tuscany'/><author><name>Wojtek</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7665691180445113014.post-1532346600558066067</id><published>2008-04-20T14:02:00.022+02:00</published><updated>2008-05-07T10:58:23.119+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='SCA'/><title type='text'>Wprowadzenie do Service Component Architecture cz. 1: SCA</title><content type='html'>&lt;style&gt;  &lt;!--   @page { size: 21cm 29.7cm; margin: 2cm }   P { margin-bottom: 0.21cm }   A:link { color: #000080; text-decoration: underline }  --&gt;  &lt;/style&gt;  &lt;p style="margin-bottom: 0.5cm;"&gt;Wpis jest silnie inspirowany dokumentem "&lt;a href="http://www.osoa.org/pages/viewpage.action?pageId=46"&gt;What is SCA?&lt;/a&gt;" ze stron OSOA.&lt;/p&gt;&lt;p style="margin-bottom: 0.5cm;"&gt;SCA to zbiór specyfikacji opisujących model budowania aplikacji z wykorzystaniem Service-Oriented Architecture. Pierwsza wersja standardu została opublikowana 21. marca 2007.&lt;br /&gt;&lt;br /&gt;SCA narzuca organizację aplikacji biznesowej w stylu SOA, z wydzielonymi komponentami implementującymi logikę biznesową, których operacje udostępniane są poprzez usługi, a które mogą korzystać z innych usług poprzez tzw. &lt;b&gt;referencje&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;SCA dzieli kroki tworzenia aplikacji SOA na dwie główne części:&lt;/p&gt; &lt;ul&gt;&lt;li&gt;&lt;p style="margin-bottom: 0cm;"&gt;&lt;b&gt;implementacja&lt;/b&gt; komponentów  konsumujących/udostępniających usługi   &lt;/p&gt;  &lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;b&gt;łączenie&lt;/b&gt; zbiorów komponentów celem  zbudowania aplikacji biznesowej&lt;/p&gt; &lt;/li&gt;&lt;/ul&gt;    &lt;p&gt;SCA kładzie nacisk na odseparowanie implementacji od szczegółów technicznych wykorzystywanych technologii (infrastruktura, metody dostępu do usług) - komponenty SCA operują na poziomie biznesowym.&lt;/p&gt;&lt;p&gt;SCA wspiera implementacje usług stworzonych z pomocą wielu języków programowania (obiektowych, proceduralnych) jak Java, PHP, C++, Cobol, jak i języków XML-centrycznych  (?) jak BPEL, XSLT oraz języków deklaratywnych: SQL, XQuery.&lt;/p&gt;&lt;p&gt;SCA wspiera wiązania (&lt;span style="font-style: italic;"&gt;bindings&lt;/span&gt;) z szerokim zakresem mechanizmów dostępowych do usług (np. Web services, Messaging systems, CORBA). Wiązania tworzone są deklaratywnie, podobnie w deklaratywny sposób wykorzystywane są właściwości infrastruktury (np. bezpieczeństwo, transakcje). SCA definiuje użycie infrastruktury poprzez polityki (&lt;i&gt;Policies&lt;/i&gt;) i profile (&lt;i&gt;Profiles&lt;/i&gt;).&lt;/p&gt;&lt;p&gt;Poniżej spojrzenie na architekturę przykładowego systemu z poziomu abstrakcji SCA. &lt;/p&gt; &lt;p style="text-align: center;"&gt;&lt;a href="http://www.osoa.org/download/attachments/46/What_is_SCA_Image1.gif"&gt;&lt;img style="width: 697px; height: 334px;" src="http://www.osoa.org/download/attachments/46/What_is_SCA_Image1.gif" name="grafika1" align="bottom" border="0" vspace="5" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Specyfikację SCA można znaleźć &lt;a href="http://www.osoa.org/display/Main/Service+Component+Architecture+Specifications"&gt;tutaj&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7665691180445113014-1532346600558066067?l=blog.foomatik.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.foomatik.com/feeds/1532346600558066067/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7665691180445113014&amp;postID=1532346600558066067' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/1532346600558066067'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/1532346600558066067'/><link rel='alternate' type='text/html' href='http://blog.foomatik.com/2008/04/wprowadzenie-do-service-component.html' title='Wprowadzenie do Service Component Architecture cz. 1: SCA'/><author><name>Wojtek</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7665691180445113014.post-2680803896521549569</id><published>2008-04-19T22:07:00.000+02:00</published><updated>2008-04-19T22:08:12.033+02:00</updated><title type='text'>Hello World!</title><content type='html'>Cóż za typowy początek!&lt;br /&gt;;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7665691180445113014-2680803896521549569?l=blog.foomatik.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.foomatik.com/feeds/2680803896521549569/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7665691180445113014&amp;postID=2680803896521549569' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/2680803896521549569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7665691180445113014/posts/default/2680803896521549569'/><link rel='alternate' type='text/html' href='http://blog.foomatik.com/2008/04/hello-world.html' title='Hello World!'/><author><name>Wojtek</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
