150 likes | 305 Views
C64. BASIC, 8086, DOS, NC , HEXEDIT, ASSEMBLY, DPMI32. Interesses & Talen. Turbo Pascal, roteren kubus , euler : gimbal lock VESA 3D texture mapping , resolutie : 1024x768 UvA : Gopher , C, JAVA, Prolog , Lisp UvA : Geen C++…… UvA : Begeleiding & Beoordeling
E N D
C64 BASIC, 8086, DOS, NC, HEXEDIT, ASSEMBLY, DPMI32
Interesses & Talen • Turbo Pascal, roterenkubus, euler:gimballock • VESA 3D texturemapping, resolutie: 1024x768 • UvA: Gopher, C, JAVA, Prolog, Lisp • UvA: Geen C++…… • UvA: Begeleiding & Beoordeling • SBMTRIS: TCP IP Sockets, Perl (spider.pl) • SBMTRIS: Tetris op jemobieletelefoon • CapPlanmet bcb4: Databases, SQL, C++, VCL
CapPlan, doelstellingen • Planprogramma in C++ • Alle windows versies • Meerdere databases • Multiuser (60 a 70% v/d tijd!) • Foutvrij • Snel maar toch alle gegevens • Small footprint (Nu 1.5MB incl installer) • 1 executable met zo min mogelijk dependencies
CapPlan (zieboek) • Windows versies: doet Borland grotendeels, maar pas op! XP hidden dialog bug • Database ontwerp: tabellen simpel • Database verschillen: defines.h • Snel: Houd het simpel! (v.b: functielengte) • Snel: Geschikte datastructuren (hash.h) • Snel: Teveel lagen vermijden: odbc32 en query • Snel: Verbeter daar waar de bottleneck zit
CapPlan, multiuser • Hoe zorg je ervoor dat wat de gebruiker op het scherm ziet overeenkomt met de situatie in de database: pessimistic of optimistic approach. Ofwel vooraf indekken of achteraf repareren... • Overlap in afspraken is geen optie! Een afspraak wordt ingepland, klant hangt telefoon op, dubbel! Repareren? Eindgebruikers weten vaak niet eens hoe ze moeten repareren. Het moet gelijk goed!
Pessimistic approach • Data die bewerkt wordt vooraf ‘locken’ • Wachten tot een lock vrijkomt terwijl de userinterface blokkeert is geen optie! • Meerdere threads voor meerdere database verbindingen tegelijktijd is een verspilling van resources en bovendien foutgevoelig. • Hoe lock je iets wat er nog niet is?
Multiuser denken = lastig! if(DirectoryExists(pathname) == false && CreateDir(pathname) == false) { if(DirectoryExists(pathname) == false) { // simultanious creation AnsiStringmsg = AnsiString::LoadStr(FBASE_ERRORCREATING); ATTO((msg+pathname).c_str()); Abort(); } }
Hoe weet je nu zeker dat je code foutvrij is? • ... • Eerst goed, daarna pas optimaliseren • Layout, netjes werken, testen, achterdochtig zijn (wet van Murphy...) • Jezelf met documentatie kunnen overtuigen • CVS (commit = nalopen!), Goede DIFF (WC) • Referential integrity (z_foreign.sql) • Tools: Codeguard, FastMM, ccfx • Als er dan toch iets fout gaat...
Verdieping • WebPagina, CapPlan Installer • RowGrid: ActiveX, Java, en Delphi • ACCESS database • Documenten: DB of FS? SMB, SSH? • Threads voor documenten: Synchronize…. • SnelStart (Extended stored procedures, dll) • CalDav/iCalendar (SQL Triggers)