Nada

Föreläsning 12:Repetition av hela kursen.

Köra program från Java

Ett javaprogram kan köra andra program och ge kommandon till operativsystemet precis som om användaren skrivit dom i terminalfönstret. En blyg javaklass kan alltså sudda sej själv när den körs.
class Blyg                                    {
 - - -
    Runtime.getRuntime().exec("rm Blyg.class");
 - - -
Kod som anropar exec måste alltid ligga inom try-catch. Man får tänka på att den normala kommandotolken ("shell") inte finns tillgänglig, så det hade inte gått med rm *.class. Men det är lätt att låta kommandot gå genom shellet, så här.
    String kommando ="ls *.java > javafiler.txt          ;
    String[] shellkommando = {"/bin/sh", "-c",kommando}  ; 
    Runtime.getRuntime().exec(shellkommando)             ;}
Filen javafiler.txt kan senare läsas av programmet. Alternativt kan man låta utskrifterna från kommandot gå in i en BufferedInputStream som man sedan läser med vanliga Mio-anrop.

Anropa C från Java

Man kan anropa C, C++ och assemblerkod från Java och tvärtom' med hjälp av JNI, Java Native Interface. Det är långsamt och går inte från appletar, men det är inte särskilt krångligt. Rekommendationen är att hellre använda Corba eller bara skicka text fram och tillbaka med socketkommunikation. Här finns JNI-länken.

Vem skrev vad när? Meddelandehashning och tidsstämpel.

När Alice skickar ett krypterat meddelande till Bob kan inte den elaka Eve tjuvlyssna, men hon kan sabba på andra sätt. Om Alice och Bob använder krypteringsprogrammet PGP avslöjas all förvanskning eftersom meddelandehashning används. En algoritm räknar fram en hashkod för hela texten och denna hashkod krypteras med Alices hemliga nyckel och får följa med meddelandet (som ju krypteras med symmetrisk engångsnyckel). Bob avkrypterar meddelande och hashkod och kollar att hashningsalgoritmen ger just denna hashkod. Därmed vet han både att Alice skrivit meddelandet och att det är oförvanskat. Algoritmen måste vara envägs, alltså sådan att man, givet en hashkod, inte kan konstruera ett meddelande som har just den hashkoden. Nu kan inte heller Alice backa ur eventuella anbud som hon gjort - hon är juridiskt bunden till meddelandet.

För att bevisa att meddelandet skickats vid viss tidpunkt kan Alice utnyttja en tidsstämpelserver. En sådan lägger till tiden först i meddelandet, krypterar med sin secret key och skickar till Bob, som ju känner till serverns public key.

Mobilt internet

WAP-telefoner, handdatorer och allt fler apparater ansluts till Internet. Kylskåp, dammsugare och dasspappershållare kommer att ha radioförbindelse (Bluetooth) med nätet. Eftersom minneskapaciteten är begränsad får man använda en miniversion av javabiblioteket, J2ME (Java2 Micro Edition) och eftersom skärmen är minimal visar en WAP-telefon inte HTML-sidor utan WML-kort. Webservern skickar en bunt kort till en gateway som gör om WML-taggarna till binärkod för att spara utrymme. Slutligen skickas kortbunten via basstation till WAP-luren.
Problemet är att kryptering inte fungerar så bra med detta system. Från gateway till webserver sköter SSL krypteringen och mellan telefon och gateway finns ett liknande krypteringsprotokoll WTLS. Men i själva gatewayen måste det bli klartext ett ögonblick och där finns den svaga punkten. En bank kan ha en egen gateway på en skyddad plats, men tills vidare tycks dom inte vara så intresserade av det.

Frågor

  1. Du vill skriva en metod som folk ska kunna anropa för att integrera valfri funktion mellan valfria gränser. Hur ordnas det i Java?
  2. Hur skriver man en metod som beräknar en textsträng med ett arimetiskt uttryck, t ex y=value("(1+2)/(3+4)+5")?
  3. Objektmodellera en applet med pruttknapp!
  4. Vissa objekt vill man att det bara ska finnas en instans av (t ex klocka, krypterare). Hur ser man till det?
  5. Vad är vitsen med inre klasser?
  6. Två programmerare skriver ett program ihop, den ena gör grafiska användargränssnittet, den andra gör beräkningsdelen.
  7. Swingkomponenterna JButton, JFrame etc har fördelar och nackdelar i förhållande till awt. Nämn två av varje slag!
  8. Om man skrivit package pnyxtr överst i sin javafil, vad måste man då mer göra?
  9. Objektmodellera ett schackprogram!
  10. En exception brukar förknippas med att något gått snett. Ge exempel på motsatsen!
  11. Vilken sorts program är JBuilder särskilt bra för?
  12. Swingkomponenter är exempel på JavaBeans. En duktig programmerare kan skriva egna JavaBeans.
  13. Vilka begrepp och klasser är aktuella när en klient och en server kommunicerar?
  14. Du vill anropa en metod i ett objekt på en annan dator.
  15. Vad får en applet inte göra? Kan man gå runt det?
  16. På vilken dator körs en servlet? Vad får den göra?
  17. I javakod ser man ibland super() och ibland this. Förklara!
  18. Är det sant att man kan klara sej helt utan try-catch?
  19. Vad står det framför objektfanatikerns datadeklarationer och vad står det framför metoderna?
  20. Ange några grafikkomponenter som är lämpliga till en grafisk version av krypteringsprogrammet pgp!
  21. I standardutförandet ser JTree-noderna ut som mappar, men nu vill vi ha vägskyltsutseende i stället. Vad har det med Model-View-Control att göra?
  22. Ett program ska behandla en stor ordlista. Hur håller man användaren lugn under tiden?
  23. En trädstruktur byggs upp i ett program. Måste man skrota det efter körningens slut?
  24. Flera trådar letar efter ordet pnyxtr i olika filer och gör antal++ varje gång ordet hittas. Problem? Hur kan det undvikas? (Variabeln antal är global.)
  25. Vilket är enklast att tolka ? HTML eller XML?
  26. Skriv XML för T-avgångarna från Teknis!
  27. "Henrik E är en senil skitstövel", står det på en webbsida. Kan upphovsmannen straffas?


Svar

  1. Anropet kan inte se ut som value=integral(f,0,17) eftersom metoder inte får skickas med som parametrar. Lösningen är att skicka med ett objekt som bär metoden f (enligt designmönstret Command, se föreläsning 5. Det behövs alltså ett interface
    	interface Computable { public double f(double x);}
         
    så att din metod kan skrivas som
            public double integral(Computable c, double a, double b)
         
    och sedan använda c.f(x) för att få funktionsvärden.
  2. Man skriver en syntax för sådana uttryck och sedan en rekursiv parser som bygger ett binärt träd med tal i löven och operatorer i inre noder. Sedan kan man med en rekursiv tanke räkna ut värdet. Med bara plus och gånger blir syntaxen så här.
    Uttryck::= Term | Term + Uttryck
    Term   ::= Faktor | Faktor * Term
    Faktor ::= Tal | ( Uttryck )
    
  3.   ______        ______
     |Applet|      |Button|
     |______|      |______|
        ^              ^
      __|___       ____|_____          ___________
     |Pnyxtr|-----|Pruttknapp|- - - ->|ActionEvent|
     |______|     |__________|<- - - -|___________|
    
  4. Privat konstruktor och publik fabriksmetod!
      class Unik                           {
        private static Unik unik = null    ;
        private Unik(...)                  {
          - - - privat konstruktor - - -   }
        public static Unik getInstance(...){
          if(unik==null) unik=new Unik(...); 
          return unik                      ;}
        - - - övriga metoder - - -
    
  5. En inre klass har tillgång till alla variabler i den yttre klassen.
  6. Ett interface till beräkningsklassen skrivs först; sedan kan dom jobba var för sej. Riktiga main finns i GUI-klassen men även beräkningsklassen bör ha ett main för testkörning.
  7. Fördelar: Kan visa upp HTML-formaterad text, kan inramas på önskat sätt. Nackdelar: Syns inte i appletar än, större klassfiler att ladda in.
  8. Klassfilen ska läggas i en katalog som heter pnyxtr. För att import pnyxtr.*; ska fungera måste katalogen pnyxtr ligga i CLASSPATH eller i den katalog där programmet körs.
  9.   _____1  64____1 0..1_____*   1_________1    1______
     |Bräde|---|Ruta|----|Pjäs |---|Spelare  |----|Klocka|->
     |_____|   |____|    |_____|   |_________|    |______|  |  
       1|                ^  ^  ^    ^        ^              | 
     __1|___             |  |  |   _|___   __|___           | 
    |Domare |           |K|...|B| |Dator| |Person|  _____   |
    |_______|           |_|   |_| |_____| |______| |Tiden|  |
        |                                          | ute |  |
        ^- - - - - - - - - - - - - - - - - - - - <-|_____|<-
    
    Dessutom ska en domare äga två spelare, men det strecket fick inte plats i figuren.
  10. När ett program söker efter något på ett invecklat sätt och plötsligt hittar det är det lämpligt med
      throw new Exception("Yipee!");
  11. JBuilder är särskilt bra för GUI-byggande.
  12. En böna installerar sej i JBuilder. Bönor kommunicerar genom att en event för den ena kopplas till ett metodanrop i den andra (kopplingen görs med musklick).
  13. ServerSocket, Socket och Thread är viktiga klasser. Port och IP-adress är viktiga begrepp.
  14. Fjärranrop mellan javaobjekt heter RMI. Språkoberoende fjärranrop sköts av CORBA.
  15. En applet får inte läsa eller skriva filer på klientdatorn. Enklast går man runt det genom att låta användaren själv klistra in text från en fil och själv klippa ut text och spara på fil. Det går också att ställa om säkerhetskontrollen och ge appleten större rättigheter. Slutligen kan appleten be klienten ladda ner ett fristående javaprogram, som ju får göra vad som helst.
  16. Servlet körs på serverdatorn när klienten fyllt i en FORM på en webbsida. Den får göra vad som helst och den brukar returnera en ny webbsida.
  17. Om man vill anropa konstruktorn i den ärvda klassen skriver man super(), om man vill tala om sej själv som objekt skriver man this.
  18. I stället för try-catch kan man i metodhuvudet skriva throws Exception. Det gäller även main-metoden.
  19. Objektfanatikerns datafält är förstås private och hans metoder för dataåtkomst är public men för övriga metoder finns båda möjligheterna.
  20. FileDialog för att välja fil, ComboBox för att välja person, en TextArea för att visa upp texten, ett par knappar och en JFrame ska väl räcka.
  21. Om den grafiska trädnoden (view) ändras påverkar det inte den logiska trädnoden (model).
  22. En tråd som var femte sekund skriver ut hur långt ordlistan har behandlats och däremellan sover.
  23. Även den mest komplicerade struktur kan sparas på fil med en ObjectOutputStream. Alla komponenter är nämligen Serializable.
  24. Om två trådar läser av antal samtidigt kommer båda att lagra antal+1, dvs antalet ökar med ett i stället för med två. Lägg därför satsen i en metod som är synchronized.
  25. XML har sluttaggar och är därför enklare.
  26.   <?xml version="1.0">
      <station namn="Tekniska Högskolan">
        <riktning mot="Mörby">
          <vardag>
            <tid> 0610 </tid>
            <tid> 0625 </tid>
             - - -
          </vardag>
          <lördag>
            <tid> 0700 </tid>
            <tid> 0720 </tid>
             - - -
    
  27. Om Henrik lämnat sitt samtycke är det lagligt. Annars är det olagligt men inte straffbart att kalla honom skitstövel eftersom överträdelsen är ringa. Men senil gör saken värre eftersom sjukdomar är känsliga uppgifter och då är aldrig överträdelsen ringa. Enda chansen för den webbansvariga att slippa straff är att hon är journalist eller konstnär och att syftet med sidan är journalistiskt eller konstnärligt.

Sidansvarig: <erikf@nada.kth.se>
Senast ändrad 13 maj 2004
Tekniskt stöd: <webmaster@nada.kth.se>