internetteknologi (itnet2)

34
Internetteknologi (ITNET2) Præsentation 21: Common Gateway Interface (CGI) illustreret med Perl og C

Upload: telma

Post on 18-Jan-2016

30 views

Category:

Documents


0 download

DESCRIPTION

Internetteknologi (ITNET2). Præsentation 21: Common Gateway Interface (CGI) illustreret med Perl og C. Mission. Efter denne 2x35 lektion vil I: - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Internetteknologi (ITNET2)

Internetteknologi (ITNET2)

Præsentation 21:

Common Gateway Interface (CGI)

illustreret med Perl og C

Page 2: Internetteknologi (ITNET2)

Ingeniørhøjskolen i ÅrhusSlide 2

Mission

• Efter denne 2x35 lektion vil I:– Have opnået et basalt kendskab til Common Gateway

Inteface (CGI) teknologien, med udgangspunkt i Perl, og forstå dens ligheder og forskelle med andre server side teknologier, såsom JSP/Servlets og ASP.NET

– Dette er ikke et Perl kursus – så I vil ikke have lært Perl– Have set hvordan alternativt C kan anvendes m.f.

Page 3: Internetteknologi (ITNET2)

Ingeniørhøjskolen i ÅrhusSlide 3

Indhold i denne præsentation

• Kort introduktion til CGI• Hvordan virker det?• Eksempler på CGI og Perl• Om fremtiden for CGI og Perl• CGI og C

Page 4: Internetteknologi (ITNET2)

Ingeniørhøjskolen i ÅrhusSlide 4

Hvad er “CGI”?

• Common Gateway Interface• Standard til at afvikle et eksekverbart program

(eller et script i Perls tilfælde) via Web servere– Web serveren skal blot vide hvem der har ansvaret for

at afvikle koden, hvorefter den redelegere requestet

• (Næsten) alle sprog kan bruges til at lave CGI programmer med (standard in/out + environment)– Herunder C/C++ , og de mest anvendte Perl og Python

• CGI/Perl/C var i mange år det foretrukne værktøj til dynamisk server-side programmering, indtil ASP/ASP.NET, JSP/Servlets, PHP kom frem

Page 5: Internetteknologi (ITNET2)

Ingeniørhøjskolen i ÅrhusSlide 5

CGI Historie

• Opfundet af NCSA Software Development Group– 1993? Svært at finde en præcis reference– Samme som opfandt Mosaic browseren (forløberen til

Netscape)– Og NCSA httpd (én af de første web servere)– Find specificationen på:– http://hoohoo.ncsa.uiuc.edu/cgi/interface.html – Er i dag reelt en defacto standard for program kald

Page 6: Internetteknologi (ITNET2)

Ingeniørhøjskolen i ÅrhusSlide 6

Server side scripting - CGI

1 HTTP Request (over TCP/IP)GET /feedback.pl

Bruger indtaster data i form feltet i browser og taster submit:http://feedbackForm.htm

2

Webserveren modtager requestet:Finder det rette program via CGI interfacet, feks. (feedback.pl)En ny proces spawnes og programmet afvikles med de givne parametre, og resultatet afleveres på output stream

3

En typisk Header kunne se ud som følger:

HTTP/1.0 200 OKServer: Netscape-Communications/1.1 Date: Tuesday, 25-Nov-97 01:22:04 GMT Last-modified: Thursday, 20-Nov-97 10:44:53 GMT Content-length: 6372 Content-type: text/html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">

<HTML> ...her følger resten af dokumentet

Browseren modtager response:Renderer HTML dokumentet tilbrugervenlig form

Webserver findes via IP adresse & DNSLytter på port f.eks. 80

LIGHEDER MED ASP/JSP?LIGHEDER MED ASP/JSP?

Page 7: Internetteknologi (ITNET2)

Ingeniørhøjskolen i ÅrhusSlide 7

Eksempler

• I har prøvet at bruge både Servlets/JSP, PHP og ASP.NET – nu skal vi se hvordan CGI fungerer i relation til først et C eksempel og herefter et Perl eksempel

• Her følger et par slides der kort illustrere dette

Page 8: Internetteknologi (ITNET2)

Ingeniørhøjskolen i ÅrhusSlide 8

