1. Sep 07

    Denne artikkelen baserer seg mest på SQL-standarden (Oracle), men kommer også til å komme med innstikk dersom forskjellige metoder ikke fungerer i MySQL, da jeg går ut i fra at denne dialekten er den mest brukte her på forumet, men tror ikke det skal bli noe problem.

    Noen ord om forening (JOIN)

    En forening, eller JOIN som det heter på engelsk, er en rasjonell operator på lik linje som utvelgelse av kolonner eller rader som skal vises. Det er en operasjon på relasjons-databaser som brukes til å koble sammen to eller flere tabeller i en database - igjennom en felles kolonne. Dersom man bruker MySQL og InnoDB vil det som regel være primærnøkkelen og fremmednøkkelen som blir brukt som bindeledd.

    Et lite eksempel på hva man kan oppnå med forening.

    Jeg har to tabeller. Den ene inneholder personer i et register, den andre inneholder postnummer og poststed. Det jeg vil oppnå er å liste ut alle personer med tilhørende poststed. Tabellene ser slik ut (bruker relasjonell form).

    person (person_id, name, zip_code*);
     
    postal (zip_code, post_place);

    De som er understreket er primærnøkler og * markerer en fremmednøkkel. Dette er hva vi kaller en en-til-mange relasjon. For å hente ut ønsket info kan jeg bruke denne spørringen.

    SELECT t1.name, t2.post_place FROM person t1 INNER JOIN postal t2 ON t1.zip_code = t2.zip_code;

    Nå som vi har fått unna et kjapt eksempel kan vi gå over til hvilke forskjellige foreningsmetoder vi har og når vi vil bruke de.

    De jeg kommer til å gjennomgå er

    1. INNER JOIN og NATURAL JOIN
    2. LEFT OUTER JOIN
    3. RIGHT OUTER JOIN
    4. FULL OUTER JOIN
    5. CROSS JOIN (noen kjappe ord)

    INNER JOIN

    inner_join

    INNER JOIN, med LEFT/RIGHT JOIN, er nok den foreningen som kommer til å bli brukt mest. Det er noe som kalles equijoin, og betyr rett og slett at man henter ut informasjonen bundet sammen av to felles verdier i en kolonne/attributt. Kodene ovenfor er et eksempel på denne typen forening.

    Det som gjør INNER JOIN forskjellig fra noen OUTER JOIN (som LEFT/RIGHT) er at vi henter kun ut de radene (også kalt «tupler») som har verdier i begge de kolonnene som vi forener om. Om vi viderefører eksemplet ovenfor vil dette si at kun personer med poststed og kun poststedene med personer i seg blir hentet ut. Vi får ikke listet ut alle poststedene som ikke er bebodd av noen medlemmer i person-tabellen vår, og vi får heller ikke listet ut personer som ikke har noe poststed registrert.

    Eksempel på INNER JOIN finner har jeg allerede skrevet i toppen av artikkelen.

    NATURAL JOIN

    NATURAL JOIN er i all basis det samme som en INNER JOIN. Eneste forskjellen er at vi fjerner duplikatkolonner. Vi ser at både postal- og person-tabellene inneholder zip_code kolonnen. Dersom vi henter ut alle felt med en vanlig INNER JOIN vil begge disse hentes ut. Det er naturlig at vi ikke trenger denne informasjonen to ganger. Det er sløsing med dataplass/minnebruk. Dersom vi bruker projeksjon (en relasjonell operator som tillater oss å velge hvilke kolonner vi vil ha ut - f.eks SELECT field1, field2 [...]), er det ikke nødvendig med NATURAL JOIN.

    Eksempel på NATURAL JOIN

    SELECT * FROM person t1 NATURAL JOIN postal t2 ON t1.zip_code = t2.zip_code;

    LEFT OUTER JOIN

    left_outer_join

    Nå har vi beveget oss ut på ytterforening. I motsetning til INNER JOIN vil en LEFT OUTER JOIN favorisere en side av tabellene. Det er fortsatt en såkalt «equijoin». Relatert til det eksemplet vi har brukt tidligere vil det bety at vi kan hente ut alle postkodene uavhengig av om de har personer registrert til seg eller ikke - eller motsatt; alle personer uavhengig om de har registrert postkode.

    Her er OUTER et valgfritt nøkkelord i spørringen. LEFT JOIN er såvidt jeg vet det samme som LEFT OUTER JOIN.

    Eksempel på LEFT [OUTER] JOIN

    Jeg vil hente ut alle personer og dersom de har registrert poststed vil jeg også vise disse.

    SELECT t1.name, t2.post_place FROM person t1 LEFT JOIN postal t2 ON t1.zip_code = t2.zip_code;

    Du ser her at tabellen person er den tabellen som står etter FROM-nøkkelordet. Dette gjør den til en venstrestilt tabell, og det er den vi favoriserer ved å bruke LEFT JOIN.

    RIGHT OUTER JOIN

    right_outer_join

    RIGHT OUTER JOIN er i praksis veldig lik LEFT OUTER JOIN. Eneste forskjellen på disse er hvilken side vi vil favorisere. Vi ser av forrige punkt om LEFT JOIN er det person som blir favorisert. Dersom jeg bruker RIGHT JOIN er det postal-tabellen som blir hovedtabellen. Resultatet vil være en tabell over alle postkoder og tilhørende personer som er registrert. Siden vi ikke grupperer vil vi få flere resultater av samme postkode, da «tuplene» er av forskjellige kombinasjoner (forskjellige personer til samme postkode).

    Eksempel på RIGHT [OUTER] JOIN

    Jeg vil hente ut alle postkoder og dersom de har registrert personer vil jeg også vise alle disse.

    SELECT t1.name, t2.post_place FROM person t1 RIGHT JOIN postal t2 ON t1.zip_code = t2.zip_code;

    FULL OUTER JOIN

    full_outer_join

    Siden dette også er en OUTER JOIN kan vi kanskje se for oss hva vi kommer til å få. Dette er en ytterforening som ikke favoriserer noen side. Den kommer til å vise poststeder med og uten personer og personer med og uten poststed.

    Eksempel på FULL OUTER JOIN

    SELECT t1.name, t2.post_place FROM person t1 FULL OUTER JOIN postal t2 ON t1.zip_code = t2.zip_code;

    CROSS JOIN

    Denne foreningen er litt anderledes enn de vi har sett på til nå. På norsk kalles dette gjerne kryssprodukt eller kartesisk produkt. Her har vi en forening uten noe nøkkelord som JOIN. Vi bruker rett og slett flere tabeller adskilt av komma etter FROM. Uten noe seleksjon (i praksis WHERE-nøkkelordet) vil dette gi alle mulige kombinasjoner av de to tabellene sammenlagt.

    Eksempel på CROSS JOIN

    Jeg har en tabell med navn tabell1 som har kun én kolonne; tall. Denne tabellen inneholder følgende data: 1, 2, 3. Jeg har også en tabell til med navn tabell2 som inneholder akkurat samme data.

    Dersom jeg da kjører følgende spørring:

    SELECT * FROM tabell1, tabell2;

    Vil resultatet være følgende:

    [ tall | tall ]

    [ 1 | 1 ]

    [ 1 | 2 ]

    [ 1 | 3 ]

    [ 2 | 1 ]

    [ 2 | 2 ]

    [ 2 | 3 ]

    [ 3 | 1 ]

    [ 3 | 2 ]

    [ 3 | 3 ]

    Referanser

    Jeg er særdeles dårlig på norske uttrykk når det gjelder programmering og lignende. Derfor har jeg fått hjelp av boka [i]Databaser[/i] som er skrevet av Kjell Toft Hansen og Tore Mallaug.

  2. Jun 16

    Her kommer den første i en serie av Java-koder som kan være hjelpsomme for noen. Denne klassen gjør så og si det samme som

    JOptionPane.showMessageDialog() og JOptionPane.showInputDialog(), bare med mindre muligheter. Det er slik som man kan bygge ut selv. Det som er essensielt i denne koden er bakgrunnen. Gå nøye igjennom denne interne klassen, og den skal være ganske lettforståelig.

    Det følger også med en klasse helt i bunn som gjør at man kan bevege dialog-boksene ved å trykke hvor som helst inne i selve boksen.

    Kodene finner du på en egen side.

    MessageDialogInputDialog

  3. Jun 16

    I det siste har jeg jobbet litt med et lite prosjekt i å lage en Twitter-klient. Eneste formålet med prosjektet er læring. Ikke har jeg bruk for en twitter-klient eller bruker Twitter for den saks skyld. Men det er et ypperlig prosjekt å utføre for læringens skyld.

    For et best mulig resultat må jeg innom flere tema som er essensielle innen programmering; minnehåndtering (profilbilder, tabell-rendering, grafikk), egne utseender med Graphics2D, Synkronisering av tråder (Concurrency), JSON, OAuth-implementering og ikke minst mye GUI-programmering.

    Kanskje det som jeg har syns mest om er hvordan lagre lekre programmer for Mac OS plattformen i Java. Mac OS X har egentlig mange muligheter for Java når det gjelder utseende, så det er ingen grunn til at Java-programmer skal skille seg mye ut fra Cocoa-applikasjoner. Det kan vel tenke seg at det er noe unyttig å jobbe med Java til Mac OS, dersom det er en plattform-avhengig applikasjon, men ingen kunnskap er unyttig.

    Litt om klienten

    Navnet er Kvitter. Egentlig et helt tilfeldig navn fra min side. Planen var å ikke kalle det noe særlig, men siden Twitter krever at du registrerer programmet for å kunne få tilgang til OAuth, mått jeg komme opp med et navn.

    I klienten kan man gjøre det de fleste bruker Twitter til. Lese igjennom venners statuser, legge til nye venner, fjerne venner, søke etter folk, ord eller “tags”, legge til favoritter, se hvem som har skrevet til deg, se offentlige statuser og selvfølgelig da oppdatere statusen din.

    Klienten har bygd inn Growl-støtte som gjør at dersom det kommer nye statuser vil du få beskjed om det. Så lenge du har valgt dette selv. For å kommunisere med Growl bruker jeg AppleScript. Jeg kommer til å skrive litt mer om hvordan man kan gjøre dette via Java i en senere anledning.

    Lansering

    Trenger vi en ny Twitter-klient? Nei, egentlig ikke. Men såvidt jeg har sett er dette den første helnorske klienten som finnes. Jeg er enda ikke sikker på når lanseringen skjer, eller om det blir i det heletatt. Som nevnt har dette kun vært et lære-prosjekt fra min side, og ingenting annet. Men siden jeg har jobbet en del timer med den, så blir det sikkert muligheter for å laste ned klienten fra en mørk krok her på siden.

    Men det viktigste, etter min mening, er at i løpet av de neste ukene kommer jeg til å gi ut mye av de kodene jeg har jobbet med. Dette inkluderer HUD-vinduer med pil (som sett på bildet) (kan brukes som “popup” for visning av info), Growl for Java, tegning av finere dialog-bokser. Det var alt jeg kom på i farten.

    Håper på litt respons på hvordan designet på programmet er og om det er noen viktige funksjoner jeg har gått glipp av.

  4. Apr 01

    I det siste har det blitt en del programmering i Java på Mac-plattformen. Jeg driver for tiden med et program som skal kun kjøre på OS X. Hvorfor bruke Java? Skoleprosjekt.

    Det er et par ting jeg har lært under veis. Og jeg tenkte jeg skulle poste noen lenker her som jeg har hatt god bruk for.

    Apples egne dokumenter:

    Andre skriblerier:

    En ting som er mangel av i Apples dokumentasjon er hvordan du bruker det innebygde QuickTime biblioteket til å benytte iSight til å hente video eller bilder. Dersom det er av noen interesse kan jeg poste et eksempel på hvordan du kan bruke iSight og andre QuickTime-baserte web-kamera til å ta bilde.

    Senere er det også mulig jeg kommer med noen kode-eksempler på hvordan du kan lage din egen “divider” i en JSplitPane. Hvorfor lage egen divider? Den som er originalt i LAF-en (Look and feel) både til OS X og Windows er stygge, og noen ganger vinner man ikke JSplitPane UI-er som er fine nok, eller passer til programmet ditt. Senere kommer jeg med litt kode eksempler på hvordan du kan lage en JSplitPane noe lignende den du ser i OS X programmet µTorrent.

    • Feb 28

      Det er en stund siden første mission av MacHeist 3 startet, men nå, i skrivende stund, er det et nytt mission som starter. Det har allerede vært to nanomissions og et fult mission og MacHeist har til nå gitt ut 10 programmer som du kan få gratis, med lisens.

      Dersom du er interessert i gratis program og en oppfriskende utfordring ta turen innom MacHeist sine hjemmesider.