Gå til innhold

tasle

Medlemmer
  • Innlegg

    365
  • Ble med

  • Besøkte siden sist

Innlegg skrevet av tasle

  1. Det er like greit å ha all dokumentreferansene i en datafil (tabell). I et "worst case" scenario vil maks. antall søk for 500 000 dokumenter i en indeks bli 19 søk, dersom databasen bruker binære trær for indeksering (som er mest vanlig).

     

    Antall søk = Heltallet (Log (500000) / Log (2)) + 1

     

    Middelverdien av antall søk blir 18 i dette tilfellet.

     

    Skal du ha dokumentreferansene i flere filer blir antall søk noe lavere, men tiden for åpning / endring av tabeller vil være forholdsvis høy i denne sammenhengen.

  2. Det må bli ADA for dette programmeringspråket er kun en dialektvariant av Delphi (Objekt-pascal), og til dels også C med C++ når det gjelder funksjoner, løkker, variabeltildelinger o.l. Jeg "oversetter stadig vekk C-programmer til Delphi.

     

    LISP er "helt fjernt" fra Delphi, etter min oppfatning. Har brukt Lisp endel for noen år siden, det er kjekt til matematiske (numeriske) problemer, men er ellers litt "bakvendt".. Tidligere var Lisp ikke objektorientert, men finnes nå med CLOS (Common Lisp Object System)

  3. .Net er i grove trekk applikasjoner som trenger å samhandle med andre systemer med samme teknologi. Da spiller det ingen rolle om programmeringsspråket er basert på VB, Delphi eller andre .Net-kompatible systemer, eller forskjellige CPU'er og operativsystemer. Funksjonaliteten blir det vesentlige, slik som overføringsprotokoller, lagring av data, kryptografi etc..

    .NET komponenter i Delphi er laget for å samhandle med slike applikasjoner, og .NET fra M$ må være installert på maskinen der et slikt program kjøres.

     

    Win32-applikasjoner brukes som lokale programmer på en maskin hvor en felles databasert standard ikke er noen krav.

     

    I grove trekk...

  4. Prøv noe a la disse to prosedyrene (Swap og Perm):

     TForm1 = Class (TForm)
       LB1: TListBox;
       Memo1: TMemo;
       Button1: TButton;
       Procedure Button1Click (Sender: TObject);
     Private
       { Private declarations }
     Public
       { Public declarations }
       Procedure Swap (var V: Array Of Integer; I, J: Integer);
       Procedure Perm (Var V: Array Of Integer; n, I: Integer);
     End;
    
    Var
     Form1                          : TForm1;
     V                              : Array Of Integer;
    
    Procedure TForm1.Swap (var V: Array Of Integer; I, J: Integer);
    Var
     T                              : Integer;
    Begin
     T:= V (.I.);
     V (.I.):= V (.J.);
     V (.J.):= T;
    End;
    
    
    Procedure TForm1.Perm (Var V: Array Of Integer; n, I: Integer);
    Var
     J                              : Integer;
     S                              : String;
    Begin
     If I = n Then
       Begin
         S:= '';
         For J:= 0 To n -1 Do
           Begin
             S:= S + ' '+ IntToStr (V (.J.));
           End;
         LB1.Items.Add (S);
       End
     Else
       For J:= I To n - 1 Do
         Begin
           Swap (V, I, J);
           Perm (V, n, I + 1);
           Swap (V, I, J);
         End;
    End;
    
    
    
    Procedure TForm1.Button1Click (Sender: TObject);
    Var
     L, I                           : Integer;
    Begin
     L:= Memo1.Lines.Count;
     SetLength (V, L);
    
     For I:= 0 To Memo1.Lines.Count - 1 Do
       V (.I.):= StrToInt (Memo1.Lines (.I.));
     Perm (V, L, 0);
    End;
    

     

    Jeg bruker Memo1 som input av tallene, ett tall pr. linje.

    Listboksen (LB1) er for utskrift av permutasjonene.

  5. Er det slik å forstå at du har to separate tråder som hver utfører sine egne separate beregninger uavhengig av hverandre, eller er de to trådene avhengig av hverandre for beregningene (for eksempel at den ene tråden venter på svaret av en beregning fra den andre tråden)?

     

    I førstnevnte tilefelle må man jo kunne si at dette var dårlige greier. Hvis det andre tilfellet gjelder, så er det kanskje ikke så underlig at resultatet blir slik det blir.

  6. --> Tasle, hva mener du med porter fra å med 49152 ?? er de utenfor firewall els?

     

    Portnumre over 49152 er porter som ikke er avsatt for noe spesielle formål, disse kan man bruke fritt uten å komme i konflikt med evn. andre programmer. Eksempelvis port 110 er POP3 osv. Da er det greit å bruke portnumre som ikke er definert å tilhøre noen spesielle programmer.

     

    En firewall takler alle porter på samme måte, uansett nummer.

  7. Application.ProsessMessages brukes ikke i og for seg til å avbrryte programmet, det må du gjøre med andre midler, f.eks. ved å klikke på en avslutningsknapp eller en tast på tastaturet.

     

    Men opprinnelig hadde du motorkontrollen i en evigvarende løkke som det ikke var nubbtjangs å bryte inn i. Når du legger til Application.ProsessMessages så skjer dette: Windows får tid til å behandle andre hendelser (messages) i ditt program, hvis du museklikker på en knapp i ditt program, vil Windows klare å fange opp museklikket uten å være 100 % opptatt med løkka di. En Application.ProsessMessages gjør at Windows stopper opp et lite millisekund og spør seg selv "har det skjedd noe rundt omkring, enten i dette programmet eller i andre programmer, som jeg må være oppmerksom på?" Hvis ingenting har skjedd, så fortsetter løkka di en runde til, hvis det er kommet en message fra en knapp eller noe annet, vil windows behandle den, f.eks. sette en variabel til true, slik som i eksemplet mitt.

     

    Jeg skjønner at det er litt kritisk hva stepmotoren driver med, så dette må du prøve ut i praksis for å se effekten av nøyaktigheten. Hvor langt "avbruddet" med en Application.ProsessMessages egentlig blir i praksis vil avhenge fra PC til PC, hvor kjappe de er.

  8. Ser at hele programmet "låser" seg under sleep, finnes det noe alternativ til dette som gjør at programmet fortsatt svarer?

    5305162[/snapback]

     

    Det låser seg fordi du har en uheldig og evigvarende løkk der.

     

    Bruk heller noe sånt som

    Repeat
     Out32($378,3);
     Sleep (7);
     Out32($378,5);
     Sleep (7);
     Out32($378,9);
     Sleep (7);
     Out32($378,17);
     Sleep (7);
     [B]Application.ProcessMessages;[/B]
    Until Ferdig;
    

     

    Ferdig kan (må) være en global variabel, eller tilhøre objektet.

    Ferdig er i utgangspunktet satt til False, men endres f.eks. av å klikke på en knapp der du setter den til True.

     

    Avhengig av hvor kjapp motoren er til å reagere, må du i verste fall bruke

    Application.ProcessMessages;

    for hver Out32.

     

    Application.ProcessMessages gjør at programmet fanger opp et klikk på en stopp-knapp. Med bare en Application.ProcessMessages kan det hende at du må vente i noen sekunder før programmet reagerer.

     

    Jeg regner med at stepmotoren ikke er så veldig tidskritisk heller, at du trenger spesialtimere til dette. Det er vel neppe et F-16 jagerfly som skal kontrolleres..

  9. Ad 1)

    Her bør du bruke Forfattere (med forfatter-ID, og andre faste data for hver hver forfatter) som entitet. (En forfatter -> har mange artikler). Tittel og tid hører til en artikkel, og da bør du ha en annen entitet (tabell) for Artikler, med attributter (datafelt) som gjelder for hver artikkel, inkludert tittel og tid.

     

    Ad 2)

    En ingress kan være greit å ha med i en egen entitet (tabell) for Ingresser. Ikke glem nøkkel (ID) for ingressene og artiklene i Artikler. En slik Identifikator behøver ikke være numerisk, den kan du konstruere etter behov. Eksempelvis en sammensatt nøkkel bestående av ForfatterID+Dato+Artikkelnr.

     

    Ad 3)

    Her spør du også om størrelser (kapasitet) for et tekstfelt. Jeg aner ikke hvilket databasesystem du har i tankene, men de fleste databasesystemer har mulighet for såkalte BLOB-felt (Binary Large Objects) som vanligvis benyttes til eksempelvis bilder og andre attributter som har en stor størrelse. Sjekk med manualen for det datasystemet hva størrelsen av et tekstfelt kan være...

     

    Relasjonene mellom Forfattere og Ingresser blir 1:m. Mellom Forfattere og Artikler blir også 1:m, og mellom Ingresser og artikler blir 1:1. I tillegg mellom Forfattere og Ingresser 1:m.

     

    Lykke til !

  10. De har nok det gjort etter oppskrifta med phpBB2, og normalisert som bare det...

    Tabellen "Medlemmer" har flere oppføringer i tabellen "Tekster (innlegg)" for hvert medlem, så har de funnet ut at det er greitt å ha en kjapp tilgang til andre ting i andre separate tabeller, gjerne for statistiske formål eller andre ting. Felles er 1-til-mange mellom enten alle, eller de fleste av tabellene.

     

    I tillegg har de nok helt sikkert en separat tabell for alle diskusjonsgrupper og Topics der en topic kan ha flere innlegg (en Diskusjonsgruppe kan være Hardware, Overklokking, Spill, Programmering osv), og en relasjon der hver Diskusjonsgruppe er en-til-mange mot undergrupper slik som her med databasegruppe, forskjellige programmeringsgrupper o.l.

     

    Så til ditt første innlegg igjen, som jeg har nevnt tidligere, tabellene blir mindre og kjappere å søke i. Normalisering (mindre tabeller, kjappere respons) er deres gode grunn for å gjøre det slik. De har gått veien om 1. normalform, 2. normalform,... og helt til Boyes-Codd's normalform, mest sannsynlig. Slike diskusjonsfora kan fort bli temmelig svære med mange innlegg, og om alt var samlet i en tabell ville det tatt"evigheter" for å finne frem til et enkelt innlegg. Og det hele ville gitt en enorm datafil (tabell).

     

    Så får du bare ha meg unnskyldt at jeg har blandet inn andre ting, men det er gjort for forhåpentligvis å lette forståelsen av en slik datamodell. :)

  11. Ved normalisering er det kun 3 mulige relasjoner:

    1) En-til-en (1:1)

    2) En-til-mange (1:m)

    3) Mange-til-mange (m:m)

     

    En m:m relasjon kan ikke brukes i praksis fordi det ikke er mulig å entydig definere identifikatoren i noen av de to tabellene. Eksempel: To forskjellige personer har samme personnummer.

    Dette løser man med å splitte opp en m:m relasjon (to tabeller) til 3 tabeller og får dermed to 1:m relasjoner.

     

    Spørsmålet ditt har du i grunnen funnet svar på selv, en 1:m er helt OK, du kan godt ha mange tekster til en hovedpost. Eksempel "En bok har mange kapitler", eller

    En CD tittel har mange låter

    I det sistnevnte tilfellet (som kanskje er det mest praktiske av disse to) har man da to tabeller:

     

    Tabell 1:

    CD-Nr (som ID)

    Tittel

    Artist

    Utgitt dato

    Sjanger

     

    Tabell 2:

    CD-Nr (ID)

    Navn på låten

    Varighet av låten

     

    Disse to tabellene knyttes sammen som en relasjon vha. CD-nr. som en 1:m relasjon (det er derfor det kalles for en relasjonsdatabase). Prinsippet brukes stort sett for alle praktiske formål når man lagrer data. Unntaksvis er små og særdeles enkle tabeller der antall poster aldri blir særlig stort (10-20-30 poster), da er liksom jobben med å normalisere større enn gevinsten.

     

    Poenget med normalisering er å unngå "dobbeltlagring" av data. I eksemplet over ville man fått repeterende lagring av Tittel, Artist, Utgitt dato, Sjanger om man velger å bruke kun en tabell, fordi disse feltene måtte repeteres for hver enkelt låt i CD-tabellen om man hadde kun en tabell.

     

    Begge tabellene er naturligvis indeksert. Det betyr at de er alfabetisk sortert etter CD-nr. I praksis brukes balanserte, binære trær som en svært hurtig mekanisme ved lagring og søking.

    Eksempel: Hvis alle personer (ca. 9 milliarder) på kloden hadde hvert sitt unike personnummer, ville man bare trenge 33 søk maksimalt i tabellen for å finne data om en gitt person på kloden. Og det er jo en særdeles effektiv lagrings- og gjenfinningsmetode.

     

    (Antall søk maksimalt = logaritmen til antall poster delt på logaritmen til 2, avrundet opp til nærmeste heltall)

     

    Det samme gjelder for tekstene dine, med en normalisert database som bruker indeksering, går det veldig fort å finne frem til akkurat den teksten du er ute etter.

     

    Access har slått sammen tabeller og indekser i en datafil, mens andre databasesystemer opererer med separate datafiler og hver sine tilhørende indeksfiler. Filendelsene i disse er gjerne *.DAT og *.IND eller *.INX eller tilsvarende.

     

    Konklusjonen er at du ikke trenger å være redd for store datamengder hvor tabellene dine er normalisert, og indeksert. :thumbup:

  12. Bruk av flere tabeller som henger sammen på et vis kalles for å normalisere. En normalisert database vil alltid være mye bedre enn en database der hummer og kanari er i kun en svær tabell. Bedre i den forstand at den blir mindre or raskere.

     

    Eksempel, Kunder og salg:

    Opprett en tabell for kundene (med kundenummer)

    Opprett en annen tabell med kundenummer som fremmednøkkel, som inneholder hvert salg for kundene.

     

    Fordeler:

    Søk i kundetabellen etter en gitt kunde går raskere med bare kunder der, og ikke hver kunde oppført mange ganger med sine respektive salg. Denne tabellen blir mindre og dermed kjappere. Når kunden er funnet i kundetabellen, brukes kundenummer til å søke etter hvert salg i salgstabellen (som er mye mindre og kjappere enn om alt er i en tabell, fordi kundenavn, adresse, telefonnr mv. er lagret i kundetabellen og ikke i salgstabellen).

     

    Lykke til med normalisering og logikk. ;)

  13. Det der problemet er visstnok beskrevet på forumet for dette programmet.

    http://forums.guildftpd.com/viewtopic.php?...+root+directory

    men du må nok søke litt etter svaret, det har jeg ikke tid til... Tipper problemet har med rettigheter å gjøre. Men det blir bare gjettverk siden du ikke beskriver hva du gjorde da feilmeldingen dukket opp.

     

    Edit: Fant noe her om å sette opp directories: http://forums.guildftpd.com/viewtopic.php?t=4

  14. Hadde jeg vært deg, ville jeg laget en liten programsnutt som sjekker hva som kommer inn av data via serieporten (for det er vel den som brukes?). På bakgrunn av det ville jeg ha prøvd å gjette meg frem til hva som er temperatur, rel. fuktighet, vind hastighet og -retning osv. Jeg antar at værstasjonen sender data i en fast syklus, f.eks. først temp, deretter rel. fuktighet, deretter ditt, deretter datt i en fast syklus.

     

    En ting er vel helt klart, det som ligger i den datafila er proprietært siden det ikke er dokumentert godt nok.

     

    Det kan nok være litt tidkrevende, men desto mer får man i belønning når man har knekket opplegget ! :yes:

     

    Men hvorfor ikke sende en epost til fabrikanten og spørre ? Det er neppe noen bedriftshemmelighet det som sendes av data til din PC.

×
×
  • Opprett ny...