Server side:Servlet eksempel

import java.io.*;import javax.servlet.*;import javax.servlet.http.*;

public class HelloWorld extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<body>"); out.println("<head>"); out.println("<title>Hello World!</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>Hello World!</h1>"); out.println("</body>"); out.println("</html>"); }}

Vi ser at HTML er indlejret.

<html><head><title>Hello World!</title></head><body bgcolor="white"><a href="/examples/servlets/helloworld.html"><img src="/examples/images/code.gif" height=24 width=24 align=right border=0 alt="view code"></a><a href="/examples/servlets/index.html"><img src="/examples/images/return.gif" height=24 width=24 align=right border=0 alt="return"></a><h1>Hello World!</h1></body></html>

Resultatet

Page 9: Internetteknologi (ITNET2)

Ingeniørhøjskolen i ÅrhusSlide 9

#include <stdio.h>

main(int argc, char *argv[]) {

char *cl;

printf("Content-type: text/html%c%c",10,10);

if(strcmp(getenv("REQUEST_METHOD"),"GET")) { printf("This script should be referenced with a METHOD of POST.\n"); exit(1); } else { printf("<p>You have contacted me using the POST method</p>"); }

cl = getenv("QUERY_STRING"); printf("<p>"); printf("The Content of Query_String was: "); printf(cl); printf("</p>"); return 0;}

Server sideCGI/C Page

Vi anvender getenv til at kommunikere med serveren (environment variable)

HTTP Get parametre strengen

Kommer i env-var QUERY_STRING

Alt vi skal bruge er standard IO

Page 10: Internetteknologi (ITNET2)

Ingeniørhøjskolen i ÅrhusSlide 10

1 #!/usr/bin/perl2 # Fig. 27.11: fig27_11.pl3 # Program to display CGI environment variables.4 5 use CGI qw( :standard );6 7 $dtd =8 "-//W3C//DTD XHTML 1.0 Transitional//EN\"9 \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd";10 11 print( header() );12 13 print( start_html( { dtd => $dtd,14 title => "Environment Variables..." } ) );15 16 print( "<table style = \"border: 0; padding: 2;17 font-weight: bold\">" );18 19 print( Tr( th( "Variable Name" ),20 th( "Value" ) ) );21 22 print( Tr( td( hr() ), td( hr() ) ) );23 24 foreach $variable ( sort( keys( %ENV ) ) ) {25 26 print( Tr( td( { style => "background-color: #11bbff" }, 27 $variable ),28 td( { style => "font-size: 12pt" }, 29 $ENV{ $variable } ) ) );30 31 print( Tr( td( hr() ), td( hr() ) ) );32 }33 34 print( "</table>" );35 print( end_html() );

Server sideCGI/Perl Page

Metoderne kommer fra

CGI bibliotektet

CGI bibliotektet wrapper kommunikation med web serveren

Page 11: Internetteknologi (ITNET2)

Ingeniørhøjskolen i ÅrhusSlide 11

Hvad skal der til for at køre CGI

• JSP og Servlets bruger en ”Servlet Container” m. egen VM– Apache Tomcat, BEA Weblogic, Oracle AS, IBM WebSphere – alle

standardiseret

• ASP & ASP:NET bruger Windows og IIS Web server / .NET CLR

• CGI/Perl er understøttet af stort set alle Web servere og operativsystemer, men der skal evt. downloades en operativsystem specifik perl fortolker.– Brug f.eks. Apache Web serveren, med mod_cgi/mod_perl modulet tilføjet

• CGI/C – CGI/C++ såfremt det kan kompileres på platformen kan det som regel også afvikles af Web serveren hvis den understøtter CGI (som f.eks. Apache)

Page 12: Internetteknologi (ITNET2)

Ingeniørhøjskolen i ÅrhusSlide 12

PERL

• PERL: Practical Extraction and Report Language– Høj-niveau programmeringssprog– Fortolket programmeringssprog (perl.exe)– Løst typet– Bruges som konsol sprog af administratorer til

overvågning og rapporteringsopgaver– Virkeligt stærkt til streng behandling– Vandt derfor tidligt indpas på WWW i forb. Med CGI– (www.perl.com)

Page 13: Internetteknologi (ITNET2)

Ingeniørhøjskolen i ÅrhusSlide 13

PERL History

• Opfundet af Larry Wall i 1987• Perl 2: 1988• Perl 3: 1989• Perl 4: 1992

– Standard in UNIX – small programs only

• Perl 5: 1994– Full programming language – total rewrite– Subversions of Perl 5

• Rasmus Lehrdorf uses Perl to create PHP: 1995• PerlNET: .NET Wrapper for Perl (runs unmanged)• Perl 6: currently under development (open source)

– New: VM instead of interpreter

Page 14: Internetteknologi (ITNET2)

Ingeniørhøjskolen i ÅrhusSlide 14

Fig27_11.pl1 #!/usr/bin/perl2 # Fig. 27.11: fig27_11.pl3 # Program to display CGI environment variables.4 5 use CGI qw( :standard );6 7 $dtd =8 "-//W3C//DTD XHTML 1.0 Transitional//EN\"9 \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd";10 11 print( header() );12 13 print( start_html( { dtd => $dtd,14 title => "Environment Variables..." } ) );15 16 print( "<table style = \"border: 0; padding: 2;17 font-weight: bold\">" );18 19 print( Tr( th( "Variable Name" ),20 th( "Value" ) ) );21 22 print( Tr( td( hr() ), td( hr() ) ) );23 24 foreach $variable ( sort( keys( %ENV ) ) ) {25 26 print( Tr( td( { style => "background-color: #11bbff" }, 27 $variable ),28 td( { style => "font-size: 12pt" }, 29 $ENV{ $variable } ) ) );30 31 print( Tr( td( hr() ), td( hr() ) ) );32 }33 34 print( "</table>" );35 print( end_html() );

The import tag :standard imports a predefined set of standard functions.

The use statement instructs Perl programs to include the contents (e.g., functions) of predefined packages called modules.

Instruct the Perl script to print a valid HTTP header, using function header from the CGI library.

The start_html function prints the document type definition for this document, as well as several opening XHTML tags (<html>, <head>, <title>, etc., up to the opening <body> tag).

The %ENV hash is a built-in table in Perl that contains the names and values of all the environment variables.

Function keys returns an unordered array containing all the keys in the %ENV hash.

Specifies the value for the attribute style.

Page 15: Internetteknologi (ITNET2)

Ingeniørhøjskolen i ÅrhusSlide 15

Program Output

Page 16: Internetteknologi (ITNET2)

Ingeniørhøjskolen i ÅrhusSlide 16

Eksempel på brug af parametre

• Vi husker fra JSP/Servlets og ASP, at alt kommunikation primært foregik via FORM elementer

• Dette er også tilfældet i CGI/Perl

• I det følgende gives et eksempel på dette– Først en simpel registreringsform– Og herefter en CGI/Perl side der henter data fra HTTP

requestet

Page 17: Internetteknologi (ITNET2)

Ingeniørhøjskolen i ÅrhusSlide 17

Fig27_12.html

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"2 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">3 4 <!-- Fig. 27.12: fig27_12.html --> 5 6 <html>7 <head>8 <title>Sample form to take user input in XHTML</title>9 </head>10 11 <body style = "font-face: arial; font-size: 12pt">12 13 <div style = "font-size: 14pt; font-weight: bold">14 This is a sample registration form.15 </div>16 17 <br /> 18 Please fill in all fields and click Register.19 20 <form method = "post" action = "/cgi-bin/fig27_13.pl">21 22 <img src = "images/user.gif" /><br />23 24 <div style = "color: blue" >25 Please fill out the fields below.<br />26 </div>27 28 <img src = "images/fname.gif" />29 <input type = "text" name = "fname" /><br />30 <img src = "images/lname.gif" />31 <input type = "text" name = "lname" /><br />32 <img src = "images/email.gif" /> 33 <input type = "text" name = "email" /><br />34 <img src = "images/phone.gif" /> 35 <input type = "text" name = "phone" /><br />

Form element which indicates that, when the user clicks Register, the form information is posted to the server. The statement action = "cgi-bin/ fig27_13.pl" directs the server to execute the fig27_13.pl Perl script (located in the cgi-bin directory) to process the posted form data.

Exactly like JSP/PHP/ASP.NET

Page 18: Internetteknologi (ITNET2)

Ingeniørhøjskolen i ÅrhusSlide 18

Fig27_12.html

36 37 <div style = "font-size: 10pt">38 Must be in the form (555)555-5555.<br /><br />39 </div>40 41 <img src = "images/downloads.gif" /><br />42 <div style = "color: blue">43 Which book would you like information about?<br />44 </div>45 46 <select name = "book">47 <option>Internet and WWW How to Program 2e</option>48 <option>C++ How to Program 3e</option>49 <option>Java How to Program 4e</option>50 <option>XML How to Program 1e</option>51 </select><br /><br />52 53 <img src = "images/os.gif" /><br />54 <div style = "color: blue">55 Which operating system are you currently using?56 </div><br />57 58 <input type = "radio" name = "os" 59 value = "Windows NT" checked /> 60 Windows NT<input type = "radio" 61 name = "os" value = "Windows 2000" /> 62 Windows 2000<input type = "radio" 63 name = "os" value = "Windows 98/me" /> 64 Windows 98/me<br /><input type = "radio" 65 name = "os" value = "Linux" /> 66 Linux<input type = "radio" name = "os" 67 value = "Other" /> 68 Other<br /><input type = "submit" 69 value = "Register" />70 </form>

Page 19: Internetteknologi (ITNET2)

Ingeniørhøjskolen i ÅrhusSlide 19

Fig27_12.html

Program Output

71 </body>72 </html>

Page 20: Internetteknologi (ITNET2)

Ingeniørhøjskolen i ÅrhusSlide 20

Fig27_13.pl

1 #!/usr/bin/perl2 # Fig. 27.13: fig27_13.pl3 # Program to read information sent to the server4 # from the form in the fig27_12.html document.5 6 use CGI qw( :standard );7 8 $os = param( "os" );9 $firstName = param( "fname" );10 $lastName = param( "lname" );11 $email = param( "email" );12 $phone = param( "phone" );13 $book = param( "book" );14 15 $dtd =16 "-//W3C//DTD XHTML 1.0 Transitional//EN\"17 \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd";18 19 print( header() );20 21 print( start_html( { dtd => $dtd,22 title => "Form Results" } ) );23 24 if ( $phone =~ / ^ \( \d{3} \) \d{3} - \d{4} $ /x ) {25 print( "Hi " );26 print( span( { style => "color: blue; font-weight: bold" }, 27 $firstName ) );28 print( "!" );29 30 print( "\nThank you for completing the survey." );31 print( br(), "You have been added to the " );32 33 print( span( { style => "color: blue; font-weight: bold" },34 $book ) );35 print( " mailing list.", br(), br() );

Function param is part of the Perl CGI module and retrieves values from a form field’s value.

Same as ASP’s Request(”param”) & JSP’s request.getParameter(”param”)

The if condition uses a regular expression to validate the phone number. The expression “\(” matches the opening parenthesis of the phone number. This sequence must be followed by three digits (\d{3}), a closing parenthesis, three digits, a hyphen and finally, four more digits.

Dette kan også gøres i både JSP og ASP, men også i JavaScript – Client side

Page 21: Internetteknologi (ITNET2)

Ingeniørhøjskolen i ÅrhusSlide 21

Fig27_13.pl

36 37 print( span( { style => "font-weight: bold" },38 "The following information has39 been saved in our database: " ), br() );40 41 print( table(42 Tr( th( { style => "background-color: #ee82ee" }, 43 "Name" ),44 th( { style => "background-color: #9370db" }, 45 "E-mail" ),46 th( { style => "background-color: #4169e1" }, 47 "Phone" ),48 th( { style => "background-color: #40e0d0" }, 49 "OS" ) ),50 51 Tr( { style => "background-color: #c0c0c0" },52 td( "$firstName $lastName" ),53 td( $email ),54 td( $phone ),55 td( $os ) ) ) );56 57 print( br() );58 59 print( div( { style => "font-size: x-small" },60 "This is only a sample form. You have not been61 added to a mailing list." ) ); 62 }63 else {64 print( div( { style => "color: red; font-size: x-large" },65 "INVALID PHONE NUMBER" ), br() );66 67 print( "A valid phone number must be in the form " );68 print( span( { style => "font-weight: bold" },69 "(555)555-5555." ) );70

If the phone number is not valid an error message is printed to the client

Methods span and div add <span> and <div> tags to the page, respectively.

Page 22: Internetteknologi (ITNET2)

Ingeniørhøjskolen i ÅrhusSlide 22

Fig27_13.pl

Program Output

71 print( div( { style => "color: blue" },72 "Click the Back button, and enter a73 valid phone number and resubmit." ) );74 print( br(), br() );75 print( "Thank you." );76 }77 78 print( end_html() );

Page 23: Internetteknologi (ITNET2)

Ingeniørhøjskolen i ÅrhusSlide 23

Using Extra Libraries for C

• Standard Libraries available

• Wraps the reading of env and stdin

• Special HTML functions

• Sessions etc

Simplified query-results.cgi using cgihtml.

#include "cgi-lib.h"#include "html-lib.h"

int main(){   llist entries

   read_cgi_input(&entries);   html_header();   html_begin("Query Results");   print_entries(entries);   html_end();   list_clear(&entries);}

Page 24: Internetteknologi (ITNET2)

Ingeniørhøjskolen i ÅrhusSlide 24

Eksempel på brug af Server-Side Includes (SSI eller .shtml)

• Det er også muligt at opnå JSP/ASP lignende funktionalitet, dvs. med indlejrede ”tags”

• Fra SHTML kan kommandoen ”EXEC” kaldes, der kalder et andet CGI script, og inkluder dets output – svarende til Server.Execute(”side.asp”) i ASP, og <jsp:include page=”side.jsp”/> i JSP.

• I det følgende gives et eksempel på dette

Page 25: Internetteknologi (ITNET2)

Ingeniørhøjskolen i ÅrhusSlide 25

Fig27_14.shtml

1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"2 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">3 4 <!-- Fig. 27.14: fig27_14.shtml -->5 6 <html>7 <head>8 <title>Using Server Side Includes</title>9 </head>10 11 <body> 12 <h3 style = "text-align: center">13 Using Server Side Includes14 </h3>15 16 <!--#EXEC CGI="/cgi-bin/fig27_15.pl" --><br />17 18 The Greenwich Mean Time is 19 <span style = "color: blue">20 <!--#ECHO VAR="DATE_GMT" -->.21 </span><br />22 23 The name of this document is 24 <span style = "color: blue">25 <!--#ECHO VAR="DOCUMENT_NAME" -->.26 </span><br />27 28 The local date is 29 <span style = "color: blue"> 30 <!--#ECHO VAR="DATE_LOCAL" -->.31 </span><br />32

The command EXEC can be used to run CGI scripts and embed their output directly into a Web page.

The ECHO command displays variable information. The ECHO command is followed by the keyword VAR and the name of the variable. For example, variable DATE_GMT contains the current date and time in Greenwich Mean Time (GMT).

Page 26: Internetteknologi (ITNET2)

Ingeniørhøjskolen i ÅrhusSlide 26

Fig27_14.shtml

33 This document was last modified on 34 <span style = "color: blue">35 <!--#ECHO VAR="LAST_MODIFIED" -->.36 </span><br />37 38 Your current IP Address is 39 <span style = "color: blue"> 40 <!--#ECHO VAR="REMOTE_ADDR" -->.41 </span><br />42 43 My server name is 44 <span style = "color: blue">45 <!--#ECHO VAR="SERVER_NAME" -->.46 </span><br />47 48 And I am using the 49 <span style = "color: blue"> 50 <!--#ECHO VAR="SERVER_SOFTWARE" -->51 Web Server.52 </span><br />53 54 You are using 55 <span style = "color: blue"> 56 <!--#ECHO VAR="HTTP_USER_AGENT" -->.57 </span><br />58 59 This server is using 60 <span style = "color: blue"> 61 <!--#ECHO VAR="GATEWAY_INTERFACE" -->.62 </span><br />63 64 <br /><br />65 <div style = "text-align: center;66 font-size: xx-small">67 <hr />

Page 27: Internetteknologi (ITNET2)

Ingeniørhøjskolen i ÅrhusSlide 27

Fig27_14.shtml

Program Output

68 This document was last modified on 69 <!--#ECHO VAR="LAST_MODIFIED" -->.70 </div>71 </body>72 </html>

Page 28: Internetteknologi (ITNET2)

Ingeniørhøjskolen i ÅrhusSlide 28

Fig27_15.pl

1 #!/usr/bin/perl2 # Fig. 27.15: fig27_15.pl3 # Program to track the number of times4 # a Web page has been accessed.5 6 use CGI qw( :standard );7 8 open( COUNTREAD, "counter.dat" );9 $data = <COUNTREAD>;10 $data++;11 close( COUNTREAD );12 13 open( COUNTWRITE, ">counter.dat" );14 print( COUNTWRITE $data );15 close( COUNTWRITE );16 17 print( header(), "<div style = \"text-align: center;18 font-weight: bold\">" );19 print( "You are visitor number", br() );20 21 for ( $count = 0; $count < length( $data ); $count++ ) {22 $number = substr( $data, $count, 1 );23 print( img( { src => "images/$number.gif" } ), "\n" );24 }25 26 print( "</div>" );

The file counter.dat, which contains the number of hits to date for the fig27_14.shtml Web page, is opened for input. Function open is called to create a filehandle to refer to the file during the execution of the script.

Page 29: Internetteknologi (ITNET2)

Ingeniørhøjskolen i ÅrhusSlide 29

POOP: OO Perl

• OO understøttelse i Perl: POOP• Minder lidt om PHP 4 modellen• http://www.codeproject.com/perl/camel_poop.asp

Page 30: Internetteknologi (ITNET2)

Ingeniørhøjskolen i ÅrhusSlide 30

Perl og Databaser

• Også mulighed for DB adgang i PERL: DBI• F.eks. MySQL drivere tilgængelige• Se Deitel & Deitel eller www.perl.com

Page 31: Internetteknologi (ITNET2)

Ingeniørhøjskolen i ÅrhusSlide 31

CGI vs øvrige server-side sprog

• Performance– CGI programmer spawnes og afsluttes for hver client

request• performer dårligt ved mange samtidige request• Udover ny proces skal der også spawnes perl.exe (ved perl)

– JSP/Servlets, ASP.NET og PHP håndterer flere samtidige requests mere intelligent

• performer bedre ved mange samtidige request

• Struktueringsmekanismer– Afhængigt af underliggende sprog– Ringe kontakt mellem CGI scripts og Web server– Mangler grundliggende objekter (f.eks. Session

objektet) hvilket dog kan findes via eksterne libs

Page 32: Internetteknologi (ITNET2)

Ingeniørhøjskolen i ÅrhusSlide 32

Performance Comparison of Alternative Solutions For Web-To-Database Applications, by AMANDA W. WU, HAIBO WANG AND DAWN WILKINS, October 2000http://rain.vislab.olemiss.edu/~ww1/Slide_Show_Images/SCC_Amanda/SCC_Amanda.pdf

Page 33: Internetteknologi (ITNET2)

Ingeniørhøjskolen i ÅrhusSlide 33

Om fremtiden for CGI I

• Generelt kan man lave de fleste ting du kan lave i JSP/Servlets og/eller ASP/ASP.NET- i CGI/Perl, (eller CGI med et andet sprog)– Databaser, filadgang, regulære udtryk, algebra, logik …

• Samtidigt findes der ufatteligt mange eksisterende scripts der kan køres, og mange sites bruger stadigvæk CGI til f.eks. Counter, FormMails, gæstebøger osv.

Page 34: Internetteknologi (ITNET2)

Ingeniørhøjskolen i ÅrhusSlide 34

Om fremtiden for CGI II

• MEN: – CGI ikke velegnet til at udvikle større systemer– CGI har ikke IDE og debugging faciliteter– Svært at strukturere – Stærkt begrænset popularitet

• DOG: – Vigtigt at kende teknologien – både historisk set – men også fordi

der stadigvæk kører masser af CGI programmer hos kunder– Anvendeligt til indlejrede enheder– Godt til afvikling af ekstremt krævende databehandlingsalgoritmer