<?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; Java</title>
	<atom:link href="http://blogg.athega.se/tagg/java/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>Låt inte Tomcat jobba i onödan</title>
		<link>http://blogg.athega.se/2009/04/24/lat-inte-tomcat-jobba-i-onodan/</link>
		<comments>http://blogg.athega.se/2009/04/24/lat-inte-tomcat-jobba-i-onodan/#comments</comments>
		<pubDate>Fri, 24 Apr 2009 12:31:07 +0000</pubDate>
		<dc:creator>Christian Lizell</dc:creator>
				<category><![CDATA[Kod]]></category>
		<category><![CDATA[Prestanda]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Servlets]]></category>
		<category><![CDATA[Tomcat]]></category>

		<guid isPermaLink="false">http://blogg.athega.se/?p=150</guid>
		<description><![CDATA[Ett vanligt upplägg för en lastad sajt med någorlunda statiskt innehåll ser ut enligt nedan: I korthet innebär det att den största delen av trafiken hanteras av enkla webbcachear som leverar sidor till slutanvändarna. Med ett visst intervall efterfrågar cachearna frontarna efter nytt innehåll. Frontarna kan exempelvis köra en eller flera Tomcat-instanser som genererar innehållet. [...]]]></description>
			<content:encoded><![CDATA[<p>Ett vanligt upplägg för en lastad sajt med någorlunda statiskt innehåll ser ut enligt nedan:</p>
<div id="attachment_151" class="wp-caption aligncenter" style="width: 650px"><img class="size-full wp-image-151" title="Internet-Cache-Front" src="http://blogg.athega.se/wp-content/uploads/2009/04/img_8759.jpg" alt="Upplägg, lastad sajt" width="640" height="440" /><p class="wp-caption-text">Upplägg, lastad sajt</p></div>
<p>I korthet innebär det att den största delen av trafiken hanteras av enkla webbcachear som leverar sidor till slutanvändarna. Med ett visst intervall efterfrågar cachearna frontarna efter nytt innehåll. Frontarna kan exempelvis köra en eller flera Tomcat-instanser som genererar innehållet. På detta sätt kan även riktigt stora siter klara sig på ett tiotal maskiner.</p>
<p>För alla JSP-sidor som Tomcat-frontarna genererar åt cachearna skapas nu en session, precis som <a title="JSR 154" href="http://jcp.org/en/jsr/detail?id=154">Servlet-standarden</a> föreskriver. Det är helt i sin ordning, fast helt onödigt i det här fallet. Det genererade innehållet levereras inte direkt till slutanvändaren, utan till cachen. Kan man få servlet-motorn att inte skapa sessioner i onödan och på så sätt spara sina dyra resurser?</p>
<p>Ja, ett sätt är att överst i sin JSP-sida helt enkelt utbrista:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;">&lt;%@page <span style="color: #000066;">session</span>=<span style="color: #ff0000;">&quot;false&quot;</span>%<span style="color: #000000; font-weight: bold;">&gt;</span></span></pre></div></div>

<p>Dock är det kanske inte att föredra i ett litet större projekt med hundratals JSP-sidor. Det man letar efter är ett sätt att slå av det centralt för alla JSP-sidor. Min första instikt var att konfiguerar Jasper, som kompilerar JSP-sidorna att inte skapa sessioner om man inte explicit bad om det. Någon sådan parameter hittade jag tyvärr inte. Personer som har liknande frågor på nätet får istället frågan; &#8221;Varför vill du slå av sessioner? De är ju en del av standarden!&#8221;</p>
<p>Mitt nästa spår var att automatiskt försöka inkludera ovanstående direktiv för varje genererad sida. Från och med JSP 2.0 (som inte direkt kom ut igår) går det att få till ganska enkelt med något som kallas för implicit includes.</p>
<p>Börja med att lägga till ett jsp-config-direktiv i din web.xml:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">&lt;!-- Disable the use of sessions --&gt;</span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;jsp-config<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;jsp-property-group<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;url-pattern<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>*.jsp<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/url-pattern<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;include-prelude<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>/WEB-INF/jspf/disableSession.jspf<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/include-prelude<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/jsp-property-group<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/jsp-config<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Detta matchar alla JSP-filer (med filändelsen .jsp) och inkluderar innehållet av filen disableSession.jspf precis som om du skulle ha skrivit</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;">&lt;%@include <span style="color: #000066;">file</span>=<span style="color: #ff0000;">&quot;/WEB-INF/jspf/disableSession.jspf&quot;</span>%<span style="color: #000000; font-weight: bold;">&gt;</span></span></pre></div></div>

<p>högst upp i varenda JSP-fil.</p>
<p>Notera att filen som inkluderas är av typen .jspf, ett JSP-fragment. Detta är nödvändigt och säkerställer bland annat att du inte råkar in i några oändliga inkluderingsloopar. Att filen ligger i mappen /WEB-INF/jspf är rekommenderat och förhindrar även direkt access för en slutanvändare.</p>
<p>Testa! Tomcat kommer att kasta fel i loggarna så fort du försöker skapa en session, men om du har det som jag är det precis så du vill ha det!</p>
]]></content:encoded>
			<wfw:commentRss>http://blogg.athega.se/2009/04/24/lat-inte-tomcat-jobba-i-onodan/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

