Database:Scraping data from the web

From Juneday education
Jump to: navigation, search

Meta

Expand using link to the right to see the meta section with instructor's notes.

Description

This topic is slightly off-topic to the database material in that it shows techniques in Bash for scraping data off the web for storage in a database. You may skip this lecture if your core focus of your course is SQL and database technology.

We think, however, that this chapter works well for showing those interested some ways to gather large quantities of data off of some web page. If you find data which you need for some application on a web page, the problem is that it is encoded in HTML. So you need a way to get the data down from the web page and translated into a format suitable for storage in a database. Knowing a little about this prepares the student for doing some actual work and the techniques taught in this lecture are applicable to many situations outside the scope of databases and web.

Mangling text using bash is a skill we consider useful for any student who wants to pursue a career working as a database technician, programmer of systems administrator. And it’s fun and useful knowledge for everyone else as well!

The idea behind this lecture is to inspire the students to experiment on their own, starting with some data they need on the web, getting that web page down to their computer, parsing out the interesting data from the web page and creating a script (or command line) which creates INSERT statements so that they can get the data into tables in their database. When the data is in a database, they can do statistical analysis of it using SQL.

We’ve found that many database courses have more or less interesting datasets in the examples. However, not many courses shows a strategy for how to actually get the data into the database from scratch. Web scraping is one way, and we show that here.

Prepare

This is long lecture - the Swedish video lecture using these slides are divided into 4 parts. Expect it to take between 30 and 45 minutes. As usual, we recommend seeing the lecture and reviewing the exercises. Since the exercises are about scraping data off a web site, make sure that the examples still work (the web page tv.nu may of course have changed, breaking the scripts and command lines used in the exercise).

If your students aren’t comfortable with using bash and the command line, you can do the exercises live on the projector and solve it together with the class. We think it might be interesting for students to at least have seen what can be done in bash, even if they won’t learn it in the course you are giving.

Heads-up

Think about:

  • Scraping data involves a set of tools like curl or wget etc, but also a working internet connection in the classroom. Also, parsing out data from the HTML on the web page can be tricky - and remember that web pages tend to change over time - What worked yesterday may not work today if the page has been re-designed!
  • The focus and idea about this lecture isn’t all the bash one-liners or the bash tools used, but rather to show the students that they can work with “real data” which they might scrape off the web. Knowing some tricks on the command line is, however, very useful, also when you work with databases.
  • The bash used in the exercises requires a basic understanding of the standard streams, redirection and pipes.
  • Tools/commands and techniques used include:
    • wget
    • egrep and grep
    • cut
    • cat
    • echo
    • chmod
    • date
    • read
    • while do done
    • if then elif then fi
    • redirection using < > and also pipes
    • bash variables
    • shell expansion using $(some commands)
    • shell expansion using $((some expression))
    • the % (remainder/modulo) operator

Full frontal - Code examples up-front!

NOTE! Where it says GET in the examples, you who run Windows (or Mac OS) can use lwp-request -m GET instead.

$ # Let's see what Västtrafik has broken just now:
$ w3m -dump 'https://m.vasttrafik.se/reseinformation/trafikstorningar-mobil/?mid=46' |fmt -w 180 | grep Linje | sed -e 's/\(^\ *\)\(.*\)/\2/'
Linje 2, 19 och 158 stannar inte vid Domkyrkan och Grönsakstorget i båda riktningar.
Linje 2, 19 och 158 stannar inte vid Domkyrkan och Grönsakstorget i båda riktningar.
Linje 2, 19 och 158 stannar inte vid Domkyrkan och Grönsakstorget i båda riktningar.

$ # Let's see how many PDF files are available on this Wiki:
$ w3m -dump 'http://wiki.juneday.se/mediawiki/index.php?title=Special:MIMESearch/application/pdf&limit=500&offset=0&mime=application%2Fpdf' | egrep '^[0-9]+\.'|tail -1|cut -d '.' -f1
240
$ # 240 PDFs! Not bad! We all know what to read tonight, then!

$ # What about PNG images?
$ $ w3m -dump 'http://wiki.juneday.se/mediawiki/index.php?title=Special:MIMESearch&limit=250&offset=0&mime=image%2Fpng' | egrep '^[0-9]+\.'|tail -1|cut -d '.' -f1
78
$ # Only 78! That's an outrage! You guys need more images, you text freaks!

$ # How many videos have the fools uploaded to Vimeo?
$ $ w3m -dump 'https://vimeo.com/user52531669' | egrep '[0-9]+\ Videos' | cut -d ' ' -f4
674

$ # What year was Urban's latest publication?
$ GET 'https://ait.gu.se/om-institutionen/avdelningen-for-informatik/personal?userId=xnulur#tabContentAnchor2'|egrep '<h3>[0-9]{4}</h3>'|head -1 | sed -e 's/.*\([0-9]\{4\}\).*/\1/g'
2016
$ # Henrik's?
$ GET 'https://ait.gu.se/om-institutionen/avdelningen-for-informatik/personal?userId=xshenc#tabContentAnchor2'|egrep '<h3>[0-9]{4}</h3>'|head -1 | sed -e 's/.*\([0-9]\{4\}\).*/\1/g'
2018
$ # Wolmet's?
$ GET 'https://ait.gu.se/om-institutionen/avdelningen-for-informatik/personal?userId=xbarwo#tabContentAnchor2'|egrep '<h3>[0-9]{4}</h3>'|head -1 | sed -e 's/.*\([0-9]\{4\}\).*/\1/g'
2018
$ # Kalevi's?
$ GET 'https://ait.gu.se/om-institutionen/avdelningen-for-informatik/personal?userId=xpeska#tabContentAnchor2'|egrep '<h3>[0-9]{4}</h3>'|head -1 | sed -e 's/.*\([0-9]\{4\}\).*/\1/g'
2017
$ # Juho's?
$ GET 'https://ait.gu.se/om-institutionen/avdelningen-for-informatik/personal?userId=xlijuh#tabContentAnchor2'|egrep '<h3>[0-9]{4}</h3>'|head -1 | sed -e 's/.*\([0-9]\{4\}\).*/\1/g'
2019

