<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;A0AER3Y7eSp7ImA9WhZQFE4.&quot;"><id>tag:blogger.com,1999:blog-6814609191464852424</id><updated>2011-04-22T04:35:06.801+02:00</updated><category term="Shoes" /><category term="qtruby" /><category term="Ninja" /><category term="new blog" /><category term="Button" /><category term="books" /><category term="Metasploit" /><category term="Ubuntu EEE" /><category term="monkeybars" /><category term="FXRuby" /><category term="wxruby" /><category term="GNOME" /><category term="GUI" /><category term="GTK" /><category term="ASUS EEE" /><category term="G1" /><category term="Ruby" /><category term="25C3" /><category term="course" /><category term="Ruby-GNOME2" /><category term="Gem" /><category term="Rubylearning" /><category term="Ubuntu" /><category term="review" /><category term="Android" /><category term="Preview" /><category term="learning" /><title>waves, code and ninja's</title><subtitle type="html" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://waveninja.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://waveninja.blogspot.com/" /><author><name>WaveNinja</name><uri>http://www.blogger.com/profile/09435808347083450332</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://3.bp.blogspot.com/_hEZGcNJ4hL4/Sfrw5MnKW-I/AAAAAAAAAG4/vbqM92a82UU/S220/Red+Tide.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>19</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/waveninja" /><feedburner:info uri="waveninja" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;C08CQHw-eCp7ImA9WxJSEUU.&quot;"><id>tag:blogger.com,1999:blog-6814609191464852424.post-4272745717836657740</id><published>2009-05-01T14:42:00.001+02:00</published><updated>2009-05-01T14:44:21.250+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-01T14:44:21.250+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="new blog" /><title>new blog</title><content type="html">I have started a new blog and will merge this one with the new one. No further blogposts will be made here.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://geekatlarge.blogspot.com"&gt;Checkout my new blog!&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6814609191464852424-4272745717836657740?l=waveninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://waveninja.blogspot.com/feeds/4272745717836657740/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6814609191464852424&amp;postID=4272745717836657740" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6814609191464852424/posts/default/4272745717836657740?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6814609191464852424/posts/default/4272745717836657740?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/waveninja/~3/y2cjfFNcLK8/new-blog.html" title="new blog" /><author><name>WaveNinja</name><uri>http://www.blogger.com/profile/09435808347083450332</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://3.bp.blogspot.com/_hEZGcNJ4hL4/Sfrw5MnKW-I/AAAAAAAAAG4/vbqM92a82UU/S220/Red+Tide.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://waveninja.blogspot.com/2009/05/new-blog.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0MFQH06eyp7ImA9WxVUEkg.&quot;"><id>tag:blogger.com,1999:blog-6814609191464852424.post-5678833274599839128</id><published>2009-03-08T22:21:00.008+01:00</published><updated>2009-03-17T04:10:11.313+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-17T04:10:11.313+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Button" /><category scheme="http://www.blogger.com/atom/ns#" term="Shoes" /><title>Ten Steps in Shoes: step 3, Buttons</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_hEZGcNJ4hL4/SbQuTcOIQ4I/AAAAAAAAAFg/fyQZnQZjeF0/s1600-h/feet_on_walk_icon.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 200px; height: 147px;" src="http://4.bp.blogspot.com/_hEZGcNJ4hL4/SbQuTcOIQ4I/AAAAAAAAAFg/fyQZnQZjeF0/s200/feet_on_walk_icon.jpg" alt="" id="BLOGGER_PHOTO_ID_5310920772104504194" border="0" /&gt;&lt;/a&gt;An image says more than a thousand words. Trying trying to find the right image to convey the words takes a thousand clicks. While Google takes the lead in many different technologies nowadays, they have not yet found a smart way to index pictures. Usually, finding the right picture for a new blogpost takes ages.&lt;br /&gt;&lt;br /&gt;Good news though, a while back I bought my first DSRL camera and am fully experimenting with it at the moment. So, in the future I can just make my pics in stead of searching the internets.&lt;br /&gt;&lt;br /&gt;But, while an image can say more than a thousand words, does it speak the same language as the observer? Well, like many things it's all a matter of perspective.&lt;br /&gt;The above image can be viewed from a few perspectives providing an impression of the situation of my blog. One one hand we see Shoes taking steps. Like the series I was supposed to blog. On the other hand we see a person standing still. That's me standing  still, being preoccupied with stuff, not blogging or doing much else. He's stepped upon by a giant. That giant might well represent Google crushing me with too much information in one step, deleting my&lt;br /&gt;draft-blogposts with the other. Taking another point of view it could be me taking steps again. Maybe it was me taking steps on myself...&lt;br /&gt;&lt;br /&gt;...right, anyway, it's time to check out the Shoes button!&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_hEZGcNJ4hL4/SbQ3zQiLSWI/AAAAAAAAAFo/I6V4ezQ44LQ/s1600-h/buttons.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 196px; height: 200px;" src="http://3.bp.blogspot.com/_hEZGcNJ4hL4/SbQ3zQiLSWI/AAAAAAAAAFo/I6V4ezQ44LQ/s200/buttons.jpg" alt="" id="BLOGGER_PHOTO_ID_5310931214327826786" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Here's how you add a button to a Shoes app:&lt;br /&gt;&lt;br /&gt;Shoes.app do&lt;br /&gt; b =  button("button")&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;Now we want the button to do something. You can pass a block to a button like so:&lt;br /&gt;Shoes.app do&lt;br /&gt; b =  button("button"){ alert "you pushed the button" }&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;A block is code between { and }, it can be another method, or multiple lines of code, whatever you want. You can read more about blogs at the blogpost on &lt;a href="http://strugglingwithruby.blogspot.com/2009/03/ruby-blocks.html"&gt;struggling with ruby&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;In our block we used an alert, a type of control. Don't worry about those, we will talk more about those in the next step.&lt;br /&gt;&lt;br /&gt;So that's it, yeah!&lt;br /&gt;&lt;br /&gt;p.s. announcing to do series of blogposts is a really bad idea. Either deal with stuff in one post or don't blog about it. Hard lessons of the blogosphere are learned the hard way!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6814609191464852424-5678833274599839128?l=waveninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://waveninja.blogspot.com/feeds/5678833274599839128/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6814609191464852424&amp;postID=5678833274599839128" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6814609191464852424/posts/default/5678833274599839128?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6814609191464852424/posts/default/5678833274599839128?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/waveninja/~3/7gN5zr693F4/ten-steps-in-shoes-step-3-buttons.html" title="Ten Steps in Shoes: step 3, Buttons" /><author><name>WaveNinja</name><uri>http://www.blogger.com/profile/09435808347083450332</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://3.bp.blogspot.com/_hEZGcNJ4hL4/Sfrw5MnKW-I/AAAAAAAAAG4/vbqM92a82UU/S220/Red+Tide.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_hEZGcNJ4hL4/SbQuTcOIQ4I/AAAAAAAAAFg/fyQZnQZjeF0/s72-c/feet_on_walk_icon.jpg" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://waveninja.blogspot.com/2009/03/ten-steps-in-shoes-step-3-buttons.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkMEQXg4eCp7ImA9WxVQFk0.&quot;"><id>tag:blogger.com,1999:blog-6814609191464852424.post-7936635219020286041</id><published>2009-02-02T20:42:00.002+01:00</published><updated>2009-02-02T20:53:20.630+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-02T20:53:20.630+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Android" /><category scheme="http://www.blogger.com/atom/ns#" term="G1" /><title>Human 2.0 or Paranoid Android?</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_hEZGcNJ4hL4/SYdFdy1kasI/AAAAAAAAAFA/_ek6BDOfTcs/s1600-h/autobot.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 200px; height: 200px;" src="http://1.bp.blogspot.com/_hEZGcNJ4hL4/SYdFdy1kasI/AAAAAAAAAFA/_ek6BDOfTcs/s200/autobot.jpg" alt="" id="BLOGGER_PHOTO_ID_5298279864789658306" border="0" /&gt;&lt;/a&gt;Since my childhood I have been warned about them. Someday will come when they will realize their superiority over us simple humans, take over the world and take their place as technological overlords.&lt;br /&gt;&lt;br /&gt;You know what I'm talking about: terminators, genius evil androids, transformers, technically enhanced humans, depressed androids and robots with identity issues. All superior due to their technical prowess.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Indeed, technology is a very powerful and yes, entertaining thing. Some people don't want anything to do with it. Technology is too energy consuming, to complex, missing of any emotion or warmth. Few others warn of security and privacy implications.&lt;br /&gt;&lt;br /&gt;Most of them think in terms of that which exists, that which has always been. A fixed reference to our roots, the physical world and old civilizations.&lt;br /&gt;&lt;br /&gt;However, all those people forget to take into account some other basic and primitive elements in humanity. The hunt for new riches, the thirst for information and most of all the need to evolve. Some people still question evolution, others think we evolved from primates and that was it. However, for millenia, our environment has challenged us to adapt and we did so using technology.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_hEZGcNJ4hL4/SYdGpJQAzwI/AAAAAAAAAFY/SrWqWHQFlHU/s1600-h/LocutusOfBorg.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 200px; height: 155px;" src="http://2.bp.blogspot.com/_hEZGcNJ4hL4/SYdGpJQAzwI/AAAAAAAAAFY/SrWqWHQFlHU/s200/LocutusOfBorg.jpg" alt="" id="BLOGGER_PHOTO_ID_5298281159296339714" border="0" /&gt;&lt;/a&gt;We have evolved by making and using new tools to manipulate our environment. We have come at a point in time where we don't need to evolve to survive in our environment. Instead we ourselves have become the masters of our environment.&lt;br /&gt;&lt;br /&gt;In all those years evolving, we have really not evolved ourselves. Look at how we treat the environment we have mastered and how we treat each other. It seems, humanity has still a long way to go, but who do we need to conquer?&lt;br /&gt;&lt;br /&gt;Today, judgment day has arrived. In an effort to compensate for the imperfect, that is us human beings, a leap has been made. A leap into an uncertain future, to transform, to adapt or to succumb. In no other time in human history has technology progressed to such levels as now. It's all around us and there is no escape.&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_hEZGcNJ4hL4/SYdGWkgOH-I/AAAAAAAAAFQ/ELE_UXzeLGk/s1600-h/skynet-terminator.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 200px; height: 113px;" src="http://2.bp.blogspot.com/_hEZGcNJ4hL4/SYdGWkgOH-I/AAAAAAAAAFQ/ELE_UXzeLGk/s200/skynet-terminator.jpg" alt="" id="BLOGGER_PHOTO_ID_5298280840194564066" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;We can make a simple choice: evolve into human 2.0 or become the Paranoid Android. The future does not seem to hold any other alternative.&lt;br /&gt;&lt;br /&gt;Being quite on the paranoid side myself I was not enjoying this prospect. The big corporations would rule us all. All aspects of my life would be monitored by some overlord with a big mustache, or beard for that matter. However, some while ago an interesting thought occurred to me when reading the daily early morning data-breach news headers. Security, privacy, image and revenue are the pillars of technology. Take one and the technology will ultimately fall.&lt;br /&gt;&lt;br /&gt;With these thoughts in my mind I reasoned or adapted my worries away as I purchased the &lt;a href="http://www.t-mobileg1.com/"&gt;T-mobile G1&lt;/a&gt;, the Google phone with &lt;a href="http://code.google.com/android/"&gt;Android&lt;/a&gt;. And what about the &lt;a href="http://www.apple.com/trailers/wb/terminatorsalvation/"&gt;terminators&lt;/a&gt; and &lt;a href="http://www.apple.com/trailers/paramount/transformersrevengeofthefallen/"&gt;transformers&lt;/a&gt;? Well, time will tell but the &lt;a href="http://www.apple.com/trailers/paramount/startrek/"&gt;future&lt;/a&gt; looks bright!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6814609191464852424-7936635219020286041?l=waveninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://waveninja.blogspot.com/feeds/7936635219020286041/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6814609191464852424&amp;postID=7936635219020286041" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6814609191464852424/posts/default/7936635219020286041?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6814609191464852424/posts/default/7936635219020286041?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/waveninja/~3/WBkQkfwHtGU/human-20-or-paranoid-android.html" title="Human 2.0 or Paranoid Android?" /><author><name>WaveNinja</name><uri>http://www.blogger.com/profile/09435808347083450332</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://3.bp.blogspot.com/_hEZGcNJ4hL4/Sfrw5MnKW-I/AAAAAAAAAG4/vbqM92a82UU/S220/Red+Tide.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_hEZGcNJ4hL4/SYdFdy1kasI/AAAAAAAAAFA/_ek6BDOfTcs/s72-c/autobot.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://waveninja.blogspot.com/2009/02/human-20-or-paranoid-android.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkMARn4-fCp7ImA9WxVQFEU.&quot;"><id>tag:blogger.com,1999:blog-6814609191464852424.post-4264797651027392885</id><published>2009-01-31T22:53:00.012+01:00</published><updated>2009-02-01T12:40:47.054+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-01T12:40:47.054+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Shoes" /><title>Ten Steps in Shoes: step 2, Stack &amp; Flow</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_hEZGcNJ4hL4/SYTXtzLf0aI/AAAAAAAAAEw/Th9dh0lfFbw/s1600-h/sneakerstack-comic.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 200px; height: 155px;" src="http://1.bp.blogspot.com/_hEZGcNJ4hL4/SYTXtzLf0aI/AAAAAAAAAEw/Th9dh0lfFbw/s200/sneakerstack-comic.jpg" alt="" id="BLOGGER_PHOTO_ID_5297596243527061922" border="0" /&gt;&lt;/a&gt;Woow, I've been getting quite a lot of feedback on my last post. Thanks for the messages, I really appreciate it! It gets me even more enthusiastic about blogging and Shoes, I hope in my turn I get some other people to be Shoes enthusiasts. If I do, or you are already, consider blogging about it. For me it helps a lot in keeping focussed and to explore a bit further. I always love to read small articles and blogs on Ruby and Shoes, so if you happen to have one let me know!&lt;br /&gt;&lt;br /&gt;If you read my previous post, you might have noticed a lack of layout structure in one of the examples. Some of the text was right behind the other, or even overlapped, and it all just looked like a big unsorted pile. This might be fine for dirty clothes or dishes, but our app aint dirty! But no worries, you can create order in this chaos by making neat columns and rows, by using stacks and flows!&lt;br /&gt;&lt;br /&gt;To help a bit in explaining, I'll introduce you to something else first. Meet background, background is quite a cool, colourful fellow. You can use background within stacks and flows. One famous flow is the Shoesapp itself. So try this:&lt;br /&gt;&lt;pre name="code" class="rb"&gt;&lt;br /&gt;Shoes.app do&lt;br /&gt;  background black&lt;br /&gt;  para "Look ma, a black background!", :size =&gt; 30, :align =&gt; "center", :stroke =&gt; crimson&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Let's drift a bit farther from our main objective and try a gradient with an angle:&lt;br /&gt;&lt;pre name="code" class="rb"&gt;&lt;br /&gt;  background "#FF0".."#0FF", :angle =&gt; 60&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Or an image!&lt;br /&gt;&lt;pre name="code" class="rb"&gt;&lt;br /&gt;  background "justsomelocal.jpg", :border =&gt; "FF0".."0FF", :strokewidth =&gt; 10&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;You can even use an online picture and a border like so&lt;br /&gt;&lt;pre name="code" class="rb"&gt;&lt;br /&gt;  background "http://poignantguide.net/ruby/i/the.foxes-4c.png"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Sometimes, using online images seem to cause some problems. Don't know why exactly, let's move on for now.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Stack&lt;/span&gt;&lt;br /&gt;A stack is something that allows you to put one thing above the other, simple as that. Stacks can make your shoes look sexy! &lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_hEZGcNJ4hL4/SYTxlxJ_n7I/AAAAAAAAAE4/oLFAQ3tYPOY/s1600-h/sexyshoesstack.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; cursor: pointer; width: 200px; height: 139px;" src="http://1.bp.blogspot.com/_hEZGcNJ4hL4/SYTxlxJ_n7I/AAAAAAAAAE4/oLFAQ3tYPOY/s200/sexyshoesstack.jpg" alt="" id="BLOGGER_PHOTO_ID_5297624692847255474" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Let's create a stack containing four para's:&lt;br /&gt;&lt;pre name="code" class="rb"&gt;&lt;br /&gt;Shoes.app do&lt;br /&gt;  stack do&lt;br /&gt;    para "heya"&lt;br /&gt;    para "we are stacked"&lt;br /&gt;    para "stacked you see?"&lt;br /&gt;    para "different lines"&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Let's create put all the para's in their own stacks. One is blue, so he needs a friend:&lt;br /&gt;&lt;pre name="code" class="rb"&gt;&lt;br /&gt;Shoes.app do&lt;br /&gt;  stack do&lt;br /&gt;    background fuchsia&lt;br /&gt;    para "hi again"&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  stack do&lt;br /&gt;    background cornflowerblue&lt;br /&gt;    para "we are in stacks"&lt;br /&gt;    para "we are blue together"&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  stack do&lt;br /&gt;    background peru&lt;br /&gt;    para "each our own"&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  stack do&lt;br /&gt;    background gold&lt;br /&gt;    para "with our colours"&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Remember some of the style options in the previous post? Well, you can use many of them exactly in the same way.&lt;br /&gt;&lt;pre name="code" class="rb"&gt;&lt;br /&gt;Shoes.app do&lt;br /&gt;  background black&lt;br /&gt;  stack :width =&gt; 100  do&lt;br /&gt;    background fuchsia&lt;br /&gt;    para "we are not wide"&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;  stack :width =&gt; 200, :height =&gt; 150, :scroll =&gt; true  do&lt;br /&gt;    background cornflowerblue&lt;br /&gt;    para "we are in stacks"&lt;br /&gt;    para "the stack is high"&lt;br /&gt;    para "content exeeds height"&lt;br /&gt;    para "bla"&lt;br /&gt;    para "blabla"&lt;br /&gt;    para "but we have a scrollbar"&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  stack :top =&gt; 250, :left =&gt; 150 do&lt;br /&gt;    background gold&lt;br /&gt;    para "some margin for errors"&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Flow&lt;/span&gt;&lt;br /&gt;A flow is like a stack, but horizontal. But, unlike a stack, a flow has a limit. Why? Because there are no horizontal scrollbars, those suck anyway! So try to imagine your flow like a typewriter, going back and down when you have reached the end.&lt;br /&gt;&lt;br /&gt;Now wait a minute, just think about it. Remember those para's from step 1? Remember how the para text was placed behind the others until it wrapped around? It's a flow! The shoes.app is a flow! So you already know the basic flow behaviour a bit. So lets just skip the talk and try a combination of stack and flow!&lt;br /&gt;&lt;pre name="code" class="rb"&gt;&lt;br /&gt;Shoes.app :width =&gt; 400, :height =&gt; 140 do&lt;br /&gt;  flow do&lt;br /&gt;    stack :width =&gt; '50%' do&lt;br /&gt;      background khaki&lt;br /&gt;      para "first stack"&lt;br /&gt;      para "stacks rock"&lt;br /&gt;      para "khakis are only cool in shoes"&lt;br /&gt;    end&lt;br /&gt;  &lt;br /&gt;    stack :width =&gt; '40%' do&lt;br /&gt;      background peru&lt;br /&gt;      para "second stack"&lt;br /&gt;    end&lt;br /&gt;    &lt;br /&gt;    para "i'm no stack but just in a flow, but did not fit", :stroke =&gt; blue&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;See, Shoes.app is a flow, so we can use the same style options for it, like setting the height! This example should demonstrate how stacks and flows differ from each other, but can work together. If only the people of the world were like stacks and flows!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6814609191464852424-4264797651027392885?l=waveninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://waveninja.blogspot.com/feeds/4264797651027392885/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6814609191464852424&amp;postID=4264797651027392885" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6814609191464852424/posts/default/4264797651027392885?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6814609191464852424/posts/default/4264797651027392885?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/waveninja/~3/swlDc1MmH9Q/ten-steps-in-shoes-step-2-stack-flow.html" title="Ten Steps in Shoes: step 2, Stack &amp; Flow" /><author><name>WaveNinja</name><uri>http://www.blogger.com/profile/09435808347083450332</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://3.bp.blogspot.com/_hEZGcNJ4hL4/Sfrw5MnKW-I/AAAAAAAAAG4/vbqM92a82UU/S220/Red+Tide.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_hEZGcNJ4hL4/SYTXtzLf0aI/AAAAAAAAAEw/Th9dh0lfFbw/s72-c/sneakerstack-comic.jpg" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://waveninja.blogspot.com/2009/01/ten-steps-in-shoes-step-2-stack-flow.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0EHRX44fyp7ImA9WxVQE0w.&quot;"><id>tag:blogger.com,1999:blog-6814609191464852424.post-3725870626968768057</id><published>2009-01-27T20:57:00.018+01:00</published><updated>2009-01-30T12:40:34.037+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-30T12:40:34.037+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Shoes" /><title>10 Steps in Shoes, step 1: Para's</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_hEZGcNJ4hL4/SYHHaoU5P6I/AAAAAAAAAEo/Eu3uGgjR7G0/s1600-h/Legs-Photo.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 200px; height: 133px;" src="http://3.bp.blogspot.com/_hEZGcNJ4hL4/SYHHaoU5P6I/AAAAAAAAAEo/Eu3uGgjR7G0/s200/Legs-Photo.jpg" alt="" id="BLOGGER_PHOTO_ID_5296733897079996322" border="0" /&gt;&lt;/a&gt;Phew, this has been one of those weeks in which you need to put everyone and everything on hold.  But now is not a time to stand still, instead we are going to start the Shoes travel by taking the first step in Shoes. It's going to be a short walk though, just 10 steps to be exact. There are 10 basic concepts in Shoes and we will take a look at the basic possibilities of each one as we talk the talk and learn to walk the walk. We will keep it short, so you have no excuses not to walk with us, let's go!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Wear your Shoes&lt;/span&gt;&lt;br /&gt;To start taking steps, you first need to have Shoes.  So make sure you have &lt;a href="http://www.ruby-lang.org/en/downloads/"&gt;Ruby&lt;/a&gt; and &lt;a href="http://shoooes.net/downloads/"&gt;Shoes&lt;/a&gt; installed.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Tie your Shoes&lt;br /&gt;&lt;/span&gt;Before we can start using anything in Shoes, we need to create a Shoes app.&lt;br /&gt;Open a file in your favorite editor, mine being vi and call it step1.rb. Notice the .rb extension, that's for Ruby, not Shoes. But how does Ruby know we want to run a Shoes app? Well just write "Shoes.app do" in the first line of your Shoes code. See, Shoes is easy! How to end a Shoes app? Any guesses? Yes you are right, write "end"!&lt;br /&gt;&lt;br /&gt;Here's what your Shoes app looks like:&lt;br /&gt;&lt;blockquote&gt;         Shoes.app do&lt;shoes&gt;&lt;your&gt;&lt;br /&gt;&lt;your&gt;&lt;br /&gt;end&lt;/your&gt;&lt;/your&gt;&lt;/shoes&gt;&lt;/blockquote&gt;&lt;span style="font-weight: bold;"&gt;Para's&lt;br /&gt;&lt;/span&gt;Now that you know how to start coding a Shoes app, let's take the first step in Shoes! Any programming starts with a first program to salute the world, so you need to know how to write some text, or a paragraph if you have much to say. Lets write a short paragraph, in fact lets not say paragraph but say para instead.&lt;br /&gt;&lt;blockquote&gt;         Shoes.app do&lt;br /&gt;        para "Hello World!"&lt;br /&gt;end&lt;/blockquote&gt;Save your file and open it with Shoes by running "shoes step1.rb" or just opening an app from the Shoes GUI. You will get something like this:&lt;br /&gt;&lt;br /&gt;Your shoes application screen just gets filled with the characters you provided to para. Para works quite like writing on a piece of paper, you can write in diferent sizes, in different styles, on different locations and in different colors and when you have reached the end, you start again at the following line. Let's try it. Reopen your file in your editor and add the following line:&lt;br /&gt;&lt;blockquote&gt;           para "Hello World, are you there?", :size =&gt; 48&lt;br /&gt;&lt;/blockquote&gt;Save, run and take a look.&lt;br /&gt;What we did here is use the size style option. Note the comma and the semicolon. Style options are key-value pairs of a hash, hence we use =&gt; to say that key size has value 48. This is just like the way we use hashes in Ruby. First I thought the biggest size of text in shoes is 48 and it could not grow beyond 48. This is not true however. You can have really huge letter sizes, I'm not sure if there is a maximum. There is some weird behaviour if you use really, really large values though.&lt;br /&gt;&lt;br /&gt;Instead of using a para with a certain size value, you can use any of the following:&lt;br /&gt;&lt;br /&gt;title (same as para with size of 34)&lt;br /&gt;subtitle (same as para with size of 26)&lt;br /&gt;tagline (same as para with size of 18)&lt;br /&gt;caption (same as para with size of 14)&lt;br /&gt;para (default size is 12)&lt;br /&gt;inscription (same as para with size of 10)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Colour your shoes!&lt;/span&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 200px; height: 150px;" src="http://4.bp.blogspot.com/_hEZGcNJ4hL4/SYHGHJ8AucI/AAAAAAAAAEg/RDZ7PfGDoJc/s200/kicks.jpg" alt="" id="BLOGGER_PHOTO_ID_5296732462993422786" border="0" /&gt;&lt;br /&gt;Even though the eighties have long gone and nobody knows what happend to &lt;a href="http://www.youtube.com/watch?v=J1B8q3gdDig"&gt;King&lt;/a&gt;, we still want to colour our shoes! Don't click that link if you keep some youth sentiment about that moment you saw your first ever music clip on tv, you have been warned! Better humn that song and use the Shoes equivalent to spraycans to be cool like so:&lt;br /&gt;&lt;blockquote&gt;Shoes.app do&lt;br /&gt;para "Hello World!", :size =&gt; 48, :stroke =&gt; dodgerblue&lt;br /&gt;subtitle "Why are you not answering?", :stroke =&gt; red&lt;br /&gt;tagline "Hmm wait, what to say in case it does answer?", :fill =&gt; "#FF0000"&lt;br /&gt;inscription "...yes quite some responsibility to be the one who talks to the world", :fill =&gt; darkkhaki&lt;br /&gt;end&lt;/blockquote&gt;What do you think this app will look like? Save and run it! As you might have noticed you can use style options for colors too. Colors can be specified by their name or their hexadecimal Red-Green-Blue value. Here's a &lt;a href="http://help.shoooes.net/Colors.html"&gt;list&lt;/a&gt; for color names and values. We also used some alternatives to para's.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The Fonts is cool&lt;/span&gt;&lt;br /&gt;Heeeyy, use cool Fonts and the girls will be kissing with a snap of the fingers! But that was in a time of innocence and the coolest technology around was a motorcycle. For people who have grown up and want more then just kissing, there is Shoes.  The happy days are over, but Shoes has many Fonts.&lt;br /&gt;&lt;br /&gt;  Shoes.app do&lt;br /&gt;    para &lt;span class="string"&gt;"heeeeyyyy":font =&gt; "Helvetica, Arial"&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;These Shoes are made for walking&lt;/span&gt;&lt;br /&gt;I guess you get it by now. There is much more you can do with para and it's siblings. Almost everything is related to style.&lt;br /&gt;You should be able to work it out for yourself, just look at the &lt;a href="http://help.shoooes.net/Styles.html"&gt;shoes help on styles&lt;/a&gt;. Not all styles work for everything, so note what it says after "For".&lt;br /&gt;Here's a small example of various possibilities.&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Shoes.app do&lt;br /&gt;para "Centered text!", :size =&gt; 14, :align =&gt; "center", :stroke =&gt; firebrick&lt;br /&gt;subtitle "justify", :justify =&gt; true, :stroke =&gt; hotpink, :fill =&gt; black&lt;br /&gt;para "top and left", :top =&gt; 150, :left =&gt; 222, :stroke =&gt; mediumspringgreen&lt;br /&gt;tagline "oblique", :emphasis =&gt; "oblique", :stroke =&gt; peru&lt;br /&gt;inscription "displace", :displace_left =&gt; 20, :top =&gt; 180&lt;br /&gt;para "more left less top", :top =&gt; 250, :left =&gt; 280, :stroke =&gt; olive&lt;br /&gt;title "strikethrough and strikecolor", :strikethrough =&gt; "single", :strikecolor =&gt; crimson&lt;br /&gt;caption "leading", :leading =&gt; 10&lt;br /&gt;para "undercolor", :underline =&gt; "single", :undercolor =&gt; darkorchid, :top =&gt; 210&lt;br /&gt;tagline "Variant Weight", :variant =&gt; "smallcaps", :weight =&gt; "heavy", :stroke =&gt; gold&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;A few last tips: use alt + ? for help and alt + . to reload your Shoes app in the Shoes GUI. Use alt + / for the Shoes console to see debug messages. Use alt + p to package your app.&lt;br /&gt;I suggest you play with the various options for a bit, and get ready for Step 2!&lt;br /&gt;&lt;/span&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6814609191464852424-3725870626968768057?l=waveninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://waveninja.blogspot.com/feeds/3725870626968768057/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6814609191464852424&amp;postID=3725870626968768057" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6814609191464852424/posts/default/3725870626968768057?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6814609191464852424/posts/default/3725870626968768057?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/waveninja/~3/sSZ98HCzMVU/10-steps-in-shoes-step-1-paras.html" title="10 Steps in Shoes, step 1: Para's" /><author><name>WaveNinja</name><uri>http://www.blogger.com/profile/09435808347083450332</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://3.bp.blogspot.com/_hEZGcNJ4hL4/Sfrw5MnKW-I/AAAAAAAAAG4/vbqM92a82UU/S220/Red+Tide.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_hEZGcNJ4hL4/SYHHaoU5P6I/AAAAAAAAAEo/Eu3uGgjR7G0/s72-c/Legs-Photo.jpg" height="72" width="72" /><thr:total>3</thr:total><feedburner:origLink>http://waveninja.blogspot.com/2009/01/10-steps-in-shoes-step-1-paras.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUANQX46eip7ImA9WxVREkU.&quot;"><id>tag:blogger.com,1999:blog-6814609191464852424.post-1741677252813845028</id><published>2009-01-18T13:19:00.010+01:00</published><updated>2009-01-18T15:09:50.012+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-18T15:09:50.012+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="wxruby" /><category scheme="http://www.blogger.com/atom/ns#" term="monkeybars" /><category scheme="http://www.blogger.com/atom/ns#" term="Ruby-GNOME2" /><category scheme="http://www.blogger.com/atom/ns#" term="FXRuby" /><category scheme="http://www.blogger.com/atom/ns#" term="Ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="GUI" /><category scheme="http://www.blogger.com/atom/ns#" term="Shoes" /><category scheme="http://www.blogger.com/atom/ns#" term="qtruby" /><title>GUI toolkit extravaganza wrap-up</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://tbn2.google.com/images?q=tbn:8_1aNl_OQwG0FM:http://farm4.static.flickr.com/3296/2682586941_31c482f9d3.jpg%3Fv%3D0"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 130px; height: 130px;" src="http://tbn2.google.com/images?q=tbn:8_1aNl_OQwG0FM:http://farm4.static.flickr.com/3296/2682586941_31c482f9d3.jpg%3Fv%3D0" alt="" border="0" /&gt;&lt;/a&gt;Folks, I have decided to conclude the &lt;a href="http://waveninja.blogspot.com/2008/11/gui-toolkit-extravaganza.html"&gt;GUI toolkit extravaganza&lt;/a&gt;. There were two more toolkits to follow, monkeybars and qtruby. But alas, I am not going to check those out any time soon. I just don't feel very curious about these toolkits anymore and want to do some more exploring of Shoes. But I'll take those two toolkits along in the following overview.&lt;br /&gt;&lt;br /&gt;The big question is off course, which one is the best? It all depends on what you need and what effort you are willing to invest (ooh how cliché!). When it comes to GUI toolkits for Ruby, there are three basic categories: system-dependant, system-independent and the category for those that won't fit elsewhere. Let's take a brief look at each category:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;System-dependant: &lt;a href="http://waveninja.blogspot.com/2008/11/gui-toolkit-extravaganza-part-i-ruby.html"&gt;ruby-gnome2&lt;/a&gt; and qtruby&lt;/span&gt;&lt;br /&gt;These are toolkits specifically written to support a certain system, a specific window manager for example. These toolkits offer a big load of functions, sometimes not even restricted to graphics. For example, ruby-gnome2 has some audio functionality as well. The amount of available functionality and the fact that you need to understand the given window manager as well, makes these toolkits a bit complex and the learning curve steep. I would only consider to learn and use these if I really needed to use some system specific functionality that other toolkits don't provide. Otherwise I'd walk on and find something more simple which I could use in more situations.&lt;br /&gt;&lt;br /&gt;If you need to do some qt stuff here's some info:&lt;br /&gt;&lt;a href="http://rubyforge.org/projects/korundum/"&gt;a book&lt;br /&gt;korundrun&lt;/a&gt;: bindings for KDE and qt api's&lt;br /&gt;&lt;a href="http://techbase.kde.org/Development/Languages/Ruby"&gt;KDE techbase&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;System-independent: &lt;a href="http://waveninja.blogspot.com/2008/11/gui-toolkit-extravaganza-part-ii-fxruby.html"&gt;fxruby&lt;/a&gt; and &lt;a href="http://waveninja.blogspot.com/2008/11/gui-toolkit-extravaganza-part-iii-xruby.html"&gt;wxruby&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;Usually these toolkits are a layer cake of wrappers and libraries. Both are supported by many systems and allow you to code an app that looks the same on different systems. There is not much difference between these two toolkits. Fx is older which is bad because it just looks a bit dated, but on the other hand there is a decent amount of documentation, including a book on fxruby. Wx is a bit younger and looks better. One other difference is that wx is truly native, so all widgets are in the same style your window manager is. Fx looks mostly the same on different platforms. Both toolkits provide all standard GUI functions.&lt;br /&gt;&lt;br /&gt;If you are looking for a toolkit to make mainstream GUI's I'd go for one of these. Walk on if you want something different, something that's more suited for beginners or something more fun.&lt;br /&gt;&lt;span style="display: block;" id="formatbar_Buttons"&gt;&lt;span class="on down" style="display: block;" id="formatbar_CreateLink" title="Link" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;&lt;img src="http://www.blogger.com/img/blank.gif" alt="Link" class="gl_link" border="0" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The category for those that won't fit elsewhere: Monkeybars &amp;amp; Shoes&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Monkeybars: &lt;/span&gt;&lt;br /&gt;This toolkit is for rubyists who evolved from Javabut still want to code swing but this time using Ruby code. So if you learned Swing in a past life and don't want to learn a new GUI language again, I guess this is for you! Here's some background info:&lt;br /&gt;&lt;a href="http://monkeybars.rubyforge.org/"&gt;project page&lt;/a&gt;&lt;br /&gt;&lt;span style="display: block;" id="formatbar_Buttons"&gt;&lt;span class="on down" style="display: block;" id="formatbar_CreateLink" title="Link" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;&lt;img src="http://www.blogger.com/img/blank.gif" alt="Link" class="gl_link" border="0" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://screencastic.com/screencasts/2"&gt;screencastic screencast&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;a href="http://waveninja.blogspot.com/2009/01/gui-toolkit-extravaganza-part-iv-shoes.html"&gt;Shoes&lt;/a&gt;:&lt;/span&gt;&lt;br /&gt;My personal choice and recommendation. If you don't have very specific wishes you should try shoes and see if it fits! Why? Because it's the easiest and most enjoyable. If you later find that you need something which Shoes can't do you can always choose to learn something else.&lt;br /&gt;To learn Shoes you only need to take 10 steps, so stay tuned as we take 10 steps with Shoes in the following postings!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6814609191464852424-1741677252813845028?l=waveninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://waveninja.blogspot.com/feeds/1741677252813845028/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6814609191464852424&amp;postID=1741677252813845028" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6814609191464852424/posts/default/1741677252813845028?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6814609191464852424/posts/default/1741677252813845028?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/waveninja/~3/HAJ17BTJe3E/gui-toolkit-extravaganza-wrap-up.html" title="GUI toolkit extravaganza wrap-up" /><author><name>WaveNinja</name><uri>http://www.blogger.com/profile/09435808347083450332</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://3.bp.blogspot.com/_hEZGcNJ4hL4/Sfrw5MnKW-I/AAAAAAAAAG4/vbqM92a82UU/S220/Red+Tide.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://waveninja.blogspot.com/2009/01/gui-toolkit-extravaganza-wrap-up.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0AGQng_fyp7ImA9WxVSGEU.&quot;"><id>tag:blogger.com,1999:blog-6814609191464852424.post-6951875719854523560</id><published>2009-01-13T22:18:00.006+01:00</published><updated>2009-01-14T00:35:23.647+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-14T00:35:23.647+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="GUI" /><category scheme="http://www.blogger.com/atom/ns#" term="Shoes" /><title>GUI toolkit extravaganza part IV: Shoes</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_hEZGcNJ4hL4/SW0kc6qMhQI/AAAAAAAAAEQ/E11tEPxGIBY/s1600-h/shoes.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 200px; height: 150px;" src="http://3.bp.blogspot.com/_hEZGcNJ4hL4/SW0kc6qMhQI/AAAAAAAAAEQ/E11tEPxGIBY/s200/shoes.jpg" alt="" id="BLOGGER_PHOTO_ID_5290925216431375618" border="0" /&gt;&lt;/a&gt;Happy new year and all that. Yes I know, I haven't posted on my blog for ages. There's a perfectly good reason for that you know, see it was fricking freezing over here and my blog froze as well. Now the thaw has set in, time to get back at the GUI toolkit extravaganza. You do remember this GUI toolkit journey we started way back in 2008 right?...right? Well ok I guess I can't blame you, after all it has been a while and there probably were some parties...&lt;br /&gt;&lt;br /&gt;Once upon a time, a curious ruby learner wondered what he had to do to get his ruby programs do some GUI work. The learner quickly found himself in a scary forest of GUI toolkits for Ruby. Not knowing which one to choose and frightened by the aspect of learning the wrong toolkit he decided to take a peek at each one and write down the main differences. After each of his travels he would share his journeys with GUI toolkit extravaganza episodes.&lt;br /&gt;&lt;br /&gt;Originally the following toolkits were on the menu:&lt;br /&gt;&lt;br /&gt;Ruby-Gnome2&lt;br /&gt;FXRuby&lt;br /&gt;WXRuby&lt;br /&gt;Ruby Cocoa&lt;br /&gt;Shoes&lt;br /&gt;Monkeybars&lt;br /&gt;QtRuby&lt;br /&gt;&lt;br /&gt;Next up was to be Ruby Cocoa, but alas this is a Ruby GUI toolit for MacOS/X only and there's no apples here only bananas...&lt;br /&gt;&lt;br /&gt;Noticed my somewhat crazy writing style with an flair of eccentricity and impressions of genius have you? Yes my sweet children, you are correct when you think this must have something to do with Shoes! You were in fact still in the scary GUI toolkit forest and now you have been kidnapped by some &lt;a href="http://hackety.org/press/nks-8.html"&gt;catbunny&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;Shoes&lt;/span&gt;&lt;br /&gt;So what's Shoes? It's crazy, it's fun it's genius! It's small and simple but powerfull. It's somewhat webbie and easy to learn. And it's ooh shiny! And most of all it's quite fun and hassle free.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;ease of installation&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;You can get binaries for varius operating systems, source code is available and compiling is easy.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;documentation&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;There's plenty of documentation on Shoes, and for a change it's great fun to read it! Here's what I have found so far:&lt;br /&gt;&lt;br /&gt;Nobody Knows Shoes, the superb manual from _why, the author of Shoes in &lt;a href="http://www.lulu.com/content/1376595"&gt;hardcopy&lt;/a&gt;, &lt;a href="http://hackety.org/press/nks.html"&gt;html&lt;/a&gt; or &lt;a href="http://hackety.org/press/nks.pdf"&gt;pdf&lt;/a&gt;.&lt;br /&gt;Online shoes documentation (online as in included in the app)&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://www.shoooes.net/"&gt;Shoes webpage&lt;/a&gt; includes many documentation and tutorials as well.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;supported platforms&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;There are binaries for Linux, Mac and Windows  and sources are available as well. Ubuntu has included a slightly older version in their repositories.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;complexity&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Shoes has been the easiest of all to learn and use. There are no complex constructs or difficult syntax issues.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;functionality&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Shoes offers a simple but effective toolkit. There are some things that are just not there, things like window tabs or OpenGL stuff for example. But Shoes is not a GUI toolkit in the classic sense.&lt;br /&gt;Don't think too quickly you cannot do this or that because it lacks something. There's lots and lots you can do with Shoes you just need to think a bit about Human-Computer interaction and use your creativity.  Yes, creativity is what Shoes is all about. If you don't understand what I'm talking about, just check &lt;a href="http://hackety.org/press/"&gt;Nobody Knows Shoes&lt;/a&gt; and the &lt;a href="http://the-shoebox.org/"&gt;Shoe-box&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;performance&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;No complaints here, these shoes are suited for running.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;looks&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Shoes apps look wonderfull. Take a look at the &lt;a href="http://the-shoebox.org/"&gt;shoebox&lt;/a&gt; to get some impressions!&lt;br /&gt;&lt;br /&gt;You can find Shoes at:&lt;br /&gt;&lt;a href="http://www.shoooes.net/"&gt;http://www.shoooes.net/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6814609191464852424-6951875719854523560?l=waveninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://waveninja.blogspot.com/feeds/6951875719854523560/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6814609191464852424&amp;postID=6951875719854523560" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6814609191464852424/posts/default/6951875719854523560?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6814609191464852424/posts/default/6951875719854523560?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/waveninja/~3/NEnMKnmeJlQ/gui-toolkit-extravaganza-part-iv-shoes.html" title="GUI toolkit extravaganza part IV: Shoes" /><author><name>WaveNinja</name><uri>http://www.blogger.com/profile/09435808347083450332</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://3.bp.blogspot.com/_hEZGcNJ4hL4/Sfrw5MnKW-I/AAAAAAAAAG4/vbqM92a82UU/S220/Red+Tide.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_hEZGcNJ4hL4/SW0kc6qMhQI/AAAAAAAAAEQ/E11tEPxGIBY/s72-c/shoes.jpg" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://waveninja.blogspot.com/2009/01/gui-toolkit-extravaganza-part-iv-shoes.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE8BQn8-eCp7ImA9WxVTEUs.&quot;"><id>tag:blogger.com,1999:blog-6814609191464852424.post-4089341876783256520</id><published>2008-12-24T23:43:00.007+01:00</published><updated>2008-12-25T00:54:13.150+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-25T00:54:13.150+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Ubuntu EEE" /><category scheme="http://www.blogger.com/atom/ns#" term="Rubylearning" /><category scheme="http://www.blogger.com/atom/ns#" term="25C3" /><category scheme="http://www.blogger.com/atom/ns#" term="ASUS EEE" /><category scheme="http://www.blogger.com/atom/ns#" term="Shoes" /><title>Christmas: relief, salvation and commercialism</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_hEZGcNJ4hL4/SVLIwKwAvtI/AAAAAAAAAEI/dt8F1KNOKa8/s1600-h/badsanta.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 200px; height: 180px;" src="http://1.bp.blogspot.com/_hEZGcNJ4hL4/SVLIwKwAvtI/AAAAAAAAAEI/dt8F1KNOKa8/s200/badsanta.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5283506042704019154" /&gt;&lt;/a&gt;Christmas eve has finally arrived! To some, Christmas brings emotions of relief or salvation. To others, it's just one of those days filled with obligatory social calls and commercialism.&lt;br /&gt;&lt;br /&gt;The days that precede Christmas have been as hectic as they possibly can. One one side I had to make some preparations for the social necessities. And on the other side there was the commercial aspect, in Christmas times known as 'desperately trying to find something to give to someone while moving to endless black crowds carrying baby buggies with loss of orientation and decency'.&lt;br /&gt;&lt;br /&gt;If only had nothing else to do, I could fully indulge myself and study the strange mental state people get in while on a Christmas shopping spree...But, I had to attend also to more enlightened things such as coding my Shoes course assignments. The course is great and lots of fun. This is not just getting some exercises done. There is a great social aspect where you can interact with other coders and see solutions from other people, things you would have never thought of yourself. Also, having a skilled teacher who carries a contagious enthusiasm providing some excellent exercises helps to decrease the learning curve and keeps it fun! Unfortunately, the better must sometimes give way to the good...&lt;br /&gt;But, if you are interested in learning some GUI programming, there is good news for you! The 3rd batch of the shoes programming course at &lt;a href="http://rubylearning.com/"&gt;Rubylearning&lt;/a&gt; has been &lt;a href="http://rubylearning.com/blog/2008/10/30/ruby-and-shoes-programming-a-new-course/"&gt;announced&lt;/a&gt;, and it starts on 14 February. That's no holidays to bother you!&lt;br /&gt;&lt;br /&gt;Throwing myself at the Christmas shopping crowd did pay off at the very end. The right presents were obtained, and to further add to the joy, I finally got hold of my own very ASUS EEE PC! After a disastrous adventure on eBay, countless disappointments in the shops, and a somewhat obsessive compulsive venture to the ugliest city of my country, I am pleased to announce: ladies and gentlemen: I got em. Apparently the very last, ASUS EEE PC 1000HD, and specially for Christmas: the white version! Unfortunately, _no_ shop in .nl sells the Linux version. Apparently consumers prefer to pay for a Windows license and the dreadful OEM CD instead of a nice 40GB SSD. Well, if the noise will start to bother, I guess I'll visit &lt;a href="http://jkkmobile.blogspot.com/"&gt;jkk mobile&lt;/a&gt; and put the SSD in myself. It's a relieve to find that &lt;a href="http://www.ubuntu-eee.com/"&gt;ubuntu eee&lt;/a&gt; runs flawlessly and everything works like a charm. All adjustments have been made to resume my ruby coding and blogging as well. &lt;br /&gt;&lt;br /&gt;The holiday's have not arrived for me yet though. Starting tomorrow I have the social calls to make and right after that I'll travel to Berlin for the &lt;a href="http://events.ccc.de/congress/2008/"&gt;25C3&lt;/a&gt;. But there is one thing that's different in this busy week as opposed to the previous: an EEE with a full sized keyboard! I get to do some work while I'm wasting my time, finally salvation!&lt;br /&gt;&lt;br /&gt;Marry Christmas!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6814609191464852424-4089341876783256520?l=waveninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://waveninja.blogspot.com/feeds/4089341876783256520/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6814609191464852424&amp;postID=4089341876783256520" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6814609191464852424/posts/default/4089341876783256520?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6814609191464852424/posts/default/4089341876783256520?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/waveninja/~3/swVW-GC5ZjE/christmas-relief-salvation-and.html" title="Christmas: relief, salvation and commercialism" /><author><name>WaveNinja</name><uri>http://www.blogger.com/profile/09435808347083450332</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://3.bp.blogspot.com/_hEZGcNJ4hL4/Sfrw5MnKW-I/AAAAAAAAAG4/vbqM92a82UU/S220/Red+Tide.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_hEZGcNJ4hL4/SVLIwKwAvtI/AAAAAAAAAEI/dt8F1KNOKa8/s72-c/badsanta.jpg" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://waveninja.blogspot.com/2008/12/christmas-relief-salvation-and.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0EHR3o6eCp7ImA9WxVSGEU.&quot;"><id>tag:blogger.com,1999:blog-6814609191464852424.post-1440960974208778889</id><published>2008-12-11T16:38:00.001+01:00</published><updated>2009-01-13T22:20:36.410+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-13T22:20:36.410+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="wxruby" /><category scheme="http://www.blogger.com/atom/ns#" term="Ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="GUI" /><title>GUI toolkit extravaganza part III: WxRuby</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_hEZGcNJ4hL4/SUAvIU94S8I/AAAAAAAAAEA/Yjm2r8FhsCE/s1600-h/wxruby.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 160px; height: 50px;" src="http://4.bp.blogspot.com/_hEZGcNJ4hL4/SUAvIU94S8I/AAAAAAAAAEA/Yjm2r8FhsCE/s200/wxruby.png" alt="" id="BLOGGER_PHOTO_ID_5278270583391931330" border="0" /&gt;&lt;/a&gt;In the previous part of the GUI toolkit extravaganza we looked at the FXRuby toolkit. This time we will spend some time to look at the Yin of FXRuby's Yang, the wxRuby toolkit.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;wxRuby&lt;/span&gt;&lt;br /&gt;wxRuby is a library that enables Ruby code to use the wxWidgets library. wxWidgets is a cross-platform GUI library written in C++. wxRuby has arrived at version 2 so we will look at that one. Not only the name sounds like FXRuby but also it's features seem alike. Let's find out if there are any differences!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;ease of installation&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;xwruby2 is available as a Ruby gem. This makes the installation process very easy. According to the documentation, all you have to do is: sudo gem install wxruby2. There are also binary and source packages are available. On my Ubuntu Hardy Heron system, this did not do the trick however. Apperently there is something else you need to to apart from installing the gem, and this is poorly documented. You can read more about the problems installing wxruby2 in my p&lt;a href="http://waveninja.blogspot.com/2008/12/wxruby-reading-error-messages-about.html"&gt;revious post&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;documentation&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;There seems to be quite a decent ammount of documentation for wxruby2. The project &lt;a href="http://wxruby.rubyforge.org/"&gt;website&lt;/a&gt; provides the complete &lt;a href="http://wxruby.rubyforge.org/doc/"&gt;API reference&lt;/a&gt; and a &lt;a href="http://wxruby.rubyforge.org/wiki/wiki.pl?WxRuby_Tutorial"&gt;Tutorial&lt;/a&gt;. As far as I'm aware there are no books about wxruby2, nor have I seen it featured in a book. The project's website hosts two &lt;a href="http://wxruby.rubyforge.org/wiki/wiki.pl?MailingLists"&gt;mailinglists&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;supported platforms&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Wxruby has been created to provide a cross platform GUI toolkit, so it runs on multiple platforms. Systems running Linux, UNIX, Windows or Os/X are all supported by wxruby.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;complexity&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Take a look at the following code sample. We create a main window and place a button on it. We use PLACEMENT_SCREEN to center it. Piece of cake!&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;#!/usr/bin/env ruby&lt;br /&gt;#!/usr/bin/env ruby&lt;br /&gt;require 'wx'&lt;br /&gt;Wx::App.run do&lt;br /&gt;frame  = Wx::Frame.new(nil, :title =&gt; "wxRuby window")&lt;br /&gt;button = Wx::Button.new(frame, :label =&gt; 'Button')&lt;br /&gt;evt_button(button) { puts 'WXRuby' }&lt;br /&gt;frame.show&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;functionality&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;wxruby2 provides a standard set of graphical functions. The focus lies on cross-platform availability and the usage of native window designs. So on a GNOME system, you get GTK look and feel, on and on Mac OS/X you get aqua and on Windows you get the well known theme from Redmond. I am curious though as how much of windows, aqua and gtk functionality is supported...Unfortunately, finding that out would take more time then I have at the moment.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;performance&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;There was some flickering going on at the top of the window sometimes. But I have noticed that on Fxruby windows as well since I upgraded my system to Ubuntu Intrepid. It does not seem like it's a problem caused by any of these two kits. Otherwise this performs just good.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;looks&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;There's not much difference to be seen in the example provided here and the one previously provided in parts I of the GUI toolkit extravaganza. There are some minimal details around the buttons and edges. Reason is that it uses native graphics, so on my system it uses GTK in the end. Instead of adding yet another picture of a window with one button with only miniscule differences. Here's a picture from one of the sample programs, in this case,&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_hEZGcNJ4hL4/SUAqPaacW0I/AAAAAAAAADw/gZvFz9KVBic/s1600-h/Wxruby-sample-controls.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: center; cursor: pointer; width: 200px; height: 182px;" src="http://4.bp.blogspot.com/_hEZGcNJ4hL4/SUAqPaacW0I/AAAAAAAAADw/gZvFz9KVBic/s200/Wxruby-sample-controls.png" alt="" id="BLOGGER_PHOTO_ID_5278265207554857794" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You can find the wxruby2 toolkit at:&lt;br /&gt;&lt;a href="http://wxruby.rubyforge.org/"&gt;http://wxruby.rubyforge.org&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Next up for the GUI toolkit extravaganza part IV is Shoes!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6814609191464852424-1440960974208778889?l=waveninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://waveninja.blogspot.com/feeds/1440960974208778889/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6814609191464852424&amp;postID=1440960974208778889" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6814609191464852424/posts/default/1440960974208778889?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6814609191464852424/posts/default/1440960974208778889?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/waveninja/~3/11JqhI3YMJE/gui-toolkit-extravaganza-part-iii-xruby.html" title="GUI toolkit extravaganza part III: WxRuby" /><author><name>WaveNinja</name><uri>http://www.blogger.com/profile/09435808347083450332</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://3.bp.blogspot.com/_hEZGcNJ4hL4/Sfrw5MnKW-I/AAAAAAAAAG4/vbqM92a82UU/S220/Red+Tide.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_hEZGcNJ4hL4/SUAvIU94S8I/AAAAAAAAAEA/Yjm2r8FhsCE/s72-c/wxruby.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://waveninja.blogspot.com/2008/11/gui-toolkit-extravaganza-part-iii-xruby.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0cGQX0-eCp7ImA9WxRbGUU.&quot;"><id>tag:blogger.com,1999:blog-6814609191464852424.post-1527647327927758053</id><published>2008-12-09T21:45:00.026+01:00</published><updated>2008-12-11T10:50:20.350+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-11T10:50:20.350+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="wxruby" /><category scheme="http://www.blogger.com/atom/ns#" term="Ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="Gem" /><category scheme="http://www.blogger.com/atom/ns#" term="Ubuntu" /><title>wxruby: reading error messages about libraries</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_hEZGcNJ4hL4/ST8hsmVdLRI/AAAAAAAAADo/VUFJeSJy-oM/s1600-h/redglasses.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 200px; height: 136px;" src="http://1.bp.blogspot.com/_hEZGcNJ4hL4/ST8hsmVdLRI/AAAAAAAAADo/VUFJeSJy-oM/s200/redglasses.jpg" alt="" id="BLOGGER_PHOTO_ID_5277974338390011154" border="0" /&gt;&lt;/a&gt;As you might have noticed, some time has passed since I wrote about fxruby. Wxruby was to follow a few days after it. However I had been experiencing problems getting it to work. With only a few days to go before the Shoes class starts I wanted to put an end to this misery.&lt;br /&gt;&lt;br /&gt;First thing people do nowadays when problem solving is to Google for solutions, so did I. Searching for the errors I got did return some mailing list postings from people with the same problem, but no useful answers. As you might have experienced yourself, searching for these kinds of things can quickly take hours without you realizing it. It is not only time consuming, but in the spirit of despair you might just actually try some really stupid recommendation from a person who's most likely just be guessing himself. Actually trying some of their suggestions can add even more problems and make the whole so complex you'll eventually just give up...but then that's not very Ninja, is it?&lt;br /&gt;&lt;br /&gt;After installing the wx package I thought I'd only need to install the wxruby gem and be done with it.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;sudo gem install wxruby&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Unfortunately not so...&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-style: italic;"&gt;ruby -rubygems ./wxtest.rb&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;/var/lib/gems/1.8/gems/wxruby-1.9.9-x86-linux/lib/wxruby2.so: libwx_gtk2u_stc-2.8.so.0: cannot open shared object file: No such file or directory - /var/lib/gems/1.8/gems/wxruby-1.9.9-x86-linux/lib/wxruby2.so (LoadError)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;from /usr/lib/ruby/1.8/rubygems/custom_require.rb:27:in `require'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;from /var/lib/gems/1.8/gems/wxruby-1.9.9-x86-linux/lib/wx.rb:12&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;from /usr/lib/ruby/1.8/rubygems/custom_require.rb:32:in `gem_original_require'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;from /usr/lib/ruby/1.8/rubygems/custom_require.rb:32:in `require'&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;from ./wxtest.rb:3&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;Obviously it had some problems loading the wxruby2.so binary library. This file exists in the specified directory along with wx.rb. The permissions to wxruby2.so were set to readonly, this did not seem right for a binary. Adding execute permissions did not help however.&lt;br /&gt;&lt;br /&gt;The problem might have been caused by one of the other errors. One of them seemed to originate from wx.rb. Wx.rb can be found in the same directory as wxruby2.so. This is the file you should &lt;span style="font-style: italic;"&gt;require&lt;/span&gt; in your ruby code. Basically it loads both the wxruby2.so and ruby extensions to core wx classes. There was something about line 12. Using vim's :set nu command, the apparent culprit was displayed on my screen:&lt;br /&gt;&lt;blockquote&gt;11 # load the binary library&lt;br /&gt;12 require 'wxruby2'&lt;br /&gt;13&lt;br /&gt;14 # alias the module&lt;br /&gt;15 Wx = Wxruby2&lt;br /&gt;&lt;/blockquote&gt;There could not be anything wrong about that.&lt;br /&gt;&lt;br /&gt;There were however three errors in custom_require.rb. The first impression was, judging from the directory, that this was a generic function used by or for rubygems. Obviously I was not very convinced that this might be the cause of the problem. But it would not hurt to take a look.&lt;br /&gt;&lt;br /&gt;First look was at the code near line number 27:&lt;br /&gt;&lt;blockquote&gt;     26 def require(path) # :nodoc:&lt;br /&gt;27   gem_original_require path&lt;br /&gt;28   rescue LoadError =&gt; load_error&lt;br /&gt;29   if load_error.message =~ /\A[Nn]o such file to load -- #{Regexp.escape path}\z/&lt;br /&gt;&lt;/blockquote&gt;Hmm, this code wants a path to some gem thingy, else it throws an error. Not the error I got however. While this seemed illogical at that moment, sometimes one must keep problems simple and not add other problems along the way. The main point was this code wanted some path.&lt;br /&gt;&lt;br /&gt;Two other errors were caused at something near line 32.&lt;br /&gt;&lt;blockquote&gt;    32   gem_original_require path&lt;br /&gt;33   else&lt;br /&gt;34   raise load_error&lt;br /&gt;&lt;/blockquote&gt;No more clues were necessary. The suspect was some unknown path variable. Since wxruby was installed as a gem. My code needed to load rubygems itself. According to the&lt;a href="http://wxruby.rubyforge.org/wiki/wiki.pl?Installation"&gt; installation manual &lt;/a&gt;there's three ways to do this:&lt;br /&gt;&lt;br /&gt;* Run ruby with the -rubygems argument: eg ruby -rubygems my_wxruby_script.rb&lt;br /&gt;* Set the RUBYOPT environment variable to -rubygems&lt;br /&gt;* Add require 'rubygems' at the top of your wxruby program.&lt;br /&gt;&lt;br /&gt;I had tried running my code with the -rubygems argument allready. And I did use the require 'rubygems' in my code. I did not set the RUBYOPT however, so I removed the require line and set this variable with RUBYOPT="-rubygems".&lt;br /&gt;&lt;br /&gt;The same errors lit the screen after I ran my code again. A sense of defeat and disillusion filled my mind, what could be the problem? I had tried countless solutions, analyzed code, read documentation and yet I was no step further. Having no more ideas, I stared blankly at the screen, looking at the errors...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;/var/lib/gems/1.8/gems/wxruby-1.9.9-x86-linux/lib/wxruby2.so: libwx_gtk2u_stc-2.8.so.0: cannot open shared object file: No such file or directory - /var/lib/gems/1.8/gems/wxruby-1.9.9-x86-linux/lib/wxruby2.so (LoadError)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Staring back was a half lit reflection of myself. I saw a person who was about to give up as I started to think about skipping this chapter of the GUI Toolkit extravaganza. At least I had Ruby-GTK2 and FXruby...GTK?...What's that gtk doing in my error message!&lt;br /&gt;&lt;br /&gt;A quick query in my package management tool found that I did not have any libwx_gtk* libraries installed, why would I. The documentation certainly did not write about needing this library! I did encounter it while searching for ruby &amp;amp; wx libraries, but never made the connection...&lt;br /&gt;&lt;br /&gt;Anyway, there were some dependencies and here's what was installed:&lt;br /&gt;&lt;br /&gt;libwxgtk2.6-0&lt;br /&gt;libwxgtk2.6-dev&lt;br /&gt;libwxbase2.6-0&lt;br /&gt;libwxbase2.6-dev&lt;br /&gt;libwxgtk2.8-0&lt;br /&gt;libwxgtk2.8-dev&lt;br /&gt;libwxbase2.8-0&lt;br /&gt;libwxbase2.8-dev&lt;br /&gt;&lt;br /&gt;After this I could run the examples that come with wxruby. Looking back at the errors I wonder, did you overlook this one in the error messages as well?&lt;br /&gt;&lt;br /&gt;Comming up: Part III of the GUI toolkit extravaganza, featuring wxruby!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6814609191464852424-1527647327927758053?l=waveninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://waveninja.blogspot.com/feeds/1527647327927758053/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6814609191464852424&amp;postID=1527647327927758053" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6814609191464852424/posts/default/1527647327927758053?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6814609191464852424/posts/default/1527647327927758053?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/waveninja/~3/jA-ZnTrN430/wxruby-reading-error-messages-about.html" title="wxruby: reading error messages about libraries" /><author><name>WaveNinja</name><uri>http://www.blogger.com/profile/09435808347083450332</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://3.bp.blogspot.com/_hEZGcNJ4hL4/Sfrw5MnKW-I/AAAAAAAAAG4/vbqM92a82UU/S220/Red+Tide.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_hEZGcNJ4hL4/ST8hsmVdLRI/AAAAAAAAADo/VUFJeSJy-oM/s72-c/redglasses.jpg" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://waveninja.blogspot.com/2008/12/wxruby-reading-error-messages-about.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkIHRX04cSp7ImA9WxRbE0k.&quot;"><id>tag:blogger.com,1999:blog-6814609191464852424.post-2134037510901639739</id><published>2008-12-03T18:52:00.012+01:00</published><updated>2008-12-03T22:42:14.339+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-03T22:42:14.339+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Preview" /><category scheme="http://www.blogger.com/atom/ns#" term="Ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="books" /><category scheme="http://www.blogger.com/atom/ns#" term="Metasploit" /><title>Book preview: Wicked Cool Ruby Scripts</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_hEZGcNJ4hL4/STbH0Eb-N5I/AAAAAAAAADI/AYz_2DqsU88/s1600-h/wcruby_big.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 151px; height: 200px;" src="http://3.bp.blogspot.com/_hEZGcNJ4hL4/STbH0Eb-N5I/AAAAAAAAADI/AYz_2DqsU88/s200/wcruby_big.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5275623710869305234" /&gt;&lt;/a&gt;Good things come to those who wait. And wait I did. Somewhere back in June when I could still just walk around in a T-shirt, I decided to buy a book. After getting scared from looking at my Amazon wish list'o-saurus I quickly found myself searching for completely other books. O'Reilly always was a good string to start the search. I mean the search after doing the meta search to get the damn name right. It seemed only more quick to order directly from O'Reilly, you know, cut out the middle online-book-giant. After deciding to go for a more advanced Ruby book this time, the Ruby Cookbook found it's way to my shopping basket. Clearly this was not a book to read from beginning-to-end, but more of a handy help in desperate times. So, why not try to find something else as well? Something to really read from beginning to end. This time I found a book from NoStarch, Ruby by example. I remembered two other books from this publisher which I really valued for it's size, content and readability. So it seemed like a good choice. Time to check out. While experiencing the online-shopping rush at it's peak moment, some promo drew attention. Three for two, 3:2, 3-2=1, I have two, get three, one for free! Finding the last book was a daunting task. Only a few days later I found a book that was just added to the book announcements: Wicked cool ruby scripts from NoStarch. Interresting. It featured a robot on it's cover holding some kind of gem. Good, robots are cool. The announcement mentioned something about system administration, web scripting, utilities and security.&lt;br /&gt;&lt;br /&gt;That last one just did it, BANG, the collision of two of my favorite subjects! So I pre-ordered the book, which was to be published in September. No hurries, I had the other two books to read (on top of the to-read-stack I amassed already). But you can guess this one met with the most anticipation. After a while, having started on some other books just to get by, I received both the cookbook and ruby by example. So I started reading (reviews coming soon). Summer passed. September passed. No book. No word. Rescheduled release date. No word. Rescheduled release date. Still no word about my delayed order. So I sent mail to O'Reilly and after getting the most rude, dumb and hostile response. That's quite something coming from somebody who wants my money. To further add to the bad taste, even another release date slipped by. Was it ever going to be finished and sent? A few day's ago finally salvation in the mailbox: my book had been shipped!&lt;br /&gt;&lt;br /&gt;After having to wait a few more days, due to a UPS guy being an idiot, I finally had it in my hands! I just took the book from it's cardboard prison. &lt;br /&gt;&lt;br /&gt;First impression: this book is thin like it has been starving all those months I've been waiting. 189 is the number of the last page. If you have read my review on &lt;a href="http://waveninja.blogspot.com/2008/11/labelcloudtest.html"&gt;Learning Ruby&lt;/a&gt; you know I truly value short books. I feel an urge to tell you what I have against big, fat, long books...must..not...rant.&lt;br /&gt;&lt;br /&gt;Second impression: the author writes he will skip explaining Ruby. this is not a 101 Ruby book. Ok, good, there are plenty of those already!&lt;br /&gt;&lt;br /&gt;Next, I looked at the index, which read as follows:&lt;br /&gt;Chapter 1: General Purpose Utilities...&lt;span style="font-style:italic;"&gt;could be handy&lt;/span&gt;...Chapter 2: Website Scripting...&lt;span style="font-style:italic;"&gt;nice, too many Ruby books fail to give it the attention it deserves, probably due to Rails...&lt;/span&gt;...Chapter 3: Li(U)nix System Administration...&lt;span style="font-style:italic;"&gt;*nix stuff, always nice!&lt;/span&gt;...Chapter 4: Picture Utilities...Chapter 5: Games and Learning Tools...Chapter 6: String Utilities...Chapter 7: Servers and Scrapers...&lt;span style="font-style:italic;"&gt;what the hell is a scraper?&lt;/span&gt;...Chapter 8: Arguments and Documentation...&lt;br /&gt;Chapter 9: Sorting Algorithms...&lt;span style="font-style:italic;"&gt;some memories about my study years started to float around in my mind...quit sort...bubble sort in JAVA...beer...youth...&lt;/span&gt;...Chapter 10: Writing a Metasploit 3.1 Module with Ruby...&lt;span style="font-style:italic;"&gt;oh those sweet years, where have the times gone...&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;&lt;span style="font-style:italic;"&gt;wait: read again...&lt;/span&gt;&lt;/span&gt;Chapter 10: Writing a Metasploit 3.1 Module with Ruby...&lt;span style="font-style:italic;"&gt;...&lt;/span&gt;Metasploit...&lt;span style="font-style:italic;"&gt;Oreally? OMFG that just ROCKS!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Starting from chapter 10, off course, I read a little, flipped some pages to get some impressions. Well it sure looks promising, short scripts that look really useful, not too long explanations and a clear look and readable format look that is so typical for NoStarch books. Well this can't go wrong can it? &lt;br /&gt;&lt;br /&gt;There just remains one question: how the hell will I manage to read 7 books in the same time?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6814609191464852424-2134037510901639739?l=waveninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://waveninja.blogspot.com/feeds/2134037510901639739/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6814609191464852424&amp;postID=2134037510901639739" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6814609191464852424/posts/default/2134037510901639739?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6814609191464852424/posts/default/2134037510901639739?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/waveninja/~3/21E7Y-8C4PE/book-preview-wicked-cool-ruby-scripts.html" title="Book preview: Wicked Cool Ruby Scripts" /><author><name>WaveNinja</name><uri>http://www.blogger.com/profile/09435808347083450332</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://3.bp.blogspot.com/_hEZGcNJ4hL4/Sfrw5MnKW-I/AAAAAAAAAG4/vbqM92a82UU/S220/Red+Tide.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_hEZGcNJ4hL4/STbH0Eb-N5I/AAAAAAAAADI/AYz_2DqsU88/s72-c/wcruby_big.jpg" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://waveninja.blogspot.com/2008/12/book-preview-wicked-cool-ruby-scripts.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C04BSXc_cSp7ImA9WxRUGU0.&quot;"><id>tag:blogger.com,1999:blog-6814609191464852424.post-6704855701650705094</id><published>2008-11-28T20:45:00.004+01:00</published><updated>2008-11-28T20:52:38.949+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-28T20:52:38.949+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Ninja" /><title>Analyze this</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_hEZGcNJ4hL4/STBLOQLuXBI/AAAAAAAAACo/a9AJVJNdFn4/s1600-h/ninja-with-two-sai-weapons.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 110px; height: 110px;" src="http://2.bp.blogspot.com/_hEZGcNJ4hL4/STBLOQLuXBI/AAAAAAAAACo/a9AJVJNdFn4/s200/ninja-with-two-sai-weapons.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5273797871885245458" /&gt;&lt;/a&gt;"The independent and problem-solving type. They are especially attuned to the demands of the moment are masters of responding to challenges that arise spontaneously. They generally prefer to think things out for themselves and often avoid inter-personal conflicts.&lt;br /&gt;The Mechanics enjoy working together with other independent and highly skilled people and often like seek fun and action both in their work and personal life. They enjoy adventure and risk such as in driving race cars or working as policemen and firefighters."&lt;br /&gt;&lt;br /&gt;Hmm that sounds about right, except they should have called them The Ninjas instead of mechanics!&lt;br /&gt;&lt;br /&gt;Test your own at &lt;a href="http://www.typealyzer.com/index.php?lang=en"&gt;typealyzer&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6814609191464852424-6704855701650705094?l=waveninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://waveninja.blogspot.com/feeds/6704855701650705094/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6814609191464852424&amp;postID=6704855701650705094" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6814609191464852424/posts/default/6704855701650705094?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6814609191464852424/posts/default/6704855701650705094?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/waveninja/~3/heRkYU5cYMc/analyze-this.html" title="Analyze this" /><author><name>WaveNinja</name><uri>http://www.blogger.com/profile/09435808347083450332</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://3.bp.blogspot.com/_hEZGcNJ4hL4/Sfrw5MnKW-I/AAAAAAAAAG4/vbqM92a82UU/S220/Red+Tide.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_hEZGcNJ4hL4/STBLOQLuXBI/AAAAAAAAACo/a9AJVJNdFn4/s72-c/ninja-with-two-sai-weapons.jpg" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://waveninja.blogspot.com/2008/11/analyze-this.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEUHR389eip7ImA9WxRUGEU.&quot;"><id>tag:blogger.com,1999:blog-6814609191464852424.post-7975123488238816362</id><published>2008-11-28T14:19:00.008+01:00</published><updated>2008-11-28T15:23:56.162+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-28T15:23:56.162+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="course" /><category scheme="http://www.blogger.com/atom/ns#" term="Ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="learning" /><category scheme="http://www.blogger.com/atom/ns#" term="GUI" /><category scheme="http://www.blogger.com/atom/ns#" term="Shoes" /><title>Shoes course at Ruby learning</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_hEZGcNJ4hL4/SS_-mAt7FbI/AAAAAAAAACg/Vtaw2Y8t-Jg/s1600-h/shoes-icon.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 128px; height: 128px;" src="http://1.bp.blogspot.com/_hEZGcNJ4hL4/SS_-mAt7FbI/AAAAAAAAACg/Vtaw2Y8t-Jg/s200/shoes-icon.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5273713617655240114" /&gt;&lt;/a&gt;No post for the GUI toolkit extravaganza this time since I've been having some problems getting wxRuby to run properly. But this posting is related since we will deal with Shoes in one of the upcoming posts in the GUI toolkit extravaganza. So I just wanted to let you know I rolled in to the Shoes online course at rubylearning.org. It's a paid course, the cost is 5$ which is not much money. Why, the author of Shoes, seems to be happy about this course so I thought I'd give it a try. Anyway, the POIRPWSC101 course starts at 13 December and ends at 26 Dec 2008. This is a nice short time, so I should be able to keep focus :)&lt;br /&gt;&lt;br /&gt;Some while back I tried to follow the Free Online Core Ruby Programming Course (FORPC101), it was good but I did not manage to keep up due to poor planning on my side. It seems that since this time they are providing a few more interesting courses including the following:&lt;br /&gt;&lt;br /&gt;POIRPWSC101 - Paid Online Ruby with Shoes Programming Course&lt;br /&gt;POIRPWDC101 - Paid Online FXRuby and MySQL Programming Course&lt;br /&gt;&lt;br /&gt;If the Shoes fit, I think I'll sign up for the FXRuby and MySQL course as well. But it depends a little on my private and professional schedules. Oh and offcourse I'll write about my experiences on this Ruby class on this blog as well. If you are interested in taking a free, or almost free course on Ruby take a look at &lt;a href="http://rubylearning.org/class/"&gt;Rubylearning&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6814609191464852424-7975123488238816362?l=waveninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://waveninja.blogspot.com/feeds/7975123488238816362/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6814609191464852424&amp;postID=7975123488238816362" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6814609191464852424/posts/default/7975123488238816362?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6814609191464852424/posts/default/7975123488238816362?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/waveninja/~3/NLFJet62j6Y/shoes-course-at-ruby-learning.html" title="Shoes course at Ruby learning" /><author><name>WaveNinja</name><uri>http://www.blogger.com/profile/09435808347083450332</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://3.bp.blogspot.com/_hEZGcNJ4hL4/Sfrw5MnKW-I/AAAAAAAAAG4/vbqM92a82UU/S220/Red+Tide.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_hEZGcNJ4hL4/SS_-mAt7FbI/AAAAAAAAACg/Vtaw2Y8t-Jg/s72-c/shoes-icon.png" height="72" width="72" /><thr:total>1</thr:total><feedburner:origLink>http://waveninja.blogspot.com/2008/11/shoes-course-at-ruby-learning.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEQMR3YyfCp7ImA9WxRbGUk.&quot;"><id>tag:blogger.com,1999:blog-6814609191464852424.post-5168357468410704871</id><published>2008-11-24T22:49:00.014+01:00</published><updated>2008-12-10T21:53:06.894+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-10T21:53:06.894+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="FXRuby" /><category scheme="http://www.blogger.com/atom/ns#" term="Ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="GUI" /><title>GUI toolkit extravaganza part II: FXRuby</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_hEZGcNJ4hL4/SSsmXP0qsWI/AAAAAAAAABo/NVpy7MsUnyY/s1600-h/fxruby.jpg"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 200px; height: 200px;" src="http://4.bp.blogspot.com/_hEZGcNJ4hL4/SSsmXP0qsWI/AAAAAAAAABo/NVpy7MsUnyY/s200/fxruby.jpg" alt="" id="BLOGGER_PHOTO_ID_5272349969593577826" border="0" /&gt;&lt;/a&gt;The FXRuby toolkit is the subject of the GUI toolkit extravaganza, part deux. In this 7 part series, we will take a look at the various GUI toolkits in existence to find the ultimate GUI toolkit. One of the best known GUI toolkits is FXRuby, wich we will look at in this post.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;FXRuby&lt;/span&gt;&lt;br /&gt;FXRuby is a library that enables Ruby code to use the Fox toolkit. Fox is a graphics toolkit which was written in C++ and known for it's speed. FXRuby was created way back in 2001 and one of it's aims is to provide a cross-platform Ruby GUI toolkit. Let's take a closer look!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;ease of installation&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;FXRuby has an interactive installer for Windows systems. Macintosh systems can use the Mac ports. The sources are available so you can compile from source in any case. I had a bit of trouble installing it on my Ubuntu Hardy Heron system. But eventually I got it working. Here's what you need to do:&lt;br /&gt;apt-get install libfox-1.6-0 libfox-1.6-dev libfox-1.6-doc&lt;br /&gt;gem install fxruby&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;documentation&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;FXRuby has been nicely documented. The project &lt;a href="http://www.fxruby.org/"&gt;website&lt;/a&gt; provides the complete &lt;a href="http://www.fxruby.org/doc/api/"&gt;API reference&lt;/a&gt; and a &lt;a href="http://www.fxruby.org/doc/book.html"&gt;users guide&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;There is also a &lt;a href="http://www.pragprog.com/titles/fxruby/fxruby"&gt;book&lt;/a&gt; written solely about FXRuby. The project's website hosts two &lt;a href="http://www.fxruby.org/community.html"&gt;mailinglists&lt;/a&gt; as well.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;supported platforms&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;FXRuby has been created to provide a cross platform GUI toolkit, so it runs on multiple platforms. Systems running Linux, UNIX, Windows or Os/X are all supported by FXRuby.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;complexity&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Take a look at the following code sample. We create a main window and place a button on it. We use PLACEMENT_SCREEN to center it. Piece of cake!&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;#!/usr/bin/env ruby&lt;br /&gt;require 'fox16'&lt;br /&gt;include Fox&lt;br /&gt;app = FXApp.new&lt;br /&gt;MainWindow = FXMainWindow.new(app, "FXwindow" ,&lt;br /&gt;:width =&gt; 200, :height =&gt; 100)&lt;br /&gt;FXButton.new(MainWindow,"Button",nil,nil,0,BUTTON_NORMAL|LAYOUT_CENTER_Y|LAYOUT_CENTER_X)&lt;br /&gt;app.create&lt;br /&gt;MainWindow.show(PLACEMENT_SCREEN)&lt;br /&gt;app.run&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;functionality&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;FXRuby provides a standard set of graphical functions. But one feature that makes it stand out on the feature front is the support for OpenGL, providing the posibility to render cool 3-D graphics from your Ruby code.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;performance&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;The Fox toolkit is known for it's speed and limited use of system recourses. From what I have seen, the same goes for FXRuby, it is light and it is fast.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;looks&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;There's not much difference to be seen in the example provided here and the one previously provided in parts I of the GUI toolkit extravaganza. There are some minimal details around the buttons and edges.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_hEZGcNJ4hL4/SSwwhaM14bI/AAAAAAAAACQ/seaq7-SC-h8/s1600-h/FXRuby.jpg"&gt;&lt;img style="cursor: pointer; width: 200px; height: 121px;" src="http://1.bp.blogspot.com/_hEZGcNJ4hL4/SSwwhaM14bI/AAAAAAAAACQ/seaq7-SC-h8/s200/FXRuby.jpg" alt="" id="BLOGGER_PHOTO_ID_5272642614271009202" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Update: ok, this does not help a lot. Here's an impression of one of the sample programs that come with Fxruby:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_hEZGcNJ4hL4/SUAsAwAM-yI/AAAAAAAAAD4/RIHmm8-wbLc/s1600-h/fx-imageviewer.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 200px; height: 160px;" src="http://2.bp.blogspot.com/_hEZGcNJ4hL4/SUAsAwAM-yI/AAAAAAAAAD4/RIHmm8-wbLc/s200/fx-imageviewer.png" alt="" id="BLOGGER_PHOTO_ID_5278267154675596066" border="0" /&gt;&lt;/a&gt;As you can see, it looks a bit like some apps did in the windows98 days...&lt;br /&gt;&lt;br /&gt;You can find the FXRuby toolkit at:&lt;br /&gt;&lt;a href="http://www.fxruby.org/downloads.html"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Stay tuned for the GUI toolkit extravaganza part III: WxRuby&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6814609191464852424-5168357468410704871?l=waveninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://waveninja.blogspot.com/feeds/5168357468410704871/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6814609191464852424&amp;postID=5168357468410704871" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6814609191464852424/posts/default/5168357468410704871?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6814609191464852424/posts/default/5168357468410704871?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/waveninja/~3/xYFYvSoZ17o/gui-toolkit-extravaganza-part-ii-fxruby.html" title="GUI toolkit extravaganza part II: FXRuby" /><author><name>WaveNinja</name><uri>http://www.blogger.com/profile/09435808347083450332</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://3.bp.blogspot.com/_hEZGcNJ4hL4/Sfrw5MnKW-I/AAAAAAAAAG4/vbqM92a82UU/S220/Red+Tide.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_hEZGcNJ4hL4/SSsmXP0qsWI/AAAAAAAAABo/NVpy7MsUnyY/s72-c/fxruby.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://waveninja.blogspot.com/2008/11/gui-toolkit-extravaganza-part-ii-fxruby.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE8MQnozfCp7ImA9WxRUFUs.&quot;"><id>tag:blogger.com,1999:blog-6814609191464852424.post-7516451966005154980</id><published>2008-11-24T16:23:00.006+01:00</published><updated>2008-11-24T23:48:03.484+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-24T23:48:03.484+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="GTK" /><category scheme="http://www.blogger.com/atom/ns#" term="GNOME" /><category scheme="http://www.blogger.com/atom/ns#" term="Ruby-GNOME2" /><category scheme="http://www.blogger.com/atom/ns#" term="Ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="GUI" /><title>GUI toolkit extravaganza part I: Ruby-GNOME2</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_hEZGcNJ4hL4/SSrIePTnDFI/AAAAAAAAABg/CxQ4I4VzBPE/s1600-h/Ruby-GNOME2.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 136px; height: 136px;" src="http://4.bp.blogspot.com/_hEZGcNJ4hL4/SSrIePTnDFI/AAAAAAAAABg/CxQ4I4VzBPE/s200/Ruby-GNOME2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5272246735621000274" /&gt;&lt;/a&gt;Welcome to the first part of the GUI toolkit extravaganza. The previous post was an introduction to the GUI toolkit extravaganza. In this part, the first of 7, we will take a look at the Ruby-GNOME2 toolkit. Let's go ahead and take a peek at this interresting toolkit!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;/span&gt;&lt;span style="font-weight:bold;"&gt;Ruby-GNOME2&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Ruby-Gnome2 is a Ruby library that contains a set of bindings to various GNOME/GTK+2.0 libraries. Basically these are just Ruby wrappers around the GNOME/GTK+2.0 libs.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;span style="font-style:italic;"&gt;ease of installation&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;This toolkit is very easy to install if you happen to be using a system running GNOME and Ruby. If you use Ubuntu you only need to execute apt-get install ruby-gnome2. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;span style="font-style:italic;"&gt;documentation&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;There's quite a decent level of documentation for the Ruby-Gnome2 toolkit. There's a &lt;a href="http://ruby-gnome2.sourceforge.jp/"&gt;Wiki&lt;/a&gt; that includes the API reference and tutorials. There is quite a lot of documentation, but there are quite a lot of "fixme's" so not everything has been documented yet. The site also provides a few sample programs for instance a simple webbrowser, a simple audio player and the classic game Sokoban!&lt;br /&gt;There are a few public &lt;a href="http://sourceforge.net/mail/?group_id=53614"&gt;mailinglists&lt;/a&gt; too.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;span style="font-style:italic;"&gt;supported platforms&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;You can probably guess this one. It runs only on systems running GNOME. So this one is restricted to Linux and Unix systems. No Windows or MacOS and no Linux systems running other window managers.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;span style="font-style:italic;"&gt;complexity&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;A simple window with one button is created by the following code. It's pretty straightforward, but the odd thing is that the buttoncode is written before the window code. It's also quite a big ammount of code lines for a such a simple window.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;#!/usr/bin/env ruby&lt;br /&gt;&lt;br /&gt;require 'gtk2'&lt;br /&gt;&lt;br /&gt;button = Gtk::Button.new("Button")&lt;br /&gt;button.signal_connect("clicked") {&lt;br /&gt;  puts "Ruby-GTK2"&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;window = Gtk::Window.new&lt;br /&gt;window.set_default_size(100, 100)&lt;br /&gt;window.signal_connect("delete_event") {&lt;br /&gt;  puts "delete event occurred"&lt;br /&gt;  false&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;window.signal_connect("destroy") {&lt;br /&gt;  puts "destroy event occurred"&lt;br /&gt;  Gtk.main_quit&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;window.border_width = 100&lt;br /&gt;window.add(button)&lt;br /&gt;window.show_all&lt;br /&gt;&lt;br /&gt;Gtk.main&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;span style="font-style:italic;"&gt;functionality&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;If you thought this toolkit was limited to using GTK2.0 drawing libraries you were wrong. This toolkit not only offers access to the GTK libraries but also, amongst others, the GDK, Pango, Poppler, ATK and libglade libraries. So you can see it provides far more then just GUI functionality. There's stuff for mulitmedia, text editing, creation of PDF, accessibility, internationalization and what not.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;span style="font-style:italic;"&gt;performance&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;This is just as fast as your average GNOME app.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;span style="font-style:italic;"&gt;looks&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;This toolkit provides decent looks since it uses the GNOME/GTK2.0 libraries. Here's what our code looks like when executed.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_hEZGcNJ4hL4/SSq7-vR2BdI/AAAAAAAAABI/IYyNR3TOvUQ/s1600-h/RubyGTK2.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 200px; height: 200px;" src="http://1.bp.blogspot.com/_hEZGcNJ4hL4/SSq7-vR2BdI/AAAAAAAAABI/IYyNR3TOvUQ/s200/RubyGTK2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5272233000308180434" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You can find the Ruby-GNOME2 toolkit at:&lt;br /&gt;&lt;a href="http://ruby-gnome2.sourceforge.jp/"&gt;http://ruby-gnome2.sourceforge.jp/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Next one up is FXRuby!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6814609191464852424-7516451966005154980?l=waveninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://waveninja.blogspot.com/feeds/7516451966005154980/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6814609191464852424&amp;postID=7516451966005154980" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6814609191464852424/posts/default/7516451966005154980?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6814609191464852424/posts/default/7516451966005154980?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/waveninja/~3/Ve9N0zuWlP4/gui-toolkit-extravaganza-part-i-ruby.html" title="GUI toolkit extravaganza part I: Ruby-GNOME2" /><author><name>WaveNinja</name><uri>http://www.blogger.com/profile/09435808347083450332</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://3.bp.blogspot.com/_hEZGcNJ4hL4/Sfrw5MnKW-I/AAAAAAAAAG4/vbqM92a82UU/S220/Red+Tide.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_hEZGcNJ4hL4/SSrIePTnDFI/AAAAAAAAABg/CxQ4I4VzBPE/s72-c/Ruby-GNOME2.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://waveninja.blogspot.com/2008/11/gui-toolkit-extravaganza-part-i-ruby.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkcNQX45eip7ImA9WxRUFUk.&quot;"><id>tag:blogger.com,1999:blog-6814609191464852424.post-8154332274292025740</id><published>2008-11-24T10:45:00.016+01:00</published><updated>2008-11-24T16:21:30.022+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-24T16:21:30.022+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="GUI" /><title>GUI toolkit extravaganza!</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_hEZGcNJ4hL4/SSrGSuRjGpI/AAAAAAAAABY/ugDeBlYQmFU/s1600-h/redCodeBackground.gif"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 200px; height: 150px;" src="http://2.bp.blogspot.com/_hEZGcNJ4hL4/SSrGSuRjGpI/AAAAAAAAABY/ugDeBlYQmFU/s200/redCodeBackground.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5272244338752166546" /&gt;&lt;/a&gt;Lately I have been looking for the right toolkit to do some GUI coding. As it turns out, there are quite a lot of GUI toolkits available that are coded in Ruby or have Ruby binding's. At first glance, they rather seem not so different from each other. So it's time to put the candidates on the line and take a look at each one's pro's and cons. I am a bit biased in this comparison offcourse, since I do have my own specific needs for a GUI toolkit. So don't expect a fully scientific comparison here, this is biased, quick and dirty but I'll do you a favour and leave the religious aspects aside.&lt;br /&gt;Personally I am mostly interested in a cross-platform toolkit that provides the most functionality but above all is fast and simple. Basically, I'm too lazy to learn multiple GUI toolkits, so I want something simple and cross-platform. Off course it should look good on various platforms too!&lt;br /&gt;&lt;br /&gt;The usual suspects I have round up for you are:&lt;br /&gt;Ruby-Gnome2&lt;br /&gt;FXRuby&lt;br /&gt;WXRuby&lt;br /&gt;Ruby Cocoa&lt;br /&gt;Shoes&lt;br /&gt;Monkeybars&lt;br /&gt;QtRuby&lt;br /&gt;&lt;br /&gt;We shall compare these toolkits in the following blogposts on the following aspects:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;span style="font-style:italic;"&gt;ease of installation&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;What do you need to do to make it work. Install a Ruby Gem or compile from source? Are there any packages for different Operating Systems that ease installation? We will look at the ease of installation in general, and provide examples for Ubuntu Linux in specific.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;span style="font-style:italic;"&gt;documentation&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Is there any online documentation, how about how-to's and faq's, are there any books on the subject, how about discussion groups?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;span style="font-style:italic;"&gt;supported platforms&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;On which platform can you program this toolkit? On what platforms does the toolkit run?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;span style="font-style:italic;"&gt;complexity&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;We will use a simple window with a title, a button and some text to see the difference in complexity. Remember, this is just quick and dirty.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;span style="font-style:italic;"&gt;functionality&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;What can you do with the toolkit? This will be a hard one to answer since this is just a quick peek at the various available kits. The documentation will be used as a primary source to assess the provided functionality.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;span style="font-style:italic;"&gt;performance&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Did I write this was not a comparison with solid scientific fundaments? Well, I will just take a guess at the performance of the toolkit. Since I won't do some measurements it's just a subjective guess.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;span style="font-style:italic;"&gt;looks&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;This one is also subjective to one's personal taste. I'll post at least one picture so you can judge for yourself, but along with that you'll get my opinion for free :-)&lt;br /&gt;&lt;br /&gt;We'll take a look at the first GUI toolkit, Ruby-Gnome2, in the next blogpost so stay tuned!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6814609191464852424-8154332274292025740?l=waveninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://waveninja.blogspot.com/feeds/8154332274292025740/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6814609191464852424&amp;postID=8154332274292025740" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6814609191464852424/posts/default/8154332274292025740?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6814609191464852424/posts/default/8154332274292025740?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/waveninja/~3/VO--UzxJdB0/gui-toolkit-extravaganza.html" title="GUI toolkit extravaganza!" /><author><name>WaveNinja</name><uri>http://www.blogger.com/profile/09435808347083450332</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://3.bp.blogspot.com/_hEZGcNJ4hL4/Sfrw5MnKW-I/AAAAAAAAAG4/vbqM92a82UU/S220/Red+Tide.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_hEZGcNJ4hL4/SSrGSuRjGpI/AAAAAAAAABY/ugDeBlYQmFU/s72-c/redCodeBackground.gif" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://waveninja.blogspot.com/2008/11/gui-toolkit-extravaganza.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkYAQ3ozcSp7ImA9WxRUFUk.&quot;"><id>tag:blogger.com,1999:blog-6814609191464852424.post-5249732301345811563</id><published>2008-11-19T17:39:00.007+01:00</published><updated>2008-11-24T16:22:22.489+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-24T16:22:22.489+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Ruby" /><category scheme="http://www.blogger.com/atom/ns#" term="books" /><category scheme="http://www.blogger.com/atom/ns#" term="review" /><title>Book review: Learning Ruby</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://oreilly.com/catalog/covers/9780596529864_cat.gif"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 180px; height: 236px;" src="http://oreilly.com/catalog/covers/9780596529864_cat.gif" border="0" alt="" /&gt;&lt;/a&gt;Time for some knowledge sharing! My first book review is off course about a book on Ruby. In fact, it is on a book to learn (a bit) about Ruby. It caries the appropriate title &lt;a href="http://oreilly.com/catalog/9780596529864/"&gt;"Learning Ruby"&lt;/a&gt;. I read this book a while ago which actually helps in writing a good review. The impressions a book makes on the long run are the ones that count!&lt;br /&gt;&lt;br /&gt;So let's take a look at this book, and judge it by it's own promises shall we?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;The promise&lt;/span&gt;&lt;br /&gt;The reason I picked this book as my first Ruby book is the following text on the backside: &lt;blockquote&gt;You don't have to know everything about a car to drive one, and you don't need to know everything about Ruby to start programming with it. Written for both experienced and new programmers alike, learning Ruby is a just-get-in-and-drive book--a hands-on tutorial that offers lots of Ruby programs and explains how and why they work, just enough to get you rolling down the road.&lt;/blockquote&gt;&lt;br /&gt;Great, exactly what I wanted. Just a quick peek at this Ruby thing I heard about. A taste to see if the hype-du-jour suits you. Enough to get you rolling down the road. Well let's look back at these promises and see if this book delivers shall we?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;The delivery&lt;/span&gt;&lt;br /&gt;Learning Ruby is a book of 11 Chapters written on 238 pages. The first two chapters provide a basic coverage and a quick tour on Ruby. Chapters 3, 4, 5, 6 and 7 deal with the building blocks of a programming language. Things like loops, strings, math, array's and hashes. Small samples of code demonstrate the various techniques that are covered. Chapter 8 handles the working with files. Chapter 9 covers classes, modules, inheritance and other Object Orientation techniques. Chapter 10 focusses on various practical things like rdoc, RubyGems, REXML and exception handling.&lt;br /&gt;A bit of a surprise was chapter 11, which is about Rails. Rails is a web development framework that was written in Ruby. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;The verdict&lt;/span&gt;&lt;br /&gt;Learning Ruby is a small book, it's only 238 pages. If you think about it, this is quite unique for a book about computer stuff. Especially programming books have the bad habit of having at least 600 pages. I'm not a big fan of big books. First of all, they don't handle. They are heavy too. And, well there is just too much information in them! Try reading such a book in some busy public transport carriage, or find that you need to carry a backpack only because you want to bring along your book, pure evil!&lt;br /&gt;&lt;br /&gt;The book covers most basic things, it gives a good feeling about what Ruby is and what it can do for you. The examples were short, which is a good thing because you will try them all yourself. A drawback is that they are not really functional by themselves. Most of the examples worked too! There was a chapter on GUI coding using TK, but these examples did not seem to work for me. The topics the book covers are mostly standard things programming books cover, with the exception of chapter10. I'm not a big fan of how programming books always cover basic things like strings, arrays and arithmetic. But ok, this book also focuses on newcomers to programming. More experienced programmers will appreciate the fact that the chapters are small, but do in fact explain certain Ruby aspects in depth. Programmers of Perl or Python may find this book usefull since it occasionally points out the differences with Ruby on specific techniques. I liked chapter 10 for discussing a few practical things such as dealing with XML or documenting with Rdoc. Chapter 11 however could have better been used to write about more Ruby stuff, not about a (rightly so) popular application that was written in it. People who want to know about Rails want and surely will read a book about Rails instead.&lt;br /&gt;&lt;br /&gt;My conclusion is that this book delivers on it's promise. While this book is not an instant classic, the writing and examples in this book are mostly of good quality. If you are a beginning or experienced programmer looking for a taste of Ruby, you'll like this book. If however you are more of a practical person who has already read about basic programming things, you'll probably want to read another book instead.&lt;br /&gt;&lt;br /&gt;Considering the price tag and the amount of pages, you'll might just want to buy this when you find yourself in a bookstore on a rainy day and happen to be a little bored but don't want to commit to something. Don't be surprised though if you find yourself getting hooked on Ruby thing after reading this book :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6814609191464852424-5249732301345811563?l=waveninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://waveninja.blogspot.com/feeds/5249732301345811563/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6814609191464852424&amp;postID=5249732301345811563" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6814609191464852424/posts/default/5249732301345811563?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6814609191464852424/posts/default/5249732301345811563?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/waveninja/~3/qNrfDUnm1Xc/labelcloudtest.html" title="Book review: Learning Ruby" /><author><name>WaveNinja</name><uri>http://www.blogger.com/profile/09435808347083450332</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://3.bp.blogspot.com/_hEZGcNJ4hL4/Sfrw5MnKW-I/AAAAAAAAAG4/vbqM92a82UU/S220/Red+Tide.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://waveninja.blogspot.com/2008/11/labelcloudtest.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU8DQ3Y4eip7ImA9WxRUEUw.&quot;"><id>tag:blogger.com,1999:blog-6814609191464852424.post-6117759729273619875</id><published>2008-11-19T17:38:00.006+01:00</published><updated>2008-11-19T19:04:32.832+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-19T19:04:32.832+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Ninja" /><title>Label cloud</title><content type="html">Found a nice looking Label Cloud whilst decorating the Dojo here. There's a pretty decent writeup on how to add one to Blogger at &lt;a href="http://phy3blog.googlepages.com/Beta-Blogger-Label-Cloud.html"&gt;phyeblog's&lt;/a&gt;. The layout of my Dojo here is subject to vast changes as I need to find a style that suits my clan ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6814609191464852424-6117759729273619875?l=waveninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://waveninja.blogspot.com/feeds/6117759729273619875/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6814609191464852424&amp;postID=6117759729273619875" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6814609191464852424/posts/default/6117759729273619875?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6814609191464852424/posts/default/6117759729273619875?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/waveninja/~3/s7i-6gMJbzo/test_19.html" title="Label cloud" /><author><name>WaveNinja</name><uri>http://www.blogger.com/profile/09435808347083450332</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://3.bp.blogspot.com/_hEZGcNJ4hL4/Sfrw5MnKW-I/AAAAAAAAAG4/vbqM92a82UU/S220/Red+Tide.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://waveninja.blogspot.com/2008/11/test_19.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkAGQ3c9eSp7ImA9WxRUFUk.&quot;"><id>tag:blogger.com,1999:blog-6814609191464852424.post-1464037044225691891</id><published>2008-11-19T16:34:00.011+01:00</published><updated>2008-11-24T16:32:02.961+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-24T16:32:02.961+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Ninja" /><title>Ninja Entry</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_hEZGcNJ4hL4/SSQ6xd2wqkI/AAAAAAAAAA4/0Rd9UtMjOck/s1600-h/ninjaentry.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 133px; height: 200px;" src="http://4.bp.blogspot.com/_hEZGcNJ4hL4/SSQ6xd2wqkI/AAAAAAAAAA4/0Rd9UtMjOck/s200/ninjaentry.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5270402085432633922" /&gt;&lt;/a&gt;Welcome to the home of WaveNinja! Visit my Blog to follow me on my quest of knowledge and learning. I shall write mostly about interresting things I come across on my travels though the barren wastelands of science, technology and society. My posts shall mostly focus on the three elements: Wireless technologies, security and Ruby coding. But you will also find some scrolls on Soekris, MythTV, OpenBSD, Linux, Sci-Fi, books and movies from time to time.&lt;br /&gt;&lt;br /&gt;My hopes are my scrolls will lead us both to a greater understanding and higher skills so we may be all Ninja masters one day...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6814609191464852424-1464037044225691891?l=waveninja.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://waveninja.blogspot.com/feeds/1464037044225691891/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6814609191464852424&amp;postID=1464037044225691891" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6814609191464852424/posts/default/1464037044225691891?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6814609191464852424/posts/default/1464037044225691891?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/waveninja/~3/q5G0S1BbHgw/ninja-entry.html" title="Ninja Entry" /><author><name>WaveNinja</name><uri>http://www.blogger.com/profile/09435808347083450332</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="24" src="http://3.bp.blogspot.com/_hEZGcNJ4hL4/Sfrw5MnKW-I/AAAAAAAAAG4/vbqM92a82UU/S220/Red+Tide.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_hEZGcNJ4hL4/SSQ6xd2wqkI/AAAAAAAAAA4/0Rd9UtMjOck/s72-c/ninjaentry.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://waveninja.blogspot.com/2008/11/ninja-entry.html</feedburner:origLink></entry></feed>

