Arkiv för kategori ‘Webbutveckling’

Lär dig leva utan ancestorView

Under våren har jag jobbat med att trimma en webbapplikation som levererar nätupplagan av en av Sveriges större tidningar. CMS-verktyget som används är Escenic i version 4.x och det kommer med en rad egna JSP-tagar. En av dom ska man dock akta sig för – <section:ancestorView>. Den är faktiskt inte så svår att leva utan heller. I den här artikeln visar jag hur.

Responstid före och efter jag bytt ut <section:ancerstorView>

Responstid före och efter jag bytt ut ancerstorview-taggen

Vad är ancestorView?

ancestorView används för att skapa en hierarkisk vy av sektioner utgående från den sektion du anger. Inget speciellt avancerat eller konstigt. Det borde inte heller vara jobbigt för systemet att skapa vyn, tyvärr sker något under ytan som ställer till det. Berätta gärna vad i kommentarerna. ;)

Hur det kan se ut (före)

Ett vanligt sätt att använda sig av ancestorView är för att exempelvis bygga en sökväg till en navigering:

<section:ancestorView id="sectionView" section="${article.homeSection}" includeRoot="true"/>
<menu:use id="navigation" treeName="myMenuName">
	<c:set var="count" value="1"/>
	<view:iterate id="item" name="sectionView">
		<menu:item id="current" sectionId="${item.id}"/>
		<c:choose>
			<c:when test="${count eq 1}">
				<c:set var="sectionPath" value="${current.text}"/>
			</c:when>
			<c:otherwise>
				<c:set var="sectionPath" value="${sectionPath}/${current.text}"/>
			</c:otherwise>
		</c:choose>
		<c:set var="count" value="${count+1}"/>
	</view:iterate>
</menu:use>

Skapa en lättviktig ersättning till ancestorView

En enkel väg till ett liv utan ancestorView-taggar är att skapa en mycket enkel custom tag. Nedanstående implementation har inte stöd för precis allt du kan göra med Escenics variant, men den gör jobbet för de flesta användningsfallen. Jag döpte den till ancestors.tag och la den i /WEB-INF/lib/tags/section.

<%@tag body-content="empty"%>
<%@tag import="neo.xredsys.api.Section, java.util.ArrayList"%>
<%@attribute name="id" required="true" rtexprvalue="false"%>
<%@attribute name="section" type="neo.xredsys.api.Section" required="true"%>
<%@attribute name="includeRoot" type="java.lang.String" required="false"%>
<%@variable name-from-attribute="id" alias="sectionPath" scope="AT_END"%>
<%
	final ArrayList sections = new ArrayList();
	if (section != null) {
		do {
			sections.add(0, section);
			section = section.getParent();
		} while (section != null && ("true".equals(includeRoot) || section.getParent() != null));
	}
	jspContext.setAttribute("sectionPath", sections);
%>

Det enda som egentligen sker här är att jag bygger upp en lista med föräldrasektioner i omvänd ordning genom att anropa Escenics API. Detta går av någon anledning massor med gånger snabbare.

Hur det kan se ut utan ancestorView
<%@ taglib prefix="sec" tagdir="/WEB-INF/tags/section" %>
<sec:ancestors id="sectionView" section="${article.homeSection}"/>
<menu:use id="navigation" treeName="myMenuName">
	<c:forEach var="item" items="${sectionView}" varStatus="itemStat">
		<menu:item id="current" sectionId="${item.id}"/>
		<c:choose>
			<c:when test="${itemStat.first}">
				<c:set var="sectionPath" value="${current.text}"/>
			</c:when>
			<c:otherwise>
				<c:set var="sectionPath" value="${sectionPath}/${current.text}"/>
			</c:otherwise>
		</c:choose>
	</c:forEach>
</menu:use>

Eftersom jag inte längre arbetar med en vy av sektioner, kan jag iterera över listan med föräldrasektioner med en vanlig c:foreach med fördelar som varStatus, mm.

Slutsats

Om du använder Escenic i någon 4.x-version och om du får några träffar när du söker på ancestorView i din kodbas, finns all anledning att se över ett byte!

RailsConf: Tutorials

ruby_dinette

JRuby on Rails – 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 att använda mig av i framtiden är VisualVM.

A Hat Full of Tricks with Sinatra – Blake Mizerany (Heroku)

Det första som händer är att Christian Neukirchen,
huvudutvecklaren av Rack sätter sig brevid mig.

Första fjärdedelen av Blakes föreläsning handlar inte om
Sinatra över huvud taget utan om just Rack.

Minimal Rack-applikation

run lambda { |env| [200, {'Content-Type' => 'text/html'}, ['Hello']] }

Minimal Sinatra-applikation

require 'sinatra'
 
get '/' do
  'Hello'
end

Rekomenderade böcker

Exempelkod

gae_hackathon

Ruby on Rails under Nginx med Phusion Passenger

Nginx

Sedan några timmar så kan man köra Phusion Passenger under Nginx!

Phusion Passenger och Apache har under en tid varit det populäraste sättet att enkelt driftsätta Ruby on Rails och Rack-applikationer. Nu kan man alltså välja att köra Passenger under den ryska (och tokigt snabba) Nginx.

Det enda man behöver göra är:

  1. Installera gem: sudo gem install passenger
  2. Köra Nginx installern: sudo passenger-install-nginx-module
  3. Konfigurera (Det mesta sköts automagiskt)
  4. Starta

Mer ingående instruktioner finns på Phusion’s blogg

Phusion Passenger

Hongli Lai och Ninh Bui presenterade Phusion Passenger (också känd som mod_rails) under RailsConf 2008, det var då jag verkligen fick upp ögonen för projektet.

I den nya versionen har Phusion-grabbarna förutom att man nu kan använda sig av två olika webbservrar för att köra Passenger lagt till:

  • Stöd för ”chunked file uploads”
  • Stöd för Capistranos sätt att sköta driftsättning (Symlänkning av current osv.)
  • Förmåga att ladda application_controller.rb från en icke-standard sökväg
  • ”Worker process event hooks” för Rack

Nginx

Nginx driver ett flertal stora webbplatser, såsom WordPress, Hulu, Github, och Ohloh. Den serverar mer än två miljoner webbplatser och är därmed den näst populäraste webbservern under Linux.

Fördelning mellan olika webbservrar

Athegas öppna källkod används av Valmyndigheten

I mitt förra inlägg berättade jag om en Perl-modul som vi släppt som öppen källkod. Det visade sig att denna kod ganska snabbt skulle komma till nytta. Häromdagen fick jag ett e-postmeddelande från Valmyndigheten där de berättade att de använder modulen och att den passar deras behov perfekt. De använder den för att konvertera positionen för alla vallokaler från RT90 till SWEREF99 för presentation på en karta på webben.

Modulen hittar ni här: Geo::SweGrid

Athega bidrar till öppen källkod

Athega har sedan länge, ända sedan starten 1997, arbetat mycket med programmeringsspråket Perl. Vi använder oss i mycket stor utsträckning av öppna och fria mjukvaror och verktyg för de system vi bygger. Därför är även en stor del av den kod vi själva producerar befriad från licenskostnader och betraktas som ”open source” även om den kanske i vissa fall inte finns publikt tillgänglig på nätet.

Saker som går att återanvända och andra kan ha nytta av delar vi gärna med oss av. Ett exempel på detta är Perl-modulen Geo::SweGrid som används för att konvertera geografiska koordinater mellan det system som används globalt och det som används på vissa svenska kartor.

Det distribuerade arkivet för Perl-moduler heter CPAN, dit kan alla bidra med sin kod. När en modul väl finns i arkivet kan den lätt installeras på vilken dator som helst så här:

[user@host ~]$ sudo cpan
 
cpan shell -- CPAN exploration and modules installation (v1.9304)
ReadLine support enabled
 
cpan> install Geo::SweGrid