<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Serabe Reloaded &#187; Ruby</title>
	<atom:link href="http://www.serabe.com/tag/ruby/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.serabe.com</link>
	<description>Conecto ergo sum. Non conecto ergo urgueo.</description>
	<lastBuildDate>Sun, 09 Oct 2011 21:30:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Adding organization repos to Travis-CI: Part I</title>
		<link>http://www.serabe.com/2011/10/09/adding-organization-repos-to-travis-ci-part-i/</link>
		<comments>http://www.serabe.com/2011/10/09/adding-organization-repos-to-travis-ci-part-i/#comments</comments>
		<pubDate>Sun, 09 Oct 2011 21:30:53 +0000</pubDate>
		<dc:creator>Serabe</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[sproutcore]]></category>
		<category><![CDATA[travis-ci]]></category>

		<guid isPermaLink="false">http://www.serabe.com/?p=594</guid>
		<description><![CDATA[It was a nice Friday, Porras and I were at the BeBanjOffice and  we were working on adding organization support to Travis-CI. First, we needed to find where the user repos were being fetch. Said and done, we found that travis is using the ServiceHookController to ask the server for repos (and to update them too, but [...]]]></description>
			<content:encoded><![CDATA[<p>It was a <a href="https://bebanjo.jottit.com/open_source_fridays" title="Open Source Fridays" >nice Friday</a>, <a href="https://github.com/porras" title="Porras' Github Profile" >Porras</a> and I were at the BeBanjOffice and  we were working on adding organization support to <a href="http://travis-ci.org/" title="Travis CI" >Travis-CI</a>.</p>
<p>First, we needed to find where the user repos were being fetch. Said and done, we found that travis is using the <a href="https://github.com/porras/travis-ci/blob/66c763df9f1bf298aa8871816f7bcaf1bfbff30b/app/controllers/service_hooks_controller.rb" title="ServiceHookController in Github" >ServiceHookController</a> to ask the server for repos (and to update them too, but don&#8217;t hurry, we&#8217;ll get there in part II). The controller was using the <a href="https://github.com/porras/travis-ci/blob/66c763df9f1bf298aa8871816f7bcaf1bfbff30b/app/models/user.rb#L40" title="github_repositories" >github_repositories</a> method in the <a href="https://github.com/porras/travis-ci/blob/66c763df9f1bf298aa8871816f7bcaf1bfbff30b/app/models/user.rb" title="User model" >User model</a>. Finally, we arrived to <a href="https://github.com/porras/travis-ci/blob/66c763df9f1bf298aa8871816f7bcaf1bfbff30b/lib/travis/github_api.rb" title="Travis::GithubApi" >Travis::GithubApi</a>, where all our questions found answers.</p>
<p><a href="https://github.com/porras/travis-ci/blob/66c763df9f1bf298aa8871816f7bcaf1bfbff30b/lib/travis/github_api.rb#L32" title="repositories_for_user method" >repositories_for_user</a> just relied on <code>Octokit#repositories</code> for getting the repos, so we added all the code after the plus sign. You might think that this code lacks the proper security, is wrong and that it shouldn&#8217;t be there (and damn it, you&#8217;re right!) but there is no easy way to retrieve only the repos where the user has admin privileges (we wasted hours on this and a quick message to Github confirmed it).  Basically, it asks for all organizations for the given user (beware! You need to make your membership public, otherwise it won&#8217;t work) and then flat_map them to the repos in the given organization (whether the user can administrate them or not).</p>
<p>Later, the <code>each</code> block was added so we could know whether the repo belongs to the user or to an organization.</p>
<h2>Stop! Hammertime!</h2>
<p>We needed a way to let the user know that a repo actually belongs to an organization, so we added that info to the <a href="https://github.com/porras/travis-ci/blob/66c763df9f1bf298aa8871816f7bcaf1bfbff30b/app/assets/javascripts/app/templates/service_hooks/list.jst.hjs" title="Template code." >template</a> (that <code>{{#if content.organization_name}}</code> is ours <img src='http://www.serabe.com/wp-includes/images/smilies/icon_biggrin.gif' alt="icon biggrin Adding organization repos to Travis CI: Part I" class='wp-smiley' title="Adding organization repos to Travis CI: Part I" /> ) and added some <a href="https://github.com/porras/travis-ci/blob/66c763df9f1bf298aa8871816f7bcaf1bfbff30b/app/assets/stylesheets/application.scss#L909" title="SCSS code" >style</a> so it could look this awesome:</p>
<div class="thumbnail"><a href="http://skitch.com/e-serabe/fhqxc/travis-ci-distributed-build-platform-for-the-open-source-community" ><img style="max-width: 638px;" src="http://img.skitch.com/20110928-q5hyhyuddmqnsr7awgmxtj6ph5.medium.jpg" alt="20110928 q5hyhyuddmqnsr7awgmxtj6ph5.medium Adding organization repos to Travis CI: Part I"  title="Adding organization repos to Travis CI: Part I" /></a></div>
<p>We had some tough time trying to get it vertically centered, but after realizing that Github has its tags the same way as we do, we stop trying to fix it. And they still look awesome.</p>
<p>More coming in part II.</p>
<div class="evernoteSiteMemory"><a href="javascript:" onclick="Evernote.doClip({title: 'Adding organization repos to Travis-CI: Part I on Serabe Reloaded',url: 'http://www.serabe.com/2011/10/09/adding-organization-repos-to-travis-ci-part-i/',contentID: 'post-594',suggestTags: 'opensource,Ruby,sproutcore,travis-ci',providerName: 'Serabe Reloaded',styling: 'text' });return false" class="evernoteSiteMemoryLink"><img src="http://static.evernote.com/article-clipper.png" class="evernoteSiteMemoryButton" title="Adding organization repos to Travis CI: Part I" alt="article clipper Adding organization repos to Travis CI: Part I" />
				</a>				<div class="evernoteSiteMemoryClear">&nbsp;</div>
</div><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.serabe.com%2F2011%2F10%2F09%2Fadding-organization-repos-to-travis-ci-part-i%2F&amp;title=Adding%20organization%20repos%20to%20Travis-CI%3A%20Part%20I" id="wpa2a_2"><img src="http://www.serabe.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="share save 171 16 Adding organization repos to Travis CI: Part I"  title="Adding organization repos to Travis CI: Part I" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.serabe.com/2011/10/09/adding-organization-repos-to-travis-ci-part-i/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Transforming CSS selector to an XPath query</title>
		<link>http://www.serabe.com/2011/09/09/transforming-css-selector-to-xpath/</link>
		<comments>http://www.serabe.com/2011/09/09/transforming-css-selector-to-xpath/#comments</comments>
		<pubDate>Fri, 09 Sep 2011 18:42:41 +0000</pubDate>
		<dc:creator>Serabe</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[nokogiri]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.serabe.com/?p=589</guid>
		<description><![CDATA[So. Easy. PLAIN TEXT RUBY: require 'nokogiri'; Nokogiri::CSS.xpath_for&#40;css_selector&#41; &#160;]]></description>
			<content:encoded><![CDATA[<p>So. Easy.</p>
<div class="igBar"><span id="lruby-2"><a href="#" onclick="javascript:showPlainTxt('ruby-2'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">RUBY:</span>
<div id="ruby-2">
<div class="ruby">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#CC0066; font-weight:bold;">require</span> 'nokogiri'; Nokogiri::CSS.<span style="color:#9900CC;">xpath_for</span><span style="color:#006600; font-weight:bold;">&#40;</span>css_selector<span style="color:#006600; font-weight:bold;">&#41;</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<div class="evernoteSiteMemory"><a href="javascript:" onclick="Evernote.doClip({title: 'Transforming CSS selector to an XPath query on Serabe Reloaded',url: 'http://www.serabe.com/2011/09/09/transforming-css-selector-to-xpath/',contentID: 'post-589',suggestTags: 'nokogiri,programming,Ruby',providerName: 'Serabe Reloaded',styling: 'text' });return false" class="evernoteSiteMemoryLink"><img src="http://static.evernote.com/article-clipper.png" class="evernoteSiteMemoryButton" title="Transforming CSS selector to an XPath query" alt="article clipper Transforming CSS selector to an XPath query" />
				</a>				<div class="evernoteSiteMemoryClear">&nbsp;</div>
</div><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.serabe.com%2F2011%2F09%2F09%2Ftransforming-css-selector-to-xpath%2F&amp;title=Transforming%20CSS%20selector%20to%20an%20XPath%20query" id="wpa2a_4"><img src="http://www.serabe.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="share save 171 16 Transforming CSS selector to an XPath query"  title="Transforming CSS selector to an XPath query" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.serabe.com/2011/09/09/transforming-css-selector-to-xpath/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Writing your own JRuby extension. Part II: Creating your first class.</title>
		<link>http://www.serabe.com/2010/03/12/writing-your-own-jruby-extension-part-ii-creating-your-first-class/</link>
		<comments>http://www.serabe.com/2010/03/12/writing-your-own-jruby-extension-part-ii-creating-your-first-class/#comments</comments>
		<pubDate>Thu, 11 Mar 2010 23:06:04 +0000</pubDate>
		<dc:creator>Serabe</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[JRuby]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[jruby]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.serabe.com/?p=481</guid>
		<description><![CDATA[What's the point of coding a JRuby extension if you don't create classes? Well, I cannot think of any case, but if you find one, please, let me know. Do you remember Java's classes hierarchy? If so, you'll realize  that Java objects inherit from java.lang.Object by default but that is not actually what we need. [...]]]></description>
			<content:encoded><![CDATA[<p><a rel="nofollow" href="http://www.flickr.com/photos/53326337@N00/3783473433/" title="More Mormon Matryoshki"  target="_blank"><img class="alignright" style="border: 0px initial initial;" src="http://farm4.static.flickr.com/3057/3783473433_98d837343a_m.jpg" border="0" alt="3783473433 98d837343a m Writing your own JRuby extension. Part II: Creating your first class." width="240" height="143" title="Writing your own JRuby extension. Part II: Creating your first class." /></a><br />
What's the point of coding a JRuby extension if you don't create classes? Well, I cannot think of any case, but if you find one, please, let me know.</p>
<p>Do you remember Java's classes hierarchy? If so, you'll realize  that Java objects inherit from java.lang.Object by default but that is not actually what we need. But how can we tell JRuby that our object inherits from Object, the king of Ruby world? The answer is so simple: just extend RubyObject! (There is a RubyBasicObject too) Taken from Nokogiri::XML::Node:</p>
<p><script src="http://gist.github.com/281421.js"></script></p>
<p>Of course, you can extend any other class, as long as it is a "Ruby object". For example, Nokogiri::XML::Document extends from Nokogiri::XML::Node, and we do not need to do anything special to reflect it, just extend XmlNode like XmlDocument does:</p>
<p><script src="http://gist.github.com/281426.js"></script></p>
<p>After talking a bit about hierarchy, let's talk about Java constructors. At least two parameters are needed: a org.jruby.Ruby object and a org.jruby.RubyClass object. Being the importance of the former quite obvious, the reason for the latter may not be so clear. Let me show you some real world code: Nokogiri::XML::Node's dup method. Take a look at the following test:</p>
<p><script src="http://gist.github.com/284316.js"></script></p>
<p>Both new and dup methods in subclass rely on Nokogiri::XML::Node's. In <a href="http://github.com/tenderlove/nokogiri/blob/master/ext/nokogiri/xml_node.c#L281" >here</a>, you can see the this snippet of code:</p>
<p><script src="http://gist.github.com/284318.js"></script></p>
<p>The <code>rb_obj_class</code> method returns the class of an object, in this case, <em>self</em>. This way, the new node will be an instance of the same class as the original node. That's the reason a RubyClass is needed in the constructor, in order to know which is the actual class being instantiated.</p>
<p>By the way, do not forget to call super with the Ruby and RubyClass objects.</p>
<p>Next step: creating methods.</p>
<p><a href="http://creativecommons.org/licenses/by-sa/2.0/" title="Attribution-ShareAlike License"  target="_blank"><img src="http://www.serabe.com/wp-content/plugins/photo-dropper/images/cc.png" border="0" alt="cc Writing your own JRuby extension. Part II: Creating your first class." width="16" height="16" align="absmiddle" title="Writing your own JRuby extension. Part II: Creating your first class." /></a> <a href="http://www.photodropper.com/photos/"  target="_blank">photo</a> credit: <a rel="nofollow" href="http://www.flickr.com/photos/53326337@N00/3783473433/" title="quinn.anya"  target="_blank">quinn.anya</a></p>
<div class="evernoteSiteMemory"><a href="javascript:" onclick="Evernote.doClip({title: 'Writing your own JRuby extension. Part II: Creating your first class. on Serabe Reloaded',url: 'http://www.serabe.com/2010/03/12/writing-your-own-jruby-extension-part-ii-creating-your-first-class/',contentID: 'post-481',suggestTags: 'Java,jruby,programming,Ruby,tutorial',providerName: 'Serabe Reloaded',styling: 'text' });return false" class="evernoteSiteMemoryLink"><img src="http://static.evernote.com/article-clipper.png" class="evernoteSiteMemoryButton" title="Writing your own JRuby extension. Part II: Creating your first class." alt="article clipper Writing your own JRuby extension. Part II: Creating your first class." />
				</a>				<div class="evernoteSiteMemoryClear">&nbsp;</div>
</div><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.serabe.com%2F2010%2F03%2F12%2Fwriting-your-own-jruby-extension-part-ii-creating-your-first-class%2F&amp;title=Writing%20your%20own%20JRuby%20extension.%20Part%20II%3A%20Creating%20your%20first%20class." id="wpa2a_6"><img src="http://www.serabe.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="share save 171 16 Writing your own JRuby extension. Part II: Creating your first class."  title="Writing your own JRuby extension. Part II: Creating your first class." /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.serabe.com/2010/03/12/writing-your-own-jruby-extension-part-ii-creating-your-first-class/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Writing your own JRuby extension. First problem.</title>
		<link>http://www.serabe.com/2010/01/11/writing-your-own-jruby-extension-first-problem/</link>
		<comments>http://www.serabe.com/2010/01/11/writing-your-own-jruby-extension-first-problem/#comments</comments>
		<pubDate>Sun, 10 Jan 2010 23:09:22 +0000</pubDate>
		<dc:creator>Serabe</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[JRuby]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[jruby]]></category>
		<category><![CDATA[jruby extension tutorial]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.serabe.com/?p=478</guid>
		<description><![CDATA[Maybe, when requiring your just created extension, you get a LoadError. If it is the first time you require it, it is quite likely that you have not followed JRuby requiring conventions. If you want to know how require works, you can find the best documentation ever about it in the comment before org.jruby.runtime.load.LoadService class. [...]]]></description>
			<content:encoded><![CDATA[<p><a rel="nofollow" href="http://www.flickr.com/photos/99909414@N00/3981364314/" title="Denial"  target="_blank"><img class="alignleft" style="border: 0px initial initial;" src="http://farm3.static.flickr.com/2422/3981364314_d4b30cb739_m.jpg" border="0" alt="3981364314 d4b30cb739 m Writing your own JRuby extension. First problem." width="240" height="159" title="Writing your own JRuby extension. First problem." /></a><br />
Maybe, when requiring your just created extension, you get a LoadError. If it is the first time you require it, it is quite likely that you have not followed JRuby requiring conventions. If you want to know how require works, you can find the best documentation ever about it in the comment before <a href="http://github.com/jruby/jruby/blob/master/src/org/jruby/runtime/load/LoadService.java#L42" title="Github" >org.jruby.runtime.load.LoadService</a> class.</p>
<p><small><a href="http://creativecommons.org/licenses/by/2.0/" title="Attribution License"  target="_blank"><img src="http://www.serabe.com/wp-content/plugins/photo-dropper/images/cc.png" border="0" alt="cc Writing your own JRuby extension. First problem." width="16" height="16" align="absmiddle" title="Writing your own JRuby extension. First problem." /></a> <a href="http://www.photodropper.com/photos/"  target="_blank">photo</a> credit: <a rel="nofollow" href="http://www.flickr.com/photos/99909414@N00/3981364314/" title="cesarastudillo"  target="_blank">cesarastudillo</a></small></p>
<div class="evernoteSiteMemory"><a href="javascript:" onclick="Evernote.doClip({title: 'Writing your own JRuby extension. First problem. on Serabe Reloaded',url: 'http://www.serabe.com/2010/01/11/writing-your-own-jruby-extension-first-problem/',contentID: 'post-478',suggestTags: 'Java,jruby,jruby extension tutorial,programming,Ruby',providerName: 'Serabe Reloaded',styling: 'text' });return false" class="evernoteSiteMemoryLink"><img src="http://static.evernote.com/article-clipper.png" class="evernoteSiteMemoryButton" title="Writing your own JRuby extension. First problem." alt="article clipper Writing your own JRuby extension. First problem." />
				</a>				<div class="evernoteSiteMemoryClear">&nbsp;</div>
</div><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.serabe.com%2F2010%2F01%2F11%2Fwriting-your-own-jruby-extension-first-problem%2F&amp;title=Writing%20your%20own%20JRuby%20extension.%20First%20problem." id="wpa2a_8"><img src="http://www.serabe.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="share save 171 16 Writing your own JRuby extension. First problem."  title="Writing your own JRuby extension. First problem." /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.serabe.com/2010/01/11/writing-your-own-jruby-extension-first-problem/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Writing your own JRuby extension. Part I: BasicLibraryService.</title>
		<link>http://www.serabe.com/2010/01/08/writing-your-own-jruby-extension-part-i/</link>
		<comments>http://www.serabe.com/2010/01/08/writing-your-own-jruby-extension-part-i/#comments</comments>
		<pubDate>Fri, 08 Jan 2010 00:22:44 +0000</pubDate>
		<dc:creator>Serabe</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[JRuby]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[extensions]]></category>
		<category><![CDATA[jruby]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.serabe.com/?p=445</guid>
		<description><![CDATA[Note: not code in this post, but you can see the code in Github. Follow the links! Writing a JRuby extension is very easy, but there are almost not post out there about it. As far as I know, there is only one, Ola's. It is a really good tutorial indeed, but it lacks some [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Note:</strong> not code in this post, but you can see the code in Github. Follow the links!</p>
<p>Writing a JRuby extension is very easy, but there are almost not post out there about it. As far as I know, there is only one, <a rel="nofollow" href="http://ola-bini.blogspot.com/2006/10/jruby-tutorial-4-writing-java.html" title="JRuby Tutorial 4. Ola Bini's blog." >Ola's</a>. It is a really good tutorial indeed, but it lacks some details that might be not-that-easy to solve. Please, take some time to read it and, if some details are different, do follow Ola's way.</p>
<p>Everything's ready now, so let's start talking about <a href="http://github.com/jruby/jruby/blob/master/src/org/jruby/runtime/load/BasicLibraryService.java" title="Github" >BasicLibraryService</a>. If you take a look at <a href="http://github.com/tenderlove/nokogiri/tree/java" title="Github repo" >Nokogiri4J sourcecode</a>, in <a href="http://github.com/tenderlove/nokogiri/tree/java/ext/java/nokogiri/" title="Github repo" >ext/java/nokogiri</a> folder, you will see a <a href="http://github.com/tenderlove/nokogiri/blob/java/ext/java/nokogiri/NokogiriService.java" title="Github repo" >NokogiriService.java</a> file. NokogiriService implements <a href="http://github.com/jruby/jruby/blob/master/src/org/jruby/runtime/load/BasicLibraryService.java" title="Github repo" >BasicLibraryService</a>. This interface consists only of the method basicLoad which receives a Ruby object.</p>
<p>We will use this method to define classes and methods in the Ruby world. For defining a module, defineModule method is used with the name of the module. After that, modules and classes under that module can be defined easily by using the methods defineModuleUnder, which takes the name as parameter, and defineClassUnder, which takes the name and few parameters more. Let's dive into it.</p>
<p>defineClassUnder needs three arguments. The first one is the class' name. The second, is the parent class. If you have defined it previously, just passed it,  otherwise use RubyObject by calling the method getObject on the Ruby instance. The third parameter is an ObjectAllocator. ObjectAllocators returns intances of the classes in Java world. When instantiating Nokogiri::XML::Comment in Ruby world, JRuby will ask the ObjectAllocator for an instance of the Java class. It passes a Ruby object and the RubyClass being instantiated to the allocate method in the ObjectAllocator (more on RubyClass in following posts).</p>
<p>Finally, we will need to define some methods. Easiest way is by using the defineAnnotatedMethods. It takes a Java class as parameter. For knowing what this method does, you need to know a bit more about @JRubyMethod annotation (more on it in following post, have you realized the "Part I" in the title?). As you define methods, you may need to undefine some in a subclass. So easy! Use the undefineMethod method, which takes the name of the method as parameter (surprisingly, it undefines a method by redefining it!).</p>
<p>Next time, <a href="http://bit.ly/b5vZMp" >Implementing your first class</a>.</p>
<div class="evernoteSiteMemory"><a href="javascript:" onclick="Evernote.doClip({title: 'Writing your own JRuby extension. Part I: BasicLibraryService. on Serabe Reloaded',url: 'http://www.serabe.com/2010/01/08/writing-your-own-jruby-extension-part-i/',contentID: 'post-445',suggestTags: 'extensions,jruby,programming,Ruby',providerName: 'Serabe Reloaded',styling: 'text' });return false" class="evernoteSiteMemoryLink"><img src="http://static.evernote.com/article-clipper.png" class="evernoteSiteMemoryButton" title="Writing your own JRuby extension. Part I: BasicLibraryService." alt="article clipper Writing your own JRuby extension. Part I: BasicLibraryService." />
				</a>				<div class="evernoteSiteMemoryClear">&nbsp;</div>
</div><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.serabe.com%2F2010%2F01%2F08%2Fwriting-your-own-jruby-extension-part-i%2F&amp;title=Writing%20your%20own%20JRuby%20extension.%20Part%20I%3A%20BasicLibraryService." id="wpa2a_10"><img src="http://www.serabe.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="share save 171 16 Writing your own JRuby extension. Part I: BasicLibraryService."  title="Writing your own JRuby extension. Part I: BasicLibraryService." /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.serabe.com/2010/01/08/writing-your-own-jruby-extension-part-i/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>If you are (un)happy with Ruby 1.8.7</title>
		<link>http://www.serabe.com/2009/02/12/if-you-are-unhappy-with-ruby-187/</link>
		<comments>http://www.serabe.com/2009/02/12/if-you-are-unhappy-with-ruby-187/#comments</comments>
		<pubDate>Thu, 12 Feb 2009 00:55:33 +0000</pubDate>
		<dc:creator>Serabe</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[and i really want to show it]]></category>
		<category><![CDATA[i am not happy and i know it]]></category>
		<category><![CDATA[programming]]></category>

		<guid isPermaLink="false">http://www.serabe.com/?p=341</guid>
		<description><![CDATA[There are two interesting topics in the Ruby Forum being discussed right now. Both opened by George Brown (the guy behind Prawn). They are: If you are happy with the direction of Ruby 1.8.7+, respond If you are unhappy with the direction of Ruby 1.8.7+, respond I've read every single message because backwards compatibility in [...]]]></description>
			<content:encoded><![CDATA[<p>There are two interesting topics in the Ruby Forum being discussed right now. Both opened by George Brown (the guy behind Prawn). They are:</p>
<ul>
<li><a href="http://www.ruby-forum.com/topic/178355" >If you are happy with the direction of Ruby 1.8.7+, respond</a></li>
<li><a href="http://www.ruby-forum.com/topic/178354" >If you are unhappy with the direction of Ruby 1.8.7+, respond</a></li>
</ul>
<p>I've read every single message because backwards compatibility in Ruby 1.8.7 is something that I do not fully understand. It all started with this <a href="http://www.jaimeiniesta.com/2008/11/01/cuidado-con-ubuntu-810-viene-con-ruby-187/#comment-501" >comment</a> in Jaime's blog. There, Jaime wondered if Ubuntu did the right thing by updating Ruby to 1.8.7, even if that version breaks rails (in fact, it did). Well, in this case, my humble opinion was yes, Ubuntu did well by updating Ruby. But now, let's consider other things.</p>
<p>So far, I've seen two kind of complains against Ruby 1.8.7:</p>
<ul>
<li>Coding working in 1.8.6 that doesn't work in 1.8.7. I've been talking James Coglan about it, and the one of the errors was that his code relied on the order of the keys in a hash. But, there are other he hasn't been able to fix, and is something regarding regular expression. I am unhappy with this kind of "new features".
<li>
<li>Other people is complaining about working code in 1.8.7 that does not work in 1.8.6. I really understand them, because they program really cool gems and they have to test if they have used not-valid-1.8.6 code. I wouldn't care too much about but we must keep in mind that 1.8.7 is a minor release.</li>
</ul>
<p>Finally, I just want to say that, as many people has pointed out before me, it would be better to migrate to 1.9.1. Common! It has been already released! Anyway, that's not the point of the discussion. It is all about a minor release with too many changes (I'm not talking about bugfixes). Do I like the new things? Yes, I do (except some that I cannot really understand). Am I happy with Ruby 1.8.7? No, I'm not because it is suppose to be a minor version release and it is making too much noise.</p>
<div class="evernoteSiteMemory"><a href="javascript:" onclick="Evernote.doClip({title: 'If you are (un)happy with Ruby 1.8.7 on Serabe Reloaded',url: 'http://www.serabe.com/2009/02/12/if-you-are-unhappy-with-ruby-187/',contentID: 'post-341',suggestTags: 'and i really want to show it,i am not happy and i know it,programming,Ruby',providerName: 'Serabe Reloaded',styling: 'text' });return false" class="evernoteSiteMemoryLink"><img src="http://static.evernote.com/article-clipper.png" class="evernoteSiteMemoryButton" title="If you are (un)happy with Ruby 1.8.7" alt="article clipper If you are (un)happy with Ruby 1.8.7" />
				</a>				<div class="evernoteSiteMemoryClear">&nbsp;</div>
</div><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.serabe.com%2F2009%2F02%2F12%2Fif-you-are-unhappy-with-ruby-187%2F&amp;title=If%20you%20are%20%28un%29happy%20with%20Ruby%201.8.7" id="wpa2a_12"><img src="http://www.serabe.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="share save 171 16 If you are (un)happy with Ruby 1.8.7"  title="If you are (un)happy with Ruby 1.8.7" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.serabe.com/2009/02/12/if-you-are-unhappy-with-ruby-187/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Problem 3</title>
		<link>http://www.serabe.com/2008/10/12/problem-3/</link>
		<comments>http://www.serabe.com/2008/10/12/problem-3/#comments</comments>
		<pubDate>Sun, 12 Oct 2008 14:13:42 +0000</pubDate>
		<dc:creator>Serabe</dc:creator>
				<category><![CDATA[Anti-GOTAM]]></category>
		<category><![CDATA[Maths]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[RubyEuler]]></category>
		<category><![CDATA[euler project]]></category>
		<category><![CDATA[problem 3]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[RbEuler]]></category>

		<guid isPermaLink="false">http://www.serabe.com/?p=259</guid>
		<description><![CDATA[Wording: (Original) The prime factors of 13195 are 5, 7, 13 and 29. What is the largest prime factor of the number 600851475143 ? Solution: First the code: PLAIN TEXT RUBY: include Math def prime_factors&#40;num, factor=2&#41; &#160; return &#91;&#93;&#160; if num &#60;= 1 &#160; next_pf = &#40;factor..&#40;sqrt&#40;num&#41;.ceil&#41;&#41;.find&#40;lambda &#123;num&#125;&#41;&#123; &#124;x&#124; num%x == 0 &#125; &#160; return [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Wording:</strong> (<a href="http://projecteuler.net/index.php?section=problems&#038;id=3"  title="Project Euler">Original</a>) The prime factors of 13195 are 5, 7, 13 and 29.<br />
What is the largest prime factor of the number 600851475143 ?</p>
<p><strong>Solution:</strong><br />
First the code:</p>
<div class="igBar"><span id="lruby-4"><a href="#" onclick="javascript:showPlainTxt('ruby-4'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">RUBY:</span>
<div id="ruby-4">
<div class="ruby">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#9966CC; font-weight:bold;">include</span> Math</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#9966CC; font-weight:bold;">def</span> prime_factors<span style="color:#006600; font-weight:bold;">&#40;</span>num, factor=<span style="color:#006666;color:#800000;">2</span><span style="color:#006600; font-weight:bold;">&#41;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color:#0000FF; font-weight:bold;">return</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#93;</span>&nbsp; <span style="color:#9966CC; font-weight:bold;">if</span> num &lt;= <span style="color:#006666;color:#800000;">1</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; next_pf = <span style="color:#006600; font-weight:bold;">&#40;</span>factor..<span style="color:#006600; font-weight:bold;">&#40;</span>sqrt<span style="color:#006600; font-weight:bold;">&#40;</span>num<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">ceil</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">find</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0066; font-weight:bold;">lambda</span> <span style="color:#006600; font-weight:bold;">&#123;</span>num<span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#123;</span> |x| num%x == <span style="color:#006666;color:#800000;">0</span> <span style="color:#006600; font-weight:bold;">&#125;</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color:#0000FF; font-weight:bold;">return</span> <span style="color:#006600; font-weight:bold;">&#91;</span>next_pf<span style="color:#006600; font-weight:bold;">&#93;</span> + prime_factors<span style="color:#006600; font-weight:bold;">&#40;</span>num/next_pf, next_pf<span style="color:#006600; font-weight:bold;">&#41;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#9966CC; font-weight:bold;">end</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#CC0066; font-weight:bold;">puts</span> prime_factors<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;color:#800000;">600851475143</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">max</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>The code is a direct port from the one in PyEuler. It is based mainly in the idea that the first factor of a number is always prime.</p>
<p>Line 3 breaks recursion and line 4 works out the next prime factor (actually, it finds the smallest factor). For doing this, it uses find method. If no element match the criteria, then it returns the number (that is what the lambda block is for).</p>
<p>Finally, line 5 merges the results and line 8 print the result.</p>
<p>This time just one code is showed.</p>
<div class="evernoteSiteMemory"><a href="javascript:" onclick="Evernote.doClip({title: 'Problem 3 on Serabe Reloaded',url: 'http://www.serabe.com/2008/10/12/problem-3/',contentID: 'post-259',suggestTags: 'euler project,problem 3,programming,RbEuler,Ruby',providerName: 'Serabe Reloaded',styling: 'text' });return false" class="evernoteSiteMemoryLink"><img src="http://static.evernote.com/article-clipper.png" class="evernoteSiteMemoryButton" title="Problem 3" alt="article clipper Problem 3" />
				</a>				<div class="evernoteSiteMemoryClear">&nbsp;</div>
</div><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.serabe.com%2F2008%2F10%2F12%2Fproblem-3%2F&amp;title=Problem%203" id="wpa2a_14"><img src="http://www.serabe.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="share save 171 16 Problem 3"  title="Problem 3" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.serabe.com/2008/10/12/problem-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RMagick4J 0.3.6</title>
		<link>http://www.serabe.com/2008/08/16/rmagick4j-036/</link>
		<comments>http://www.serabe.com/2008/08/16/rmagick4j-036/#comments</comments>
		<pubDate>Fri, 15 Aug 2008 23:03:38 +0000</pubDate>
		<dc:creator>Serabe</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[jruby]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[rmagick]]></category>
		<category><![CDATA[rmagick4j]]></category>

		<guid isPermaLink="false">http://www.serabe.com/?p=228</guid>
		<description><![CDATA[I am glad to announce a new version of rmagick4j. RMagick4J aims to implement the ImageMagick funcionality and the C portions of RMagick for make it works in JRuby. Current stable version: 0.3.6 Project URL: http://code.google.com/p/rmagick4j/ Installation: gem install rmagick4j Google Summer of Code project should be thanked for making this new release possible. In [...]]]></description>
			<content:encoded><![CDATA[<p>I am glad to announce a new version of rmagick4j.</p>
<p>RMagick4J aims to implement the ImageMagick funcionality and the C<br />
portions of RMagick for make it works in JRuby.</p>
<p>Current stable version: 0.3.6<br />
Project URL: <a rel="nofollow" href="http://code.google.com/p/rmagick4j/" >http://code.google.com/p/rmagick4j/</a><br />
Installation: <code>gem install rmagick4j</code></p>
<p>Google Summer of Code project should be thanked for making this new<br />
release possible.</p>
<p>In release 0.3.6 you can find the next improvements:</p>
<ul>
<li>More Draw primitives (clip-path [creatin a clip-path and using a<br />
clip-path], fill-rule, rotate, scale [reimplemented], skewX, slewY,<br />
stroke-linecap, stroke-linejoin, stroke-miterlimit, translate).</li>
<li>Solve a bug with transparent stroke and line primitive.</li>
<li> Added the following Draw instance methods:</li>
<ul>
<li>annotate</li>
<li>get_multiline_type_metrics</li>
</ul>
<li>Solved a bug that caused the background become black while resizing<br />
images with alpha channel.</li>
</ul>
<p>Please try out your applications with rmagick4j and help us provide<br />
feedback.  It is our goal to make a fully-compatible implementation of<br />
RMagick4j in JRuby.</p>
<div class="evernoteSiteMemory"><a href="javascript:" onclick="Evernote.doClip({title: 'RMagick4J 0.3.6 on Serabe Reloaded',url: 'http://www.serabe.com/2008/08/16/rmagick4j-036/',contentID: 'post-228',suggestTags: 'jruby,Programming,programming,rmagick,rmagick4j,Ruby',providerName: 'Serabe Reloaded',styling: 'text' });return false" class="evernoteSiteMemoryLink"><img src="http://static.evernote.com/article-clipper.png" class="evernoteSiteMemoryButton" title="RMagick4J 0.3.6" alt="article clipper RMagick4J 0.3.6" />
				</a>				<div class="evernoteSiteMemoryClear">&nbsp;</div>
</div><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.serabe.com%2F2008%2F08%2F16%2Frmagick4j-036%2F&amp;title=RMagick4J%200.3.6" id="wpa2a_16"><img src="http://www.serabe.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="share save 171 16 RMagick4J 0.3.6"  title="RMagick4J 0.3.6" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.serabe.com/2008/08/16/rmagick4j-036/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sustituyendo a las animadoras con Ruby en Mac.</title>
		<link>http://www.serabe.com/2008/08/12/sustituyendo-a-las-animadoras-con-ruby-en-mac/</link>
		<comments>http://www.serabe.com/2008/08/12/sustituyendo-a-las-animadoras-con-ruby-en-mac/#comments</comments>
		<pubDate>Mon, 11 Aug 2008 23:09:32 +0000</pubDate>
		<dc:creator>Serabe</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[jruby]]></category>

		<guid isPermaLink="false">http://www.serabe.com/?p=226</guid>
		<description><![CDATA[El tÃ­tulo del post puede sonar raro, pero lo que voy a mostrar hoy es cÃ³mo conseguir tu propia animadora en Mac con Ruby. Lo que haremos serÃ¡ hacer que nuestro ordenador, con una orden como: ruby cheerleader.rb Serabe Nos muestre por pantalla: Dame una S Dame una E Dame una R Dame una A [...]]]></description>
			<content:encoded><![CDATA[<p>El tÃ­tulo del post puede sonar raro, pero lo que voy a mostrar hoy es cÃ³mo conseguir tu propia animadora en Mac con Ruby. Lo que haremos serÃ¡ hacer que nuestro ordenador, con una orden como:</p>
<p><code><br />
ruby cheerleader.rb Serabe<br />
</code></p>
<p>Nos muestre por pantalla:</p>
<p><code><br />
Dame una S<br />
Dame una E<br />
Dame una R<br />
Dame una A<br />
Dame una B<br />
Dame una E<br />
SERABE!!!<br />
</code></p>
<p>AdemÃ¡s, utilizando el comando <code>say</code> de Mac, nos lo dirÃ¡ (si querÃ©is que lo grite, subid el volumen al mÃ¡ximo).</p>
<p>Empecemos con el cÃ³digo:</p>
<div class="igBar"><span id="lruby-8"><a href="#" onclick="javascript:showPlainTxt('ruby-8'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">RUBY:</span>
<div id="ruby-8">
<div class="ruby">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#CC0066; font-weight:bold;">string</span> =&nbsp; ARGV.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span>' '<span style="color:#006600; font-weight:bold;">&#41;</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>AquÃ­ simplemente recogemos los parÃ¡metros pasados por consola y los concatenamos con un espacio entre medias. Ahora la parte interesante:</p>
<div class="igBar"><span id="lruby-9"><a href="#" onclick="javascript:showPlainTxt('ruby-9'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">RUBY:</span>
<div id="ruby-9">
<div class="ruby">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#CC0066; font-weight:bold;">string</span>.<span style="color:#9900CC;">each_byte</span> <span style="color:#9966CC; font-weight:bold;">do</span> |b|</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color:#9966CC; font-weight:bold;">if</span> /<span style="color:#006600; font-weight:bold;">&#91;</span>a-zA-Z<span style="color:#006600; font-weight:bold;">&#93;</span>/ =~ b.<span style="color:#9900CC;">chr</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; shout = 'Dame una '+b.<span style="color:#9900CC;">chr</span>.<span style="color:#9900CC;">upcase</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color:#CC0066; font-weight:bold;">puts</span> shout</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color:#996600;">`say #{shout}`</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color:#9966CC; font-weight:bold;">end</span>&nbsp; </div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#9966CC; font-weight:bold;">end</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Para cada letra, una vez comprobado que es una letra y no un espacio, construimos un grito ('Dame una S'), lo imprimimos por pantalla y hacemos que el comando <code>say</code> lo diga.</p>
<p>Finalmente, con un</p>
<div class="igBar"><span id="lruby-10"><a href="#" onclick="javascript:showPlainTxt('ruby-10'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">RUBY:</span>
<div id="ruby-10">
<div class="ruby">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#CC0066; font-weight:bold;">string</span>.<span style="color:#9900CC;">upcase</span> + '!!!'</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#996600;">`say #{string}`</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Imprimimos la Ãºltima frase.</p>
<p>Ya habÃ©is visto cÃ³mo crearos vuestra propia cheerleader. En prÃ³ximos episodios veremos cÃ³mo aÃ±adirle autoregeneraciÃ³n como <a rel="nofollow" href="http://es.wikipedia.org/wiki/Claire_Bennet" title="Wikipedia" >Claire</a>.</p>
<div class="evernoteSiteMemory"><a href="javascript:" onclick="Evernote.doClip({title: 'Sustituyendo a las animadoras con Ruby en Mac. on Serabe Reloaded',url: 'http://www.serabe.com/2008/08/12/sustituyendo-a-las-animadoras-con-ruby-en-mac/',contentID: 'post-226',suggestTags: 'jruby,Programming,Ruby',providerName: 'Serabe Reloaded',styling: 'text' });return false" class="evernoteSiteMemoryLink"><img src="http://static.evernote.com/article-clipper.png" class="evernoteSiteMemoryButton" title="Sustituyendo a las animadoras con Ruby en Mac." alt="article clipper Sustituyendo a las animadoras con Ruby en Mac." />
				</a>				<div class="evernoteSiteMemoryClear">&nbsp;</div>
</div><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.serabe.com%2F2008%2F08%2F12%2Fsustituyendo-a-las-animadoras-con-ruby-en-mac%2F&amp;title=Sustituyendo%20a%20las%20animadoras%20con%20Ruby%20en%20Mac." id="wpa2a_18"><img src="http://www.serabe.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="share save 171 16 Sustituyendo a las animadoras con Ruby en Mac."  title="Sustituyendo a las animadoras con Ruby en Mac." /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.serabe.com/2008/08/12/sustituyendo-a-las-animadoras-con-ruby-en-mac/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RMagick: Dibujar con patrones</title>
		<link>http://www.serabe.com/2008/07/22/rmagick-dibujar-con-patrones/</link>
		<comments>http://www.serabe.com/2008/07/22/rmagick-dibujar-con-patrones/#comments</comments>
		<pubDate>Tue, 22 Jul 2008 22:16:30 +0000</pubDate>
		<dc:creator>Serabe</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[rmagick]]></category>

		<guid isPermaLink="false">http://www.serabe.com/?p=218</guid>
		<description><![CDATA[Una interesante cualidad de la clase Draw de RMagick es la posibilidad de definir patrones a travÃ©s del mÃ©todo pattern. En primer lugar, lo bÃ¡sico: PLAIN TEXT RUBY: require 'rubygems' require 'RMagick' &#160; include Magick Ahora definamos el patrÃ³n. Para ello, necesitamos cinco parÃ¡metros, el nombre, dos nÃºmeros que recomiendo ponerlos a cero (despuÃ©s de [...]]]></description>
			<content:encoded><![CDATA[<p>Una interesante cualidad de la clase Draw de RMagick es la posibilidad de definir patrones a travÃ©s del mÃ©todo <a href="http://www.imagemagick.org/RMagick/doc/draw.html#pattern" >pattern</a>.</p>
<p>En primer lugar, lo bÃ¡sico:</p>
<div class="igBar"><span id="lruby-14"><a href="#" onclick="javascript:showPlainTxt('ruby-14'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">RUBY:</span>
<div id="ruby-14">
<div class="ruby">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#CC0066; font-weight:bold;">require</span> 'rubygems'</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#CC0066; font-weight:bold;">require</span> 'RMagick'</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#9966CC; font-weight:bold;">include</span> Magick </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Ahora definamos el patrÃ³n. Para ello, necesitamos cinco parÃ¡metros, el nombre, dos nÃºmeros que recomiendo ponerlos a cero (despuÃ©s de unas cuantas pruebas, no he notado diferencias notables) y despuÃ©s las dimensiones del patrÃ³n.</p>
<div class="igBar"><span id="lruby-15"><a href="#" onclick="javascript:showPlainTxt('ruby-15'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">RUBY:</span>
<div id="ruby-15">
<div class="ruby">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">draw = Draw.<span style="color:#9900CC;">new</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">draw.<span style="color:#9900CC;">pattern</span><span style="color:#006600; font-weight:bold;">&#40;</span>'circles', <span style="color:#006666;color:#800000;">0</span>, <span style="color:#006666;color:#800000;">0</span>, <span style="color:#006666;color:#800000;">10</span>, <span style="color:#006666;color:#800000;">10</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; draw.<span style="color:#9900CC;">stroke</span> 'none'</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; draw.<span style="color:#9900CC;">fill</span> 'red'</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; draw.<span style="color:#9900CC;">rectangle</span> <span style="color:#006666;color:#800000;">0</span>, <span style="color:#006666;color:#800000;">0</span>, <span style="color:#006666;color:#800000;">10</span>, <span style="color:#006666;color:#800000;">10</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; draw.<span style="color:#9900CC;">stroke</span> 'LightGreen'</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; draw.<span style="color:#9900CC;">fill</span> 'blue'</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; draw.<span style="color:#9900CC;">circle</span> <span style="color:#006666;color:#800000;">5</span>, <span style="color:#006666;color:#800000;">5</span>, <span style="color:#006666;color:#800000;">5</span>, <span style="color:#006666;color:#800000;">0</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#9966CC; font-weight:bold;">end</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>Ya, por Ãºltimo, dibujamos un cuadrado y lo plasmamos en una imagen de 300x300.</p>
<div class="igBar"><span id="lruby-16"><a href="#" onclick="javascript:showPlainTxt('ruby-16'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">RUBY:</span>
<div id="ruby-16">
<div class="ruby">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">draw.<span style="color:#9900CC;">stroke</span> 'circles'</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">draw.<span style="color:#9900CC;">stroke_width</span> <span style="color:#006666;color:#800000;">25</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">draw.<span style="color:#9900CC;">fill</span> 'none'</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">draw.<span style="color:#9900CC;">polygon</span> <span style="color:#006666;color:#800000;">150</span>,<span style="color:#006666;color:#800000;">0</span>, <span style="color:#006666;color:#800000;">300</span>,<span style="color:#006666;color:#800000;">150</span>, <span style="color:#006666;color:#800000;">150</span>,<span style="color:#006666;color:#800000;">300</span>, <span style="color:#006666;color:#800000;">0</span>,<span style="color:#006666;color:#800000;">150</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">img = Image.<span style="color:#9900CC;">new</span> <span style="color:#006666;color:#800000;">300</span>, <span style="color:#006666;color:#800000;">300</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">draw.<span style="color:#9900CC;">draw</span> img</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">img.<span style="color:#9900CC;">write</span> 'pattern.<span style="color:#9900CC;">jpg</span>' </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>ObteniÃ©ndose el siguiente resultado:</p>
<div id="attachment_221" class="wp-caption alignnone" style="width: 310px"><a href="http://www.serabe.com/wp-content/uploads/2008/07/pattern.jpg" ><img src="http://www.serabe.com/wp-content/uploads/2008/07/pattern.jpg" alt="pattern RMagick: Dibujar con patrones" title="Dibujando con patrÃ³n." width="300" height="300" class="size-medium wp-image-221" /></a><p class="wp-caption-text">Dibujo con patrÃ³n como brocha</p></div>
<div class="evernoteSiteMemory"><a href="javascript:" onclick="Evernote.doClip({title: 'RMagick: Dibujar con patrones on Serabe Reloaded',url: 'http://www.serabe.com/2008/07/22/rmagick-dibujar-con-patrones/',contentID: 'post-218',suggestTags: 'Programming,programming,rmagick,Ruby',providerName: 'Serabe Reloaded',styling: 'text' });return false" class="evernoteSiteMemoryLink"><img src="http://static.evernote.com/article-clipper.png" class="evernoteSiteMemoryButton" title="RMagick: Dibujar con patrones" alt="article clipper RMagick: Dibujar con patrones" />
				</a>				<div class="evernoteSiteMemoryClear">&nbsp;</div>
</div><p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fwww.serabe.com%2F2008%2F07%2F22%2Frmagick-dibujar-con-patrones%2F&amp;title=RMagick%3A%20Dibujar%20con%20patrones" id="wpa2a_20"><img src="http://www.serabe.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="share save 171 16 RMagick: Dibujar con patrones"  title="RMagick: Dibujar con patrones" /></a></p>]]></content:encoded>
			<wfw:commentRss>http://www.serabe.com/2008/07/22/rmagick-dibujar-con-patrones/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