$ # In fact, when did anyone at Informatics last publish?
$ for user in $(GET 'https://ait.gu.se/om-institutionen/avdelningen-for-informatik/?selectedTab=2&itemsPerPage=-1'|grep userId|tr '?' '\n'|tr '&' '\n'|grep userId|cut -d '=' -f2); do name=$(GET "https://ait.gu.se/om-institutionen/avdelningen-for-informatik/personal?userId=$user"|grep '<h1>'|sed -e 's/.*<h1>\([&;A-Za-z ]\+\)<\/h1>.*/\1/g');name=$(echo "$name"|w3m -dump -T text/html);echo -n "$name ";GET "https://ait.gu.se/om-institutionen/avdelningen-for-informatik/personal?userId=$user#tabContentAnchor2"|egrep '<h3>[0-9]{4}</h3>'|head -1 | sed -e 's/.*\([0-9]\{4\}\).*/\1/g';echo;done
Urban Ask 2018

Alan B Carlson 
Ioanna Constantiou 2017

Håkan Enquist 2012

Rikard Fröberg 2018

Mikael Gustavsson 
Aida Hadzic Zukic 2015

Ola Henfridsson 
Frida Ivarsson 
Dina Koutsikouri 2018

Rikard Lindgren 2018

Juho Lindman 2019

Juho Lindman 2019

Jan Ljungberg 2018

Johan Magnusson 2019

Urban Nuldén 2016

Kalevi Pessi 2017

Lidija Polutnik 2018

Agneta Ranerup 2019

Fatemeh Saadatmand 2018

Ted Saarikko 2019

Taline Sandberg Jadaan 2010

Henrik Sandklef 2018

Lisen Selander 2016

Dick Stenmark 2018

Fredrik Svahn 2017

Fahd Omair Zaffar 2017

Yixin Zhang

Introduction

This chapter is slightly off-topic to the database course material in that it shows techniques in Bash for scraping data off the web for storage in a database. You may skip this chapter if your core interest is in SQL and database technology.

We think, however, that this chapter works well for showing those interested some ways to gather large quantities of data off of some web page. If you find data which you need for some application on a web page, the problem is that it is encoded in HTML. So you need a way to get the data down from the web page and translated into a format suitable for storage in a database.

This chapter (the PDF - we aim to record a video lecture for it too in the future!) and the companion exercise chapter shows you a couple of techniques for doing just that.

The chapter requires some patience on your behalf, and a good knowledge of Bash. If you don't have a good knowledge of Bash, you will learn a lot from following the instructions in the lecture and the exercise in the next chapter. Enjoy!

Data sources

It is actually quite common to "scrape" data from some web page, in order to feed some application or program with data. Over the years, we've helped our students to scrape various data from various web sites. From lunch menus for an app which showed today's lunch offers of our local restaurants, to an app showing the TV schedule (which is also the topic for the exercises of this lecture) to scraping information about chemicals from a Swedish authority, and many other sources.

Ideally, data you need is readily available in some standard data format such as Json or XML or at least CSV (comma separated values). But other times we're not so lucky. But often, the data we need is at least available on some web site, coded in HTML as part of the web page over all information. In such situations, it is good to know some tools and techniques to get the data down to your computer and how to extract only the data you need from the web page HTML code.

That's what we want to show you in this lecture.

Some more examples

NOTE! Where it says GET in the examples, you who run Windows (or, apparently also, Mac OS) can use lwp-request -m GET instead.

To find out what kind of publications the staff at Applied IT at Göteborg University are publishing, we could get the full list of publication (we have limited ourselves to 500 publications) as a web page (HTML), then parse out the HTML tag containing the publication type:

$ GET 'https://ait.gu.se/om-institutionen/?selectedTab=3&userName=&siteNodeId=638014&languageId=100000&itemsPerPage=-1&contentId=-1&originalRequestURI=%2Fom-institutionen%2F&publicationsPerPage=500'|grep '="publicationGroup'|sed -e 's/.*>\(.*\)<.*/\1/g'|sort|uniq -c|sort -rnk1|sed -e 's/^\ *//g'
190 Paper i proceeding
114 Artikel i vetenskaplig tidskrift
76 Konferensbidrag (offentliggjort, men ej förlagsutgivet)
44 Kapitel i bok
16 Doktorsavhandling
11 Konstnärligt arbete
10 Övrigt
9 Artikel i övriga tidskrifter
8 Poster (konferens)
7 Rapport
6 Samlingsverk
4 Lärobok
4 Bok
3 Licentiatsavhandling
3 Bidrag till encyklopedi
1 Special / temanummer av tidskrift
1 Recension
1 Proceeding
1 Inledande text i tidskrift
1 Artikel i dagstidning

We can now see that the most common type of publication is "Paper i proceeding" (paper in proceeding) with 190 publications. In second place, we find "Artikel i vetenskaplig tidskrift" (paper in scientific journal) with 114 publications. After that, we have "Konferensbidrag (offentliggjort, men ej förlagsutgivet)" (conference/other - not published by a publisher) as a fairly common type of publication with 76 publications. If we add up "Doktorsavhandling" (doctoral thesis) and "Licentiatsavhandling" (Licentiate thesis), we get 19 publications of those. And if we consider everything else as "Other", we get 187 publications of type Other, about the same as "Paper i proceeding".

How did we do that? Let's break down the command-line into parts:

GET 'https://ait.gu.se/om-institutionen/?selectedTab=3&userName=&siteNodeId=638014&languageId=100000&itemsPerPage=-1&contentId=-1&originalRequestURI=%2Fom-institutionen%2F&publicationsPerPage=500' \ 
                                # Get the HTML page
