söndag 29 juni 2008

Beräkning av kilometertid

För att beräkna kilometertid på formatet mm:ss används följande formel

Google Spreadsheet:
=TIME(0,0,(MINUTE(D3)*60 + SECOND(D3))/C3)

Microsoft Excel
=TIME(0;0;(MINUTE(D3)*60 + SECOND(B2))/C3)

Där D3 är tid i datumformat [hh:mm:ss] och C3 är distans i kilometer

onsdag 4 juni 2008

AJAX File Download

A file download initialized by a button click on a button that is placed inside an updatepanel requires some fiddling with IFRAME

The reason for this is:

"Since there is no traditional HTTP response, you have no context with which to send the file to the browser for normal download."

Check this out for a complete solution: http://encosia.com/2007/02/23/ajax-file-downloads-and-iframes/

onsdag 9 april 2008

T-SQL Rows To Columns (aka Pivot function)

When working with relational databases and statistics one often needs to present a table containing key and value in each row as a table with columns representing the key.

The following code is a quite generic solution to this problem. The code is a combination of the following two posts and my own stuff:

Pivot Query
Another Dynamic SQL CrossTab Stored Procedure

CREATE procedure [dbo].[RowsToColumns] (
-- Any select statement returning at least a pivot column and a value column

@Select VARCHAR(MAX),
-- The name of the column in @Select that will act as pivot
@PivotCol VARCHAR(100),
-- The name of the column in @Select that will act as value

@ValueCol VARCHAR(100),
-- The name of the column in @Select that will identify each row

@IdCol VARCHAR(100),
-- Other columns (comma separated) in @Select that we might want to return
@OtherCols VARCHAR(MAX) = NULL,
-- The columns (comma separated) in @Select that we should sort on
@OrderBy VARCHAR(MAX) = NULL )
AS

SET NOCOUNT ON
SET ANSI_WARNINGS OFF

-- Initialize parameters
SET @OtherCols = isNull(', ' + @OtherCols,'')
SET @OrderBy = isNull(' ORDER BY ' + @OrderBy,'')

-- Temporary table holding all column names
CREATE TABLE #temp (Pivot VARCHAR(100))
INSERT INTO #temp
EXEC ('SELECT DISTINCT convert(VARCHAR(100),' + @PivotCol + ') AS Pivot FROM (' + @Select + ') A')

-- String containing all column names
DECLARE @Cols VARCHAR(8000)
SET @Cols = ''
SELECT @Cols = @Cols + ', MAX(CASE WHEN ' + @PivotCol + '=''' + Pivot + ''' THEN ' + @ValueCol + ' END) AS ['+Pivot+']'
FROM #temp
ORDER BY Pivot
DROP TABLE #temp

-- Create and execute dynamic sql
DECLARE @SQL VARCHAR(max)
SET @SQL = 'SELECT ' + @IdCol + @OtherCols + @Cols + ' FROM (' + @Select + ') A GROUP BY ' + @IdCol + @OtherCols + @OrderBy
EXEC (@SQL)

SET NOCOUNT OFF
SET ANSI_WARNINGS ON

onsdag 12 mars 2008

Skaffa och installera SSL certificat

För att skapa nycklar och generera request samt importera certifikatet används verktyget keytool som levereras med JDK (Java)

1. Skapa ett keystore med en privat nyckel
keytool -genkey -alias tomcat -keyalg RSA -keystore yourkeystore.key

2. Generera ett certificate request som skickas till CA
keytool -certreq -alias tomcat -file yourrequest.csr -keystore yourkeystore.key

3. Få tillbaka ett certifikat och spara det till en fil (yourcertificate.crt)

4. Installera certifikatet i keystore
keytool -import -trustcacerts -alias tomcat -file yourcertificate.crt -keystore yourkeystore.key

5. För dokumentation på hur JBoss konfigureras se:
http://www.i-proving.ca/space/Technologies/JBoss/Configuring+JBoss+SSL

onsdag 27 februari 2008

Skapa "self signed" servercertifikat

För att köra SSL (HTTPS etc) krävs ett certifikat (en publik nyckel signerad av en "Certificate Authority"). Ofta finns inget behov av att nyckeln är signerad av en "Certificate Authority" utan det räcker att man skapar och signerar nyckeln själv. Enda skillnaden är att browsers och andra verktyg som tolkar nyckeln kan (och bör) reagera på att nyckeln inte är signerad av ett känt "Certificate Authority".

För att skapa ett "self signed" ssl-certifikat kan man göra på följande sätt (för tomcat webserver):

1. Skapa ett keystore med hjälp av keytool genom att köra följande kommando
keytool -genkey -alias tomcat -keyalg RSA

Ange keystore-lösenord: password
Vad heter du i för- och efternamn? [Unknown]: localhost
Vad heter din avdelning inom organisationen? [Unknown]: Support
Vad heter din organisation? [Unknown]: Testing AB
Vad heter din ort eller plats? [Unknown]: Gothenburg
Vad heter ditt land eller din provins? [Unknown]: Vastra Gotaland
Vilken är den tvåställiga landskoden? [Unknown]: SE
Är CN=localhost, OU=Support, O=Testing AB, L=Gothenburg, ST=Vastra Gotaland, C=SE korrekt? [nej]: j

Ange nyckellösenord för (RETURN om det är identiskt med keystore-lösenordet): password

Viktigt är att ange adressen (localhost eller yourdomain.com) certifikatet ska gälla för när keytool frågar efter för- och efternamn samt att ange samma lösenord för nyckeln som för själva keystore

2. Om man vill godkänna certifikatet på en maskin måste cerifikatet installeras. Exportera först servercertifikatet i keystore till filen server.cer genom att köra kommandot:

keytool -export -alias tomcat -keystore yourkeystorefile -storepass xxx -file server.cer

sen installerar man certifikatet i Trusted Root Certification Authorities i Windows genom att dubbelklicka på server.cer och välja "Trusted Certification..."

3. Om man vill använda certifikatet i en Javaapplikation måste certifikatet importeras i filen cacerts (JAVA_HOME\jre\lib\security) genom att köra kommandot:

keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias tomcat -file server.cer

eller genom att köra java programmet InstallCert och sen byta namn på resultatfilen jssecacerts till cacerts och ersätta den befintliga filen cacerts i JAVA_HOME\jre\lib\security\ (Observera att en webbserver måste vara igång och lyssna på port 443):

java InstallCert localhost

måndag 25 februari 2008

Stäng av IPv6 i Windows Vista (även loopback)

Ett problem som kan uppstå med gamla applikationer och system som körs på Vista är att dom lyssnar på (loopback) adressen 127.0.0.1 och därmed inte fattar när kommunikation från ::1 inkommer

Man kan stänga av IPv6 för alla connections man har genom att högerklicka på dem och välja properties och sen kryssa ur IPv6. Alternativt sätta ett registervärde (HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters\DisabledComponents) till 0

se http://www.microsoft.com/technet/network/ipv6/ipv6faq.mspx

Problemet är att det inte hjälper för loopback. Vista kommer fortfarande att använda ::1

Lösningen är att kommentera bort IPv6 raden ::1 i hosts filen (C:\Windows\System32\drivers\etc\hosts)

Eventuellt kommer en bättre permanen lösning för detta i ett servicepack