<?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>Blogg - Athega AB &#187; JRuby</title>
	<atom:link href="http://blogg.athega.se/tagg/jruby/feed/" rel="self" type="application/rss+xml" />
	<link>http://blogg.athega.se</link>
	<description>...</description>
	<lastBuildDate>Thu, 18 Nov 2010 22:17:36 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Hpricot och Sinatra på Google App Engine</title>
		<link>http://blogg.athega.se/2009/09/01/hpricot-och-sinatra-pa-google-app-engine/</link>
		<comments>http://blogg.athega.se/2009/09/01/hpricot-och-sinatra-pa-google-app-engine/#comments</comments>
		<pubDate>Tue, 01 Sep 2009 14:50:52 +0000</pubDate>
		<dc:creator>Mikael Forsberg</dc:creator>
				<category><![CDATA[Kod]]></category>
		<category><![CDATA[Google App Engine]]></category>
		<category><![CDATA[Hpricot]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JRuby]]></category>
		<category><![CDATA[Sinatra]]></category>

		<guid isPermaLink="false">http://blogg.athega.se/?p=420</guid>
		<description><![CDATA[Hpricot är en HTML parser som är skriven i Ruby. Jag gillar den eftersom den är snabb och extremt enkel att jobba med. Den är perfekt om man vill extrahera innehåll från en webbsida som inte tillhandahåller ett färdigt api. Det finns många bra tutorials på nätet. Ett enkelt exempel För att till exempel hitta [...]]]></description>
			<content:encoded><![CDATA[<p><a title="Hpricot" href="http://github.com/whymirror/hpricot/tree/master">Hpricot</a> är en HTML parser som är skriven i Ruby. Jag gillar den eftersom den är snabb och extremt enkel att jobba med. Den är perfekt om man vill extrahera innehåll från en webbsida som inte tillhandahåller ett färdigt api. Det finns <a href="http://www.google.se/search?q=hpricot+tutorial&amp;ie=utf-8&amp;oe=utf-8&amp;aq=t&amp;rls=com.ubuntu:en-US:official&amp;client=firefox-a">många</a> <a href="http://soledadpenades.com/2007/06/15/extracting-data-with-hpricot/">bra</a> <a title="Installera Hpricot för Jruby" href="http://stackoverflow.com/questions/726412/installing-hpricot-for-jruby">tutorials</a> på nätet.</p>
<h2>Ett enkelt exempel</h2>
<p>För att till exempel hitta alla nyheter på Athegas första sida kan man göra så här.</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'rubygems'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'open-uri'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'hpricot'</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># Läs in Athegas första sida</span>
doc = Hpricot<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0066; font-weight:bold;">open</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;http://athega.se&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#008000; font-style:italic;"># Xpath uttryck för att hitta nyheterna</span>
result = doc<span style="color:#006600; font-weight:bold;">/</span><span style="color:#996600;">&quot;//*[@id='helplist']/li/a&quot;</span></pre></div></div>

<h2>Hpricot på Google App Engine</h2>
<p>Jag ville använda Hpricot tillsammans med <a href="http://jruby.org/">Jruby</a> och <a href="http://www.sinatrarb.com/">Sinatra</a> (som Peter har <a href="http://blogg.athega.se/2009/03/08/sinatra-och-google-spreadsheet/">skrivit</a> mer om) på <a href="http://code.google.com/appengine/">Google App Engine</a>. Jag följde den här <a href="http://blog.bigcurl.de/2009/04/running-sinatra-apps-on-google.html">guiden</a> för att komma igång med min Sinatra applikation på App Engine  och det gick smärtfritt. Tyvärr så small det direkt när jag försökte använda mig av Hpricot. Ett AccessControlException kastades.</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">javax.<span style="color: #006633;">servlet</span>.<span style="color: #006633;">ServletContext</span> log<span style="color: #339933;">:</span> Application <span style="color: #003399;">Error</span>
java.<span style="color: #006633;">security</span>.<span style="color: #003399;">AccessControlException</span><span style="color: #339933;">:</span> access denied <span style="color: #009900;">&#40;</span>java.<span style="color: #006633;">net</span>.<span style="color: #003399;">SocketPermission</span> athega.<span style="color: #006633;">se</span> resolve<span style="color: #009900;">&#41;</span>
at java.<span style="color: #006633;">security</span>.<span style="color: #003399;">AccessControlContext</span>.<span style="color: #006633;">checkPermission</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">AccessControlContext</span>.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">323</span><span style="color: #009900;">&#41;</span>
at java.<span style="color: #006633;">security</span>.<span style="color: #003399;">AccessController</span>.<span style="color: #006633;">checkPermission</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">AccessController</span>.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">546</span><span style="color: #009900;">&#41;</span>
at java.<span style="color: #006633;">lang</span>.<span style="color: #003399;">SecurityManager</span>.<span style="color: #006633;">checkPermission</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">SecurityManager</span>.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">532</span><span style="color: #009900;">&#41;</span>
at com.<span style="color: #006633;">google</span>.<span style="color: #006633;">appengine</span>.<span style="color: #006633;">tools</span>.<span style="color: #006633;">development</span>.<span style="color: #006633;">DevAppServerFactory</span>$CustomSecurityManager.<span style="color: #006633;">checkPermission</span><span style="color: #009900;">&#40;</span>DevAppServerFactory.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">128</span><span style="color: #009900;">&#41;</span>
at java.<span style="color: #006633;">lang</span>.<span style="color: #003399;">SecurityManager</span>.<span style="color: #006633;">checkConnect</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">SecurityManager</span>.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">1031</span><span style="color: #009900;">&#41;</span>
at java.<span style="color: #006633;">net</span>.<span style="color: #003399;">InetAddress</span>.<span style="color: #006633;">getAllByName0</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">InetAddress</span>.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">1145</span><span style="color: #009900;">&#41;</span>
at java.<span style="color: #006633;">net</span>.<span style="color: #003399;">InetAddress</span>.<span style="color: #006633;">getAllByName</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">InetAddress</span>.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">1083</span><span style="color: #009900;">&#41;</span>
at java.<span style="color: #006633;">net</span>.<span style="color: #003399;">InetAddress</span>.<span style="color: #006633;">getAllByName</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">InetAddress</span>.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">1019</span><span style="color: #009900;">&#41;</span>
at java.<span style="color: #006633;">net</span>.<span style="color: #003399;">InetAddress</span>.<span style="color: #006633;">getByName</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">InetAddress</span>.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">969</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p>Vilket tyder på att någon javaklass som inte är med på Googles <a href="http://code.google.com/appengine/docs/java/jrewhitelist.html">lista</a> över tillåtna klasser användes.  När jag studerade stacktracet lite närmare märkte jag att det var open-uri som ville använda javaklassen <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/net/InetAddress.html">InetAddress</a> som inte finns med i listan på godkända klasser.</p>
<p>Eftersom man med hjälp av Jruby kan &#8221;scripta&#8221; java var det relativt enkelt att byta ut open-uri mot godkända javaklasser istället  och sedan <a href="http://kenai.com/projects/jruby/pages/CallingJavaFromJRuby#Convert_a_Java_InputStream_to_a_ruby_IO_object">automagiskt</a> göra om java InputStream objektet till ett ruby io objekt som Hpricot kan ta i sin konstruktor. Lösningen blev enligt nedan.</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'rubygems'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'hpricot'</span>
<span style="color:#008000; font-style:italic;"># Importerar java istället för open-uri</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'java'</span>
<span style="color:#008000; font-style:italic;"># Skapa en instans av java-klassen URL</span>
url = java.<span style="color:#9900CC;">net</span>.<span style="color:#9900CC;">URL</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;http://athega.se&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#008000; font-style:italic;"># Kasta om java inputstreamen till ett ruby io objekt</span>
ruby_io = org.<span style="color:#9900CC;">jruby</span>.<span style="color:#9900CC;">RubyIO</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>JRuby.<span style="color:#9900CC;">runtime</span>, url.<span style="color:#9900CC;">openStream</span><span style="color:#006600; font-weight:bold;">&#41;</span>
io = Java.<span style="color:#9900CC;">java_to_ruby</span><span style="color:#006600; font-weight:bold;">&#40;</span>ruby_io.<span style="color:#9900CC;">java_object</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#008000; font-style:italic;"># Sen är det bara att använda Hpricot som vanligt</span>
doc = Hpricot<span style="color:#006600; font-weight:bold;">&#40;</span>io<span style="color:#006600; font-weight:bold;">&#41;</span>
result = doc<span style="color:#006600; font-weight:bold;">/</span><span style="color:#996600;">&quot;//*[@id='helplist']/li/a&quot;</span></pre></div></div>

<p>Sedan transformerade jag resultatet till JSON och la upp applikationen här <a href="http://athega-news-api.appspot.com">http://athega-news-api.appspot.com</a> (OBS, applikationen returnerar JSON direkt så jag rekommenderar <a href="https://addons.mozilla.org/en-US/firefox/addon/10869">JSONView</a> pluginet till Firefox om man vill titta på datan)</p>
<p>Om någon vill titta närmare på <a href="http://github.com/ragulin/hpricot-and-sinatra-on-google-app-engine/tree/master">koden</a> ligger den på Github men tänk på se till så att ni har tillstånd av rättighetsinnehavaren innan ni plockar data från webben.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogg.athega.se/2009/09/01/hpricot-och-sinatra-pa-google-app-engine/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RailsConf: Tutorials</title>
		<link>http://blogg.athega.se/2009/05/05/railsconf-tutorials/</link>
		<comments>http://blogg.athega.se/2009/05/05/railsconf-tutorials/#comments</comments>
		<pubDate>Tue, 05 May 2009 01:31:13 +0000</pubDate>
		<dc:creator>Peter Hellberg</dc:creator>
				<category><![CDATA[Konferens]]></category>
		<category><![CDATA[Webbutveckling]]></category>
		<category><![CDATA[JRuby]]></category>
		<category><![CDATA[RailsConf]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Sinatra]]></category>
		<category><![CDATA[Tutorials]]></category>

		<guid isPermaLink="false">http://blogg.athega.se/?p=171</guid>
		<description><![CDATA[JRuby on Rails &#8211; Nick Sieger (SUN Microsystems) Presentationen: jruby-railsconf-2009.pdf Huvudpunkterna på föreläsningen var: Installation Utveckling Prestandatestning Interaktion med Java Testning Jag hade gärna sett att han gått in lite mer på djupet om skillnaderna mellan JRuby och MRI, Olika sätt att deploya (Han visade GlassFish, med tveksamt resultat) Ett verktyg jag helt klart kommer [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blogg.athega.se/wp-content/uploads/2009/05/ruby_dinette.jpg" alt="ruby_dinette" title="ruby_dinette" width="750" height="280" class="alignnone size-full wp-image-172" /></p>
<h2 id="jruby_on_rails_nick_sieger_sun_microsystems">JRuby on Rails &#8211; Nick Sieger (<a href="http://sun.com">SUN Microsystems</a>)</h2>
<p>Presentationen: <a href="http://blog.nicksieger.com/jruby-railsconf-2009.pdf">jruby-railsconf-2009.pdf</a></p>
<p>Huvudpunkterna på föreläsningen var:</p>
<ul>
<li>Installation</li>
<li>Utveckling</li>
<li>Prestandatestning</li>
<li>Interaktion med Java</li>
<li>Testning</li>
</ul>
<p>Jag hade gärna sett att han gått in lite mer på djupet om skillnaderna<br />
mellan JRuby och MRI, Olika sätt att deploya (Han visade GlassFish,<br />
med tveksamt resultat)</p>
<p>Ett verktyg jag helt klart kommer att använda mig av i framtiden är <a href="https://visualvm.dev.java.net/">VisualVM</a>.</p>
<h2 id="a_hat_full_of_tricks_with_sinatra_blake_mizerany_heroku">A Hat Full of Tricks with Sinatra &#8211; Blake Mizerany (<a href="http://heroku.com">Heroku</a>)</h2>
<p>Det första som händer är att <a href="http://chneukirchen.org/">Christian Neukirchen</a>,<br />
huvudutvecklaren av <a href="http://rack.rubyforge.org/">Rack</a> sätter sig brevid mig.</p>
<p>Första fjärdedelen av Blakes föreläsning handlar inte om<br />
<a href="http://www.sinatrarb.com/">Sinatra</a> över huvud taget utan om just <a href="http://rack.rubyforge.org/">Rack</a>.</p>
<h3 id="minimal_rack_applikation">Minimal Rack-applikation</h3>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">run <span style="color:#CC0066; font-weight:bold;">lambda</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">|</span>env<span style="color:#006600; font-weight:bold;">|</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">200</span>, <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#996600;">'Content-Type'</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'text/html'</span><span style="color:#006600; font-weight:bold;">&#125;</span>, <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'Hello'</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">&#125;</span></pre></div></div>

<h3 id="minimal_sinatra_applikation">Minimal Sinatra-applikation</h3>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'sinatra'</span>
&nbsp;
get <span style="color:#996600;">'/'</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  <span style="color:#996600;">'Hello'</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<h3 id="rekomenderade_bcker">Rekomenderade böcker</h3>
<ul>
<li><a href="http://www.amazon.com/exec/obidos/ASIN/0135974445/objectmentorinc">Agile Software Development, Principles, Patterns, and Practices</a></li>
</ul>
<h3 id="exempelkod">Exempelkod</h3>
<ul>
<li>Modulen <a href="http://github.com/bmizerany/sinatra-captcha/tree/master">sinatra-captcha</a></li>
</ul>
<h2 id="links">Relaterade länkar</h2>
<ul>
<li><a href="http://blogs.sun.com/arungupta/entry/rails_conf_2009_day_1">http://blogs.sun.com/arungupta/entry/rails_conf_2009_day_1</a></li>
</ul>
<p><img src="http://blogg.athega.se/wp-content/uploads/2009/05/gae_hackathon.png" alt="gae_hackathon" title="gae_hackathon" width="750" height="818" class="alignnone size-full wp-image-176" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blogg.athega.se/2009/05/05/railsconf-tutorials/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