|grep '="publicationGroup' \    # Filter on lines containing ="publicationGroup
|sed -e 's/.*>\(.*\)<.*/\1/g' \ # Extract the type text from the HTML tag surrounding it
|sort \                         # Sort the lines lexicographically
|uniq -c \                      # Count the number of occurrences, which will produce the number and the uniq text
|sort -rnk1 \                   # Sort the lines descending on the numeric key (occurrences)
|sed -e 's/^\ *//g'             # Remove leading blanks

Another, slightly more advanced example is available at our github repo for this lecture. It is a script (click on "Raw" before you download from github, or clone the whole repo) that only counts publications per author where the author is the first author (primary author) of the article. Otherwise, we'll count the same article four times, if four researchers at our department all have contributed to the article and listed it on their home pages.

The script produces output for each author (staff at our department who has listed something on their home page under "Publications") and a summary for the whole department. As the script is running, you can see it analyzing each publication, printing a '.' for each publication where the author is a co-author, an 'F' if the author is the first author (primary author) and a 'V' if the publication is by the author as first-name (primary) author and if it is published in a scientific journal (which, we believe, is the strongest currency in circles obsessed with publications).

The publications are investigated in reverse chronological order, from the latest publication and back in time to the first one. This way, you can also study how the publishing frequency has changed over the years.

It is only the first-name publications (in journals and elsewhere) that are counted as the department total.

Analysing papers by Albert Einstein from 2017 .......F...F..F....V..FF.....F......... 1991.
 Done analysing papers.
Albert Einstein: 0 single author publications, 7 first-name publications, and 32 articles as co-author
First publication published 1991, last publication published 2017
Years active publishing: 28
Number of publications: 39.
Average publications per year: 1.39
Publication types:
17 Artikel i vetenskaplig tidskrift
16 Paper i proceeding
2 Kapitel i bok
1 Poster (konferens)
1 Licentiatsavhandling
1 Konferensbidrag (offentliggjort, men ej förlagsutgivet)
1 Doktorsavhandling
Number of scientific journal publications as first name: 1

... the same for each of the staff

==========Summary for the department===============
533 (first-name) publications by 22 authors of which 105 were in sci. journals
The ratio (scientific journal publication/publication) is 0.20 .
An average of 24.23 publications per employee (counting only emp. who publishes).
The total years of publishing (summing every authors active years publishing) is 280
In average, each publishing empl has published 4.77 scientific papers in a sci. journal.
In average, each publishing empl has published for 12.73 years.
In average, each publishing empl has published 0.37 sci. papers in a sci. journal per year.

Some statistics about teacher presence in various courses

We've downloaded a couple of course schedules from the Time-Edit schedule system, as CSV.

After some minor polishing of the CSV files, we wrote a script to compile some statistics of teacher presence:

$ ./schedule_csv_parser.sh tig059v18.csv 
Teaching statistics for TIG059. Systemutvecklingsprojekt 2018:
Grupparbete: 17 hrs and 45 mins.
Handledning: 15 hrs and 0 mins.
Redovisning: 14 hrs and 0 mins.
Föreläsning: 12 hrs and 0 mins.
Tentamen: 4 hrs and 0 mins.
Seminarium: 2 hrs and 0 mins.
Introduktion: 2 hrs and 0 mins.
Inlämning: 1 hrs and 15 mins.
Anmälan: 0 hrs and 15 mins.

Types and distribution of teacher involvement:
N/A: 7 hrs and 30 mins.
Juho Lindman: 26 hrs and 0 mins.
Henrik Sandgren, Rikard Fröberg: 17 hrs and 45 mins.
Henrik Sandgren, Juho Lindman, Rikard Fröberg: 6 hrs and 0 mins.
Anna-Lena Fredriksson, Juho Lindman: 2 hrs and 0 mins.
Anna-Lena Fredriksson: 9 hrs and 0 mins.

Teacher type distribution:
N/A Tentamen: 4 hrs and 0 mins.
N/A Inlämning: 1 hrs and 15 mins.
N/A Föreläsning: 2 hrs and 0 mins.
N/A Anmälan: 0 hrs and 15 mins.
Juho Lindman Redovisning: 8 hrs and 0 mins.
Juho Lindman Handledning: 12 hrs and 0 mins.
Juho Lindman Föreläsning: 6 hrs and 0 mins.
Henrik Sandgren, Rikard Fröberg Grupparbete: 17 hrs and 45 mins.
Henrik Sandgren, Juho Lindman, Rikard Fröberg Redovisning: 6 hrs and 0 mins.
Anna-Lena Fredriksson Seminarium: 2 hrs and 0 mins.
Anna-Lena Fredriksson, Juho Lindman Introduktion: 2 hrs and 0 mins.
Anna-Lena Fredriksson Handledning: 3 hrs and 0 mins.
Anna-Lena Fredriksson Föreläsning: 4 hrs and 0 mins.

End of report.
==========================

$ ./schedule_csv_parser.sh tig016h18.csv 
Teaching statistics for TIG016. Verksamheter och information 2018:
Handledning: 46 hrs and 0 mins.
Föreläsning: 26 hrs and 0 mins.
Workshop: 4 hrs and 0 mins.
Tentamen: 4 hrs and 0 mins.
Introduktion: 2 hrs and 0 mins.
Examination, Seminarium: 16 hrs and 0 mins.
Anmälan, Tentamen: 0 hrs and 15 mins.

Types and distribution of teacher involvement:
Urban Nuldén: 88 hrs and 0 mins.
N/A: 0 hrs and 15 mins.
Maria Bolin: 2 hrs and 0 mins.
Lasse Malmberg: 2 hrs and 0 mins.
Kjell Engberg: 4 hrs and 0 mins.
Jonas Flodén: 2 hrs and 0 mins.

Teacher type distribution:
Urban Nuldén Workshop: 4 hrs and 0 mins.
Urban Nuldén Tentamen: 4 hrs and 0 mins.
Urban Nuldén Introduktion: 2 hrs and 0 mins.
Urban Nuldén Handledning: 46 hrs and 0 mins.
Urban Nuldén Föreläsning: 16 hrs and 0 mins.
Urban Nuldén Examination, Seminarium: 16 hrs and 0 mins.
N/A Anmälan, Tentamen: 0 hrs and 15 mins.
Maria Bolin Föreläsning: 2 hrs and 0 mins.
Lasse Malmberg Föreläsning: 2 hrs and 0 mins.
Kjell Engberg Föreläsning: 4 hrs and 0 mins.
Jonas Flodén Föreläsning: 2 hrs and 0 mins.

End of report.
==========================

$ ./schedule_csv_parser.sh tig015h18.csv 
Teaching statistics for TIG015. Informationsteknologi och informationssystem 2018:
Handledning: 79 hrs and 0 mins.
Föreläsning: 37 hrs and 45 mins.
Tentamen: 8 hrs and 0 mins.
Projektarbete: 2 hrs and 0 mins.
Övning: 2 hrs and 0 mins.
Inlämning: 1 hrs and 0 mins.
Självstudier, Övning: 14 hrs and 0 mins.
Lärare/student möte, Seminarium: 27 hrs and 0 mins.
Handledning, Projektarbete: 15 hrs and 0 mins.
Föreläsning, Projektarbete: 3 hrs and 30 mins.
Föreläsning, Övning: 1 hrs and 45 mins.
Föreläsning, Introduktion: 2 hrs and 45 mins.
Anmälan: 0 hrs and 15 mins.

Types and distribution of teacher involvement:
N/A: 28 hrs and 15 mins.
Kalevi Pessi, Urban Nuldén: 18 hrs and 0 mins.
Kalevi Pessi: 11 hrs and 45 mins.
Henrik Sandklef, Rikard Fröberg: 105 hrs and 15 mins.
Anna-Lena Fredriksson, Kalevi Pessi, Urban Nuldén: 24 hrs and 0 mins.
Anna-Lena Fredriksson: 6 hrs and 45 mins.

Teacher type distribution:
N/A Tentamen: 8 hrs and 0 mins.
N/A Självstudier, Övning: 14 hrs and 0 mins.
N/A Övning: 2 hrs and 0 mins.
N/A Inlämning: 1 hrs and 0 mins.
N/A Föreläsning: 3 hrs and 0 mins.
N/A Anmälan: 0 hrs and 15 mins.
Kalevi Pessi, Urban Nuldén Lärare/student möte, Seminarium: 3 hrs and 0 mins.
Kalevi Pessi, Urban Nuldén Handledning, Projektarbete: 15 hrs and 0 mins.
Kalevi Pessi Projektarbete: 2 hrs and 0 mins.
Kalevi Pessi Föreläsning, Projektarbete: 3 hrs and 30 mins.
Kalevi Pessi Föreläsning, Övning: 1 hrs and 45 mins.
Kalevi Pessi Föreläsning, Introduktion: 2 hrs and 45 mins.
Kalevi Pessi Föreläsning: 1 hrs and 45 mins.
Henrik Sandklef, Rikard Fröberg Handledning: 79 hrs and 0 mins.
Henrik Sandklef, Rikard Fröberg Föreläsning: 26 hrs and 15 mins.
Anna-Lena Fredriksson, Kalevi Pessi, Urban Nuldén Lärare/student möte, Seminarium: 24 hrs and 0 mins.
Anna-Lena Fredriksson Föreläsning: 6 hrs and 45 mins.

End of report.
==========================

You can look at the script here and download it from here.

The sample files used were:

Scraping data about course curriculums

This command line (combining two scripts) prints the years for the courses in the Systems' science program at Göteborg University:

$ for code in $(./course_codes.sh);do ./curriculum.sh $code;echo ==END COURSE==;echo;done
=== TIG015 ===
Date of creation and revisions:
2008-10-15
2018-09-03
Course age: 	10 yr + 3 mo + 25.515715 d
Course age since 'valid from date': 	5 mo + 7.0640028 d
Lärandemål
Kunskap och förståelse
• redogöra för akademiska riktlinjer för rapportskrivning;
• utifrån kurslitteratur beskriva begreppet informationssystem samt ge exempel på typ
av informationssystem som används i en verksamhet;
• redogöra för begreppen typer, variabler, uttryck, operatorer, metoder,
flödeskontroll, klasser, objekt, arv, felhantering (exception) och gränssnitt
(interface) i ett objektorienterat språk, t.ex. Java;
Färdigheter och förmåga
• självständigt utveckla enkla objektorienterade program och applicera enklare
problemlösning;
• med hjälp av projektmetodik genomföra ett projekt i grupp, dokumentera
projektgenomförandet enligt projektmallar och presentera arbetet muntligt;
Värderingsförmåga och förhållningssätt
• med hjälp av referensmaterial självständigt reflektera kring sin egen roll i ett projekt
och projektgruppens olika faser vid genomförande av ett projekt;
• med hjälp av en projekttidsplan värdera tidsbudget på ett hållbart sätt för att
effektivisera användning av tillgängliga resurser.
==END COURSE==

=== TIG016 ===
Date of creation and revisions:
2008-10-15
2011-02-09
2011-09-01
Course age: 	10 yr + 3 mo + 25.515715 d
Course age since 'valid from date': 	7 yr + 5 mo + 9.3686114 d
Lärandemål
Kunskap och förståelse
• beskriva organisationer som sociala system.
• redogöra för modelleringstekniker för analys och specifikation av verksamheter och information.
Färdighet och förmåga
• granska, värdera och välja samt applicera modelleringstekniker för ett specifikt problem,
• planera, organisera och genomföra projekt i termer av en gruppuppgift,
• sammanställa en projektrapport i grupp,
• aktivt bidra till projektresultat i grupparbetet.
Värderingsförmåga och förhållningssätt
• förklara etiska förhållningssätt och ansvar som vilar på systemvetaren som utredare, lärare, samordnare
och konflikthanterare, dokumentera och reflektera över den egna lärprocessen.
==END COURSE==

=== TIG058 ===
Date of creation and revisions:
2008-10-15
2018-09-03
Course age: 	10 yr + 3 mo + 25.515726 d
Course age since 'valid from date': 	5 mo + 7.0640144 d
Lärandemål
Kunskap och förståelse
• förklara hur ett givet system, där databaskoppling ingår, fungerar och är uppbyggt,
på en tillräcklig nivå för att kunna omsätta kunskapen i kod;
• beskriva grundläggande konstruktioner i SQL samt grundläggande kunna beskriva
en relationsdatabas;
• med stöd av API-dokumentation, specifikationer och befintlig kod kunna förklara
ett Java-system där databaskoppling ingår;
Färdigheter och förmåga
• ändra samt lägga till funktionalitet i ett befintligt system där databaskoppling ingår;
• utveckla en klient med grafiskt användargränssnitt som konsumerar och presenterar
data från ett, av studenterna utvecklat, Java-system, samt innehåller komponenter
för interaktion med användaren;
• självständigt använda grundläggande konstruktioner i språket SQL för att söka ut,
ändra, lägga till och ta bort data från en relationsdatabas bestående av flera
kopplade tabeller;
• använda komponenter som är uppbyggda enligt olika designmönster;
Värderingsförmåga och förhållningssätt
• resonera kring teknikerna för normalisering och dataintegritet från databasteorin
utifrån när det är lämpligt att applicera dem, vilka effekter man vill uppnå samt
konsekvensen av att inte applicera dem i olika grad.
==END COURSE==

=== TIG059 ===
Date of creation and revisions:
2007-10-24
2013-04-22
2013-04-02
Course age: 	11 yr + 3 mo + 17.273528 d
Course age since 'valid from date': 	5 yr + 10 mo + 8.668771 d
Lärandemål
Kunskap och förståelse
• förklara en iterativ objektorienterad systemutvecklingsmodell,
• förklara hur modeller och metoder för systemutveckling, från de föregående kurserna TIG015, TIG016
och TIG058, passar in i en iterativ objektorienterad systemutvecklingsmodell.
Färdighet och förmåga
• använda metoder och modeller från kursens iterativa objektorienterade systemutvecklingsmodell,
• skapa en dokumentation över ett systemutvecklingsprojekt,
• styra ett mindre projekt.
Värderingsförmåga och förhållningssätt
• bedöma vilken typ av kunskap som behöver tas fram under ett systemutvecklingsarbete.
==END COURSE==

=== TIG098 ===
Date of creation and revisions:
2011-10-17
2014-03-12
2014-09-01
Course age: 	7 yr + 3 mo + 24.242323 d
Course age since 'valid from date': 	4 yr + 5 mo + 9.0952193 d
Lärandemål
Kunskap och förståelse
• utifrån kurslitteraturen redogöra för teorier samt nyckelbegrepp inom eBusiness samt eGovernment.
Färdighet och förmåga
• göra en beskrivning av kunskapsläget, inom något delområde i kursen, utifrån huvudsakligen aktuella
akademiska konferenspresentationer, rapporter och artiklar,
• designa en systemarkitektur för en internetbaserad verksamhet.
Värderingsförmåga och förhållningssätt
• utvärdera internetbaserade verksamheters påverkan i samhället utifrån ekonomiska, sociala och
hållbarhetsperspektiv.
==END COURSE==

=== TIG162 ===
Date of creation and revisions:
2014-03-12
2014-09-01
Course age: 	4 yr + 10 mo + 29.869303 d
Course age since 'valid from date': 	4 yr + 5 mo + 9.0952193 d
Lärandemål
Kunskap och förståelse
• beskriva begreppsmodeller för verksamhetsstyrning med hjälp av affärssystem samt redogöra för hur
affärssystem styr och stödjer organisationer
• beskriva affärssystemens funktionalitet och arkitektur
• visa samband mellan affärssystem och organisationers värdeskapande
Färdighet och förmåga
• genomföra laborationer med hjälp av affärssystem (exempelvis ERP, CRM, SCM)
• beskriva affärssystemens relation till organisatoriska och informationsteknologiska perspektiv
Värderingsförmåga och förhållningssätt
• värdera nytta och problem vid införande av affärssystem
• utifrån relevant teori analysera och bedöma etiska aspekter av affärssystem
• bedöma etiska konsekvenser och hållbarhetsaspekter av teknikval
==END COURSE==

=== TIG163 ===
Date of creation and revisions:
2014-03-12
2014-09-01
Course age: 	4 yr + 10 mo + 29.869315 d
Course age since 'valid from date': 	4 yr + 5 mo + 9.0952308 d
Lärandemål
Kunskap och förståelse
• förklara hur beslut fattas i organisationer och hur beslutsfattande kan stödjas med beslutstödssystem
• beskriva beslutstödssystemens funktionalitet och arkitektur
• redovisa insikt i samband mellan informationssökning och problemlösning
• redogöra för beslutsfattandets komplexitet
Färdighet och förmåga
• lösa uppgifter med hjälp av beslutsteknologier (exempelvis textmining, datamining)
Värderingsförmåga och förhållningssätt
• visa förmåga att redogöra för konsekvenser av beslutsfattande med hjälp av beslutsteknologier
• värdera nytta och problem vid införande av beslutstödsystem
• utifrån relevant teori analysera och bedöma etiska och hållbarhetsaspekter av teknikval
==END COURSE==

=== TIG164 ===
Date of creation and revisions:
2018-11-23
2019-03-27
Course age: 	2 mo + 17.332909 d
Course age since 'valid from date': 	-1 mo + -15.356541 d
Lärandemål
Kunskap och förståelse
• identifiera de faktorer som påverkar interaktionen mellan användare och ITbaserade produkter/system;
• identifiera olika användarperspektiv som påverkar utvecklingen av interaktiva
system;
• redogöra för hur ett tvärvetenskapligt angreppssätt behövs för att skapa
användbara gränssnitt;
• redogöra för hur man kan ta hänsyn till de olika aktörernas värderingar och etiska
konsekvenser i designprocessen;
Färdigheter och förmåga
• genomföra analys och design av en interaktiv produkt/system utifrån ett
användarcentrerat perspektiv, inklusive värderingar och etiska aspekter;
• designa system med användarperspektiv utifrån utförd användar- och
uppgiftsanalys, inklusive etiska aspekter;
• kommunicera idéer på ett tydligt och koncist sätt genom användning av relevant
vokabulär och interaktionsdesignsverktyg (till exempel scenarier, skisser, personas,
diagram);
Värderingsförmåga och förhållningssätt
• argumentera kring för- och nackdelar med olika tillvägagångssätt för att designa
och utvärdera hållbara interaktiva gränssnitt;
• kritiskt reflektera kring etiska aspekter av interaktionsdesign.
==END COURSE==

=== TIG064 ===
Date of creation and revisions:
2012-03-12
2012-08-07
2012-09-03
Course age: 	6 yr + 10 mo + 29.384917 d
Course age since 'valid from date': 	6 yr + 5 mo + 6.6108333 d
Lärandemål
Kunskap och förståelse
• diskutera begreppet förändring utifrån olika nivåer (samhälle, organisation och individ) förankrade i
vetenskapliga teorier,
• förklara växelverkan mellan tekniska och icke-tekniska aspekter i IT-faciliterad förändring och
implikationer av dessa för arbete och organisation,
• diskutera begreppet strategi utifrån olika dimensioner (affärs, IS, IT) förankrade i vetenskapliga teorier.
Färdighet och förmåga
• relatera innehållet i en vetenskaplig artikel och tydliggöra dess implikationer för praktik och forskning
inom kunskapsområdet,
• förbereda och leda ett diskussionsseminarium med utgångspunkt från en vetenskaplig artikel,
• tillämpa vetenskapliga teorier och självständigt analysera ett fall, urskilja styrkor och svagheter, och
identifiera förbättringsåtgärder för strategiutveckling,
• genomföra en systematisk framtids- och omvärldsanalys av en frågeställning.
Värderingsförmåga och förhållningssätt
• jämföra och kontrastera vetenskapliga teorier om organisering och ledning av IT-faciliterade
förändringsprocesser,
• argumentera för- och nackdelar med olika tillvägagångssätt för organisering och ledning av IT-faciliterade
förändringsprocesser i olika organisatoriska kontexter.
==END COURSE==

=== TIG166 ===
Date of creation and revisions:
2017-09-07
2017-09-07
Course age: 	1 yr + 5 mo + 2.8218272 d
Course age since 'valid from date': 	1 yr + 5 mo + 2.8218272 d
Lärandemål
Kunskap och förståelse
• Karaktärisera olika typer av strategier och förstå deras roll i den strategiska
utvecklingen inom organisationer.
• Förklara aktuellt forsknings- och utvecklingsarbete inom IT-management
• Känna till den historiska utvecklingen av IT's roll och därmed dess värderingsgrund
har förändrats över tiden.
• Beskriva och karakterisera olika synsätt för hur nyttan av Informationssystem/ITinvesteringar kan evalueras.
• Känna till olika alternativa integrationsformer mellan IT-system.
Färdigheter och förmåga
• Tillämpa analytiska metoder och tekniker för strategiarbete.
• Kunna värdera effekten samt nyttan av IT- investeringar i både ekonomiska och
icke-ekonomiska termer/aspekter.
• Använda modelleringstekniker för att beskriva Informationssystemarkitektur och
dess förhållande till verksamheten.
• Tillämpa olika former av integrationsprinciper för samordning och samverkan av
IT-system.
Värderingsförmåga och förhållningssätt
• Kritiskt granska etiska aspekter vid val och kombination av olika typer av metoder
för strategiutveckling
• Förstå betydelsen av tillämpning av både ekonomiska och icke-ekonomiska
värderingsmodeller.
==END COURSE==

=== TIG167 ===
Date of creation and revisions:
2018-09-12
2018-11-07
Course age: 	4 mo + 28.500887 d
Course age since 'valid from date': 	3 mo + 2.8960707 d
Lärandemål
Kunskap och förståelse
• redogöra för vanliga designmönster, deras syfte samt användningsområde;
• redogöra för hur information utbyts mellan server och klient;
• beskriva begrepp och tekniker i Java, t ex lambda och Collections;
Färdigheter och förmåga
• utveckla en enkel app för Android-enheter;
• utveckla klient- och server-programvara som utbyter information med hjälp av tex
JSON;
• tillämpa i kursen introducerade begrepp och tekniker i Java;
• tillämpa i kursen introducerade designmönster;
Värderingsförmåga och förhållningssätt
• värdera olika datatyper i Javas Collection-API och Java Map utifrån olika kriterier;
• reflektera över konsekvenser av val av datatyp.
==END COURSE==

=== TIG165 ===
Date of creation and revisions:
2018-11-23
2019-01-21
Course age: 	2 mo + 17.332921 d
Course age since 'valid from date': 	19.20662 d
Lärandemål
Kunskap och förståelse
• redovisa en förståelse för uppsatsskrivandets praktik utifrån praktiska exempel,
innefattande problemformulering och strukturfrågor;
• utifrån en vetenskaplig frågeställning argumentera för val av metod och dess
konsekvenser för vetenskapliga studier i informatik;
• redogöra för informatikämnets vetenskapliga grund utifrån en förståelse av
disciplinens historia;
Färdigheter och förmåga
• uttrycka en förmåga att koppla metoder och angreppssätt till olika
undersökningsproblem och förstå konsekvenserna av val i samband med detta;
• planera, dokumentera, redovisa och opponera på en planeringsrapport inför ett
examensarbete;
Värderingsförmåga och förhållningssätt
• värdera praktisk och teoretisk relevans för ett vetenskapligt arbetes
problemformulering, teori, metod, resultat och analys.
==END COURSE==

=== TIG067 ===
Date of creation and revisions:
2009-09-28
2019-03-27
Course age: 	9 yr + 4 mo + 12.321098 d
Course age since 'valid from date': 	-1 mo + -15.35653 d
Lärandemål
Kunskap och förståelse
• identifiera och problematisera valt problemområde i relation till ämnet informatik;
• redogöra för och reflektera över möjliga vetenskapliga angreppssätt i relation till
valt problemområde;
Färdigheter och förmåga
• planera, genomföra, dokumentera och försvara ett examensarbete i informatik;
• beskriva, diskutera och reflektera kring valt problemområde, teori och/eller tidigare
forskning, metod och empiri i relation till det egna utförda examensarbetet i
informatik;
Värderingsförmåga och förhållningssätt
• konstruktivt och kritiskt granska och värdera eget och andras examensarbete i
informatik med avseende på innehåll, struktur, argumentation samt vetenskaplighet.
==END COURSE==

If you want, you can install units (on Mac: gunits, date = gdate), and get the age of the curriculum. The script works also without units, in which case the age is not printed:

$ ./curriculum.sh TIG016
=== TIG016 ===
Date of creation and revisions:
2008-10-15
2011-02-09
2011-09-01
Lärandemål
Kunskap och förståelse
• beskriva organisationer som sociala system.
• redogöra för modelleringstekniker för analys och specifikation av verksamheter och information.
Färdighet och förmåga
• granska, värdera och välja samt applicera modelleringstekniker för ett specifikt problem,
• planera, organisera och genomföra projekt i termer av en gruppuppgift,
• sammanställa en projektrapport i grupp,
• aktivt bidra till projektresultat i grupparbetet.
Värderingsförmåga och förhållningssätt
• förklara etiska förhållningssätt och ansvar som vilar på systemvetaren som utredare, lärare, samordnare
och konflikthanterare, dokumentera och reflektera över den egna lärprocessen.

To install the units command under Cygwin, try:

$ setup-x86.exe -q -P units

To install the gunits command using Ports in Mac OS X, try:

$ sudo port install gunits

To install the gunits command using Home Brew on Mac OS X, try:

$ brew install gunits

On Mac OS X, you need to change the script to use gunits if units is not available, and you have installed gunits instead.

You need to have setup-x86.exe in your PATH or supply the absolute path to it, e.g. /cygdrive/C/Users/your-user-name/Downloads/setup-x86.exe (if that's were it is).

Some scraping of Juneday teaching material statistics

The ten wiki pages with most revisions (edits):

$ w3m -dump 'http://wiki.juneday.se/mediawiki/index.php?title=Special:MostRevisions&limit=500&offset=0'|grep 'revisions)'|head -10
 1. TIG058‏‎ (327 revisions)
 2. TODO‏‎ (274 revisions)
 3. Klientprogrammering och systemintegration (YRGO)‏‎ (250 revisions)
 4. TIG015‏‎ (221 revisions)
 5. Programming with Java‏‎ (212 revisions)
 6. Computer introduction‏‎ (197 revisions)
 7. Chapter:Classes I‏‎ (183 revisions)
 8. Chapter:Inheritance‏‎ (172 revisions)
 9. Designmönster (YRGO)‏‎ (149 revisions)
10. Chapter:Variables and types‏‎ (141 revisions)

Total number of edits, and average edits on this wiki:

$ w3m -dump 'http://wiki.juneday.se/mediawiki/index.php/Special:Statistics'|grep edits
Page edits since Juneday education was set up                  12,591
Average edits per page                                         12.89

Number of wiki pages on this wiki (including talk pages, redirects, etc):

$ w3m -dump 'http://wiki.juneday.se/mediawiki/index.php/Special:Statistics'|grep Pages
Pages                                                          977

The fifteen longest pages:

$ w3m -dump http://wiki.juneday.se/mediawiki/index.php/Special:LongPages|grep bytes|head -15
 1. (hist) ‎Chapter:Wrapping it up ‎[132,326 bytes]
 2. (hist) ‎Chapter:Objects in Java ‎[128,739 bytes]
    bytes]
 4. (hist) ‎Chapter:Exceptions ‎[87,540 bytes]
 5. (hist) ‎Chapter: Classes III ‎[82,316 bytes]
 6. (hist) ‎TIG058 ‎[73,427 bytes]
 7. (hist) ‎TIG015 ‎[64,985 bytes]
 8. (hist) ‎Programmering för testare (ITHS) ‎[64,283 bytes]
 9. (hist) ‎Chapter:Inheritance ‎[59,891 bytes]
10. (hist) ‎Chapter:Interfaces ‎[53,826 bytes]
11. (hist) ‎Chapter:Objects - Using - Exercises ‎[52,875 bytes]
12. (hist) ‎Android - client strategy ‎[52,621 bytes]
13. (hist) ‎Chapter: Classes II ‎[51,579 bytes]
14. (hist) ‎Assignment:SubstituteTeacherScheduler ‎[50,547 bytes]
15. (hist) ‎Java Classes Wrapping it up ‎[50,264 bytes]

The total size of the 400 longest pages (1 MB is one million characters):

$ echo $(w3m -dump -cols 200 'http://wiki.juneday.se/mediawiki/index.php?title=Special:LongPages&limit=500&offset=0'|grep bytes|head -400|tr -d ','|cut -d '[' -f2|cut -d ' ' -f1|while read bytes;do echo -n "$bytes +";done;echo 0)|bc -l|numfmt --to=si --suffix=B --padding=6
 6,1MB

Explanation: The following creates a list of the 400 longest pages: w3m -dump -cols 200 'http://wiki.juneday.se/mediawiki/index.php?title=Special:LongPages&limit=500&offset=0'%7Cgrep bytes|head -400 on the format:

 1. (hist) ‎Chapter:Wrapping it up ‎[132,326 bytes]
 2. (hist) ‎Chapter:Objects in Java ‎[128,739 bytes]
 3. (hist) ‎Questions and answers for the Programming in Java book ‎[95,054 bytes]
 4. (hist) ‎Chapter:Exceptions ‎[87,540 bytes]
...etc etc

We're after the number of bytes in each line, so |tr -d ','|cut -d '[' -f2|cut -d ' ' -f1 extracts the number, removes the comma (which is US thousands separator character). Next, we loop over each number and print a + between each number: |while read bytes;do echo -n "$bytes +";done after which we add a trailing 0 so that we can pipe the expression to bc -l. The whole expression is shell expanded before piping to bc:

echo $(some long command) | bc -l

The resulting number is a huge number of bytes. We pipe that number to numfmt in order to convert it to a human readable expression of size (converting a big number to KB, MB etc as needed).

Some examples of numfmt:

$ echo "8"|numfmt --to=si --suffix=B --padding=6
    8B
$ echo "8000"|numfmt --to=si --suffix=B --padding=6
 8,0KB
$ echo "800000"|numfmt --to=si --suffix=B --padding=6
 800KB
$ echo "8000000"|numfmt --to=si --suffix=B --padding=6
 8,0MB
$ echo "8000000000"|numfmt --to=si --suffix=B --padding=6
 8,0GB

Find open jobs as student supervisor/assistant teacher at GU

$ for url in $(lwp-request -m GET 'https://www.gu.se/omuniversitetet/aktuellt/lediga-jobb/?faculty=&category=Annan%2520undervisande%2520och%2520forskande%2520personal' | grep Studentmedarbetare|grep positionArray |tr ':' '\n' | grep detaljsida | cut -d '"' -f2); do lwp-request -m GET "https://www.gu.se${url}"|grep -A1 'LEDIGA ANST'|tail -1|sed -e 's/^[[:space:]]*//g';lwp-request -m GET "https://www.gu.se${url}"|egrep 'fieldLabel|fieldText'|egrep -A3 'ansökningsdag|Placering|Diarienummer'| w3m -T text/html -dump;echo "URL: https://www.gu.se${url}";echo;done
Studentmedarbetare, en eller flera (studieområde datavetenskap, Interaktionsdesign och Software Engineering)
Diarienummer:
PAR 2019/220
Arbetsform:
Tidsbegränsad anställning
Placering:
Inst för data- och informationsteknik
Sista ansökningsdag:
2019-03-07
URL: https://www.gu.se/omuniversitetet/aktuellt/lediga-jobb/Lediga_anstallningar-detaljsida/?id=3895

Studentmedarbetare inom forskning
Diarienummer:
PAR 2019/119
Arbetsform:
Tidsbegränsad anställning
Placering:
Inst för pedagogik och specialpedagogik
Sista ansökningsdag:
2019-02-25
URL: https://www.gu.se/omuniversitetet/aktuellt/lediga-jobb/Lediga_anstallningar-detaljsida/?id=3794

Script scraping CS Job - for job ads

We wrote a small script for searching for open jobs via https://csjobb.idg.se .

The script takes one argument, the word you want to search for, e.g. bash (if you want jobs where bash is used).

There's a lot of output from the script, but there's a summary at the end (inlcuded in the example output below).

$ ./cs_job.sh bash
( output about all job ads ommitted )

Summary:
https://csjobb.idg.se/jobb-info/57458341/production-oriented-network-technician-at-scania/
https://csjobb.idg.se/jobb-info/57458370/systemadministrator-linux/
https://csjobb.idg.se/jobb-info/57457178/devops-engineer/
https://csjobb.idg.se/jobb-info/57458302/it-sakerhetsspecialist/
https://csjobb.idg.se/jobb-info/57458294/oracle-databasadministrator/
You searched for bash
These phrases matched:

Our offer
    experience.
    initiative and ownership.
    bash, power shell, python etc).

Our offer
stötta Läkemedelsverkets utvecklare med att läsa in kod i produktion, optimera
databaser och sökningar, uppdatera utvecklings och testmiljöer med
produktionsinformation genom skriptning i t.ex. PL/SQL, SQL+, SQL, bash och
andra shellskript samt MS Power Shell.

You can find the script in our github, but here it is:

#!/bin/bash

Q="$1"
CS_URL="https://csjobb.idg.se/s%C3%B6kjobb/?Keywords="
for url in $(GET "${CS_URL}${Q}" | grep jobb-info | sort | uniq)
do
    echo "https://csjobb.idg.se${url}"
    GET "http://csjobb.idg.se${url}" |
        w3m -T text/html -dump |
        awk '/computersweden.se/,/Dela/' |
        egrep -v '•|^Dela$|\[\]'
done

echo "Summary:"
for url in $(GET "${CS_URL}${Q}" | grep jobb-info | sort | uniq)
do
    echo "https://csjobb.idg.se${url}"
done

echo "You searched for $Q"
echo "These phrases matched:"

for url in $(GET "${CS_URL}${Q}" | grep jobb-info | sort | uniq)
do
    GET "http://csjobb.idg.se${url}" |
        w3m -T text/html -dump |
        awk '/computersweden.se/,/Dela/' |
        egrep -v '•|^Dela$|\[\]' | grep -C2 -i "$Q"
done

Videos

Links

Files from the lecture

Here's the file kommuner-raw which we used to extract the municipality URLs.

Examples source code

Where to go next

« PreviousBook TOCNext »