Dynamisk tilføje sider til Zend_Navigation container ved runtime

Ved Steven Lloyd Watkin , torsdag 7 Januar 2010 22:50

I en fortsættelse på mit sidste indlæg om Zend_Navigation, Route anmodninger om sitemap.xml til brugerdefineret controller / action , er dette indlæg om dymnamically tilføje sider til en Zend_Navigation container ved runtime / script eksekvering.

Dens alt sammen meget godt angiver dine sider i en ini-eller xml -fil, men på et tidspunkt er du nødt til at ændre sider på dit websted, du vil som en del af en menu, sitemap, eller til at blive inkluderet i din brødkrumme spor. Derfor, hvad vi skal gøre, er at tilføje sider til vores Zend_Navigation container ved runtime. Eksempler på dette ville være i at tilføje nyheder, blog indlæg, eller side kommentarer, etc.

Fortsæt læsning 'Dynamisk tilføje sider til Zend_Navigation container ved runtime' »

Rute anmodninger om sitemap.xml til brugerdefineret controller / handling

Ved Steven Lloyd Watkin , Onsdag 6 jan 2010 12:13

For at direkte anmodninger til / sitemap.xml til en brugerdefineret controller og handling i din Zend Framework ansøgning blot tilføje følgende i din application.ini eller alternative config fil (fx jeg bruger navigation.ini):

 resources.router.routes.sitemap.route = "sitemap.xml"
 resources.router.routes.sitemap.defaults.controller = indeks
 resources.router.routes.sitemap.defaults.action = sitemap

Eksempel kode for udsende kan ses ved at skabe en handling i det pågældende controller (f.eks mit Sitemap ligger i indekset controlleren, sitemap handling):

 < php
 klasse IndexController
     udvider Zend_Controller_Action
 {
     / **
      * Gør en sitemap baseret på Zend_Navigation setup
      * /
     offentlig funktion sitemapAction ()
     {
    	 echo $ this-> Vis-> navigation () -> Sitemap ();
    	 $ This-> Vis-> layout () -> disableLayout ();
    	 $ This-> _helper-> viewRenderer-> setNoRender (true);
     }
 }

Sitemaps kan hurtigt og let kan genereres ved hjælp af Zend_Navigation , en stor hurtig tutorial (og generelt meget nyttigt for Zend Framework selvstudier) er Zend Afstøbninger - Dynamisk skabe en menu af et Sitemap og rasp .

Zend Framework Per-modul baseret indstillinger

Ved Steven Lloyd Watkin , Fredag ​​1 Jan 2010 22:40

Jeg har oprettet en opfølgning til dette indlæg, som kræver mindre konfiguration, se Modul baseret layout - Zend Framework .

Ved brug af Zend Framework med moduler, dens indlysende, at hvis du kører forskellige (sub-) steder fra samme program, du ikke nødvendigvis vil have samme layout scripts for hver del. Jeg besluttede at gå med følgende websted struktur:

  / Anvendelse
     / Controllere
         ...
     / Modeller
     / Moduler
         / Default
             / Controllere
             / Layout
                 / Scripts
             / Visninger
                 / Scripts
         / AnotherModule
             ...
     / Scripts

Problemet var at oprette layoutet scripts på en per-modul basis. Svaret kom igennem ved hjælp af en Handling Helper. Opsætning af layout på en per-modul grundlag omfatter tre trin:

  1. Application.ini (eller lignende konfiguration opsætning):
      admin.resources.layout.layoutPath = APPLICATION_PATH "/ modules / admin / layout / scripts"
     default.resources.layout.layoutPath = APPLICATION_PATH "/ modules / default / layout / scripts"
     member.resources.layout.layoutPath = APPLICATION_PATH "/ modules / Medlem / layout / scripts"
     affiliate.resources.layout.layoutPath = APPLICATION_PATH "/ modules / affiliate / layout / scripts" 
  2. Opret din Handling Helper:
      <? Php
     / **
      * Sætter layoutet sti på en per-modul grundlag
      *
      * @ Author Lloyd Watkin <lloyd@evilprofessor.co.uk>
      * @ Siden 2010/01/01
      * /
     klasse Pro_Controller_Action_Helper_SetLayoutPath
         udvider Zend_Controller_Action_Helper_Abstract
     {
         / **
          * Indstiller layout vej baseret på modul
          * /
         offentlig funktion preDispatch ()
         {
        	 $ Modul = $ this-> GetRequest () -> getModuleName ();
    
    	     if ($ bootstrap = $ this-> getActionController ()
    	                        -> GetInvokeArg ('bootstrap')) {
    
    	         $ Config = $ bootstrap-> getOptions ();
    
    	         if (isset ($ config [$ modul] ['ressourcer'] ['Layout'] ['layoutPath'])) {
    	             $ LayoutPath =
    	                  $ Config [$ modul] ['ressourcer'] ['Layout'] ['layoutPath'];
    	             $ This-> getActionController ()
    	                  -> GetHelper ('Layout')
    	                  -> SetLayoutPath ($ layoutPath);
    	         }
        	 }
         }
     } 
  3. Og endelig boostrap handlingen hjælper:
      ...
         / **
          * Indstiller op layoutet scripts på en per-modul grundlag
          * /
         beskyttet funktion _initLayoutHelper ()
    	 {
    	     $ This-> bootstrap ('frontController');
    	     $ Layout = Zend_Controller_Action_HelperBroker:: addHelper (
    	         nye Pro_Controller_Action_Helper_SetLayoutPath ());
    	 }
     ... 

Lære: DATETIME default NU ()

Ved Steven Lloyd Watkin , onsdag 30 december, 2009 18:30

Jeg har kæmpet med at oprette en database skema for en ny Zend Framework -projekt. Jeg er hjælp prøver at bruge Lære ORM til min database modeller. Jeg har brug for at oprette det skema, så det tilladt mig at sætte en standard dato og tid til en `datetime` kolonnen, fx når der tilføjes en ny besked jeg får de aktuelle tidsstempel. Efter megen søgen og eksperimenterer jeg fundet løsningen, så jeg deler den.

I dit skema YAML fil blot gøre følgende:

 Besked:
   actAs:
     Timestampable:
       Oprettet:
         navn: created_at
         type: tidsstempel
         Format: Ymd H: i: s
       opdateret:
         navn: last_updated
         type: tidsstempel
         Format: Ymd H: i: s
   kolonner:
     id:
       type: heltal
       primære: sandt
       autoincrement: sandt
     Navn: string (255)
     e-mail: string (300)
     besked: string (2000)

Hvis på den anden hånd, du ikke ønsker et `updated_at` kolonnen, kan du bruge følgende:

 Besked:
   actAs:
     Timestampable:
       Oprettet:
         navn: created_at
         type: tidsstempel
         Format: Ymd H: i: s
       opdateret:
         deaktiveret: sandt
   kolonner:
     id:
       type: heltal
       primære: sandt
       autoincrement: sandt
     Navn: string (255)
     e-mail: string (300)
     besked: string (2000)

PHP Design Patterns - Observer Pattern

Ved Steven Lloyd Watkin , Tirsdag 29 Dec 2009 22:02

Jeg har læst Head First Design Patterns for nylig og har besluttet at skrive nogle af de mønstre, som PHP eksempler, for min egen fordel. Den første, som jeg har besluttet at kode op er Observer Pattern . Den formelle definition af Observer Pattern er:

Observatøren mønster (en delmængde af den asynkrone offentliggøre / abonnere mønster ) er en software- design mønster , hvor et objekt , kaldet emnet, vedligeholder en liste over sine pårørende, kaldet observatører, og meddeler dem automatisk i nogen stat ændringer, som regel ved at kalde en af deres metoder . Det er hovedsageligt bruges til at implementere distribuerede hændelseshåndtering systemer.

Som systemer bliver mere løst koblet og sørg for, at når en begivenhed, der sker alle systemer, der kræver viden om disse opdateringer er informeret. For eksempel, et blog-indlæg efter lagring af en post vi måske nødt til at opdatere en søgemaskine (fx Lucene), opdatere vores sitemap, tags, e-mail tegnet brugere osv. Observatøren mønster giver udviklere mulighed for at tilføje flere lyttere uden at redigere deres observerbare objekt . Ved at indsprøjte observatører (dvs. en søgemaskine opdatere observatør, en sitemap generator osv.) ind i et emne (dvs. blogindlæg redigeringssystem) kan vi give den til at udføre alle de nødvendige opdateringer uden ændringer.

Fortsæt læsning 'PHP Design Patterns - Observer Pattern' »

Office Grid Computing ved hjælp af virtuelle miljøer - Del 4

Ved Steven Lloyd Watkin , fredag ​​4 Dec 2009 11:59

Indledning

Jeg arbejder i en virksomhed, hvor vi køre mange batchjob forarbejdning af millioner af optegnelser over data hver dag, og jeg har tænkt for nylig om alle de maskiner, der sidder rundt om hver eneste dag at gøre noget i flere timer. Ville det ikke være godt, hvis vi kunne bruge disse maskiner til at styrke den regnekraft af vores systemer? I dette sæt af artikler jeg har tænkt mig at se på de potentielle fordele ved at ansætte et kontor gitter ved hjælp af virtualiserede miljøer.

I del 3 har vi skabt vores virtuelle forarbejdning maskine og oprette Windows-maskiner for at blive ledig-deltidsansatte.

Kører den nyeste koden

Uundgåeligt Når du har oprettet dine medarbejdere forretningslogik vil ændre sig, vil fejl blive fundet, vil hurtigere, mere effektiv kode, der produceres hvilket giver dine medarbejdere sad omkring behandling af data ved hjælp af gamle ildelugtende kode . Hvordan så sikrer vi, at vi altid bruger de nyeste og bedste version af vores behandling af scripts?

Der er et par meget nemme enkle måder vi kunne gøre dette, det trick, er imidlertid at reducere behandlingstiden magt og netværkstrafik i at opnå dette. Lad os starte med det simpleste af løsninger og forbedre det langsomt over et par iterationer.

Den første metode ville være simpelthen at oprette forbindelse til vores job Control Server (via samba, FTP eller lignende) og træk ned den seneste version af koden. Ikke meget effektiv, men det vil gøre arbejdet. Lad os forbedre på, at noget, hvordan om at skabe et rsync script og brug, at hver gang i stedet? Alternativt hvad med at sætte vores nyeste behandling script til undergravende virksomhed tjekker ud koden i første omgang og så bare opdatere vores kode på hver kørsel ( svn update )?

I sidste ende kunne vi ende op med et bash script (kaldes af cron hver 10 minutter), der ser lige så simpelt som dette:

  #! / Bin / sh
 hvis ps ax | grep-v grep | grep php > / dev / null
 Derefter
     echo "Job er i øjeblikket behandling, frakørsel"
 andet
     echo "Job ikke kører, skal du starte nu"
     cd / sti / til / arbejde / kopiere
     svn update
     php yourJobProcessingScript.php
 fi 

Nu kan vi være sikre på, at med hvert løb er vi absolut køre den nyeste kode. Vi sikrer dette ved at opdatere vores kodebase hver eneste gang vi udfører en løbetur og reducerer netværkstrafik ved kun at overføre filen forskelle på tværs af vores netværk.

I min demonstration setup, gjorde jeg præcis som ovenfor. Subversion blev installeret på mit job forarbejdning server og jeg simpelthen trak den nyeste kode fra en »arbejdstager« gren ved hjælp af 'svn update'. Jeg har også tilføjet en versionsnummer mærke til min behandling script, som blev returneret til databasen som en del af resultaterne afkast. På den måde kunne jeg se, at min kode var ved at blive opdateret hver gang jeg kopieret min kuffert i arbejdstagerens gren, dvs at jeg var helt kører med den nyeste behandling af scriptet.

Ved hjælp af de nyeste data

Hvis dit job forarbejdningen gør brug af datakilder så på et tidspunkt disse vil blive opdateret. Medmindre du ringe til din datakilder på en meget sjælden grundlag du vil oversvømme netværket med trafik, så snart dine medarbejdere begynde at køre bringe alting i stå. For min løsning, besluttede jeg at jeg vil flytte mine data kilder rundt med mine VM'er.

Hold du er heste der! Hvad nu hvis mine data kilder er enorme? Nå det er virkelig et tilfælde af hvor mange data vi taler? Det kan være mere omkostningseffektivt at installere en ekstra større harddisk i hver maskine, end at købe en ekstra behandling server. Dette er et spørgsmål om budget og er op til virksomheden at afgøre. Det måske, at dine data kilder er så store, at det bare umuligt at holde, at mængden af data i dit arbejdstager maskiner. I så fald hvad ville du gøre? Godt vi kunne se på at kalde en lokal data-server, men dette kan forårsage problemer med netværket. I dette tilfælde et gitter system som dette kan blive urealistisk at inkludere i dit kontormiljø. Det kan også være, at du kan se i alternative kører strategier, for eksempel kun at kalde dine arbejdere fra 08:00 til 06:00 hver aften og / eller kvæle datakilde anmodninger.

Flytning på lad os sige vores datakilder beløbe sig til 100 GB data. Nå ja, det er en hel del data for at flytte rundt på nettet på en opdatering. Hvordan vil vi sikre, at vi har den seneste kopi af data i denne sag? Rsync er en mulighed, men jeg personligt tror, ​​ved at køre dine seneste datakilde på din jobbehandling server og konfigurere dette som en mester i replikation (med en dejlig lang bin log) kan være vejen at gå:

replikering Ved at indstille hver af dine medarbejdere op som en slave til jobbet Control Server opdateringer til dine data kilder vil sive ned pænt til dine medarbejdere uden en enorm stigning i net-aktivitet (det er medmindre du udfører en kæmpe data opdatering samt alle dine medarbejdere spark i på én gang). Dette har fordele frem for rsync i, ​​at du ikke ville få en lang pause, før hvert job, som database opdateringer, mysql vil daemon på din arbejdstager løbende opdatere sine data, mens behandlingen fortsætter.

Dette er hvordan jeg oprettet min demonstration server. For at opsætte replikering Jeg fulgte guiden på mySQL stedet ( Opsætning replikering ), og inden for 20 minutter, som jeg havde min inital arbejdstager kopiere jobbet kontrol servere datasæt. For hver yderligere arbejdstager replikation indstillinger og processen arbejdede hver gang, da VM blev kopieret.

Resumé

I dette afsnit af artiklen har vi set på, hvor nemt og smertefrit det er at holde din behandling koden up to date med using rsync eller subverion (SVN) til at gøre arbejdet og reducere netværkstrafikken på samme time. Vi har også diskuteret, hvordan at holde dine oplysninger om datakilden up-to-date ved at lade den sive ned til hver af dine medarbejdere. Således vi område at sikre, at vi holder op med forretningslogik og information på vores kontor skinnesystem. Der vil naturligvis være utallige alternativer til at udføre disse opgaver, men her var to simple eksempler for at vise, hvor let en løsning er at komme forbi.

Næste gang

I den sidste del af denne serie, rammende opkaldt kapitel 5 , vil vi diskutere at implementere dette system. Jeg vil sammenfatte hvad der er blevet lært, og hvad jeg formåede at skabe.

Office Grid Computing ved hjælp af virtuelle miljøer - Del 3

Ved Steven Lloyd Watkin , fredag ​​4 Dec 2009 23:37

Indledning

Jeg arbejder i en virksomhed, hvor vi køre mange batchjob forarbejdning af millioner af optegnelser over data hver dag, og jeg har tænkt for nylig om alle de maskiner, der sidder rundt om hver eneste dag at gøre noget i flere timer. Ville det ikke være godt, hvis vi kunne bruge disse maskiner til at styrke den regnekraft af vores systemer? I dette sæt af artikler jeg har tænkt mig at se på de potentielle fordele ved at ansætte et kontor gitter ved hjælp af virtualiserede miljøer.

I del 2 ser vi på de job, en server vil køre, og hvordan job skal konfigureres for at opnå størst forarbejdningsstøtte samtidig sikre, at hvert job er behandlet, uden at mislykkes.

Opsætning af din arbejdsplads - eller halte server

Det næste skridt i processen er at oprette din virtuelle medarbejdere. For denne jeg har tænkt mig at bruge en installation af CentOS bruge VirtualBox. Jeg har tænkt mig at installere mySQL og PHP på serveren, også kendt som en slatten (Li nux, m ySQL, P HP) Servera (jeg kan have gjort dette navn op).

  • Installer VirtualBox på din Windows-maskine (følg link)
  • Hent og installer CentOS (nuværende version 5.3) inden for en oprettet virtuel maskine

Der er ingen mening mig at gå til dette er der nok 1.000 'er af stor tutorials derude (ok, her er en: Oprettelse og Managing CentOS virtuel maskine under VirtualBox ). Det vigtige punkt at bemærke Jeg formoder, er, at jeg ringede til min virtuelle maskine GridMachine.

For så vidt angår mit valg af virtualisering klient og operativsystem gå der ikke er nogen stor tvingende grund for hvert valg. VirtualBox er noget, jeg bruger på min hjemme maskine, og er støttet af de tre store operativsystemer. Jeg valgte CentOS som sin et godt stabilt OS og jeg bruger det på min egen webserver. Jeg er en stor tilhænger af det rigtige værktøj til opgaven (selvom jeg anvender 'brug den hurtigste og nemmeste for dig' mentalitet her), så hvis styresystemet X kører din kode hurtigere og mere effektivt bruge dette i stedet:)

Det er vigtigt at sikre, at din VM bruger DHCP, ellers for hver ny virtuel maskine vil skulle konfigureres særskilt hvilket er noget, vi ikke want.By bruger DHCP vi behøver ikke at konfigurere netværksindstillinger individuelt for arbejdstager maskiner, vil DHCP hånd ud IP'er for dig. Derfor kan du kopiere din virtuelle maskine om kontoret uden at bekymre sig om opsætning hver en op (Dette forbedrer skalerbarhed og reducerer arbejdstager administration).

Den proces, du bør sigte på at opnå ville være at få en ny fysisk maskine, installere VirtualBox, og derefter stort set installere virtuelle billede uden meget andet. Det kan være klogt at sætte alle dine medarbejdere på et andet subnet, så du kan i det mindste se, hvor mange maskiner kører. Du skal også oprette dine maskiner på en lang lejekontrakt eller ubegrænset lejemål DHCP.

Sådan køres job på arbejdstageren

Dette er et interessant område, og der er flere gyldige metoder til behandling af jobs på arbejdstageren. Her Jeg vil bare diskutere de to mest oplagte:

  • Bestandigt at køre script: Et script, det være sig en shell script, eller et PHP script udføres én gang på arbejdstageren og kører som en del af en uendelig løkke. Jeg har diskonteret denne metode som et brag af manuskriptet og potentielt dine medarbejdere vil ophøre med at køre uden en form for intervention.
  • Cron baseret script udførelse: Hvert X minutter cron daemon starter et opkald til dit script til at få tingene i gang. Uden en vis kontrol af dette kan føre til mange mange kopier af dine arbejdstager scriptet kører.

Min beslutning var at gå med cron, som starter en shell script hver 10 minutes. Mit shell script, udfører følgende opgaver:

  1. Få en proces liste og grep dette for 'php'. Hvis den ikke findes derefter fortsætte.
  2. Ring til dit job kode, i mit tilfælde ville det være noget, der bygger PHP
  3. Worker scriptet afslutter sit løb
  4. Klar til at gå igen på det næste passende kalder

Min bash script ser ud som følger:

  #! / Bin / sh
 hvis ps ax | grep-v grep | grep php> / dev / null
 Derefter
     echo "Job er i øjeblikket behandling, frakørsel"
 andet
     echo "Job ikke kører, skal du starte nu"
     php yourJobProcessingScript.php
 fi 

Bemærk: ECHO er næsten fuldstændigt meningsløst, men det kan hjælpe den næste person, der kommer sammen for at prøve og redigere dem.

Hermed er opsætningen af ​​arbejderen virtuelle maskine, hurtig, enkel og nem at kopiere til hvert nyt stykke hardware, der er modtaget. Den 'dygtighed' af elnettet er virkelig ikke i visualiseret OS, det hele at gøre med den kode, der oprettes til at behandle job, jobbet konfiguration, og i at sikre, at jobbet kører når det er relevant (dvs. når værten er inaktiv ).

Opsætning af Windows for at initialisere Workers

Den første opgave er at arbejde ud af den kommando kræves for at køre den virtuelle maskine fra vinduerne kommandolinjen. Hvis du har installeret VirtualBox på standardplaceringen, og du har kaldt dit arbejdstager GridMachine derefter kommandoen kræves for at indlæse dine arbejdstager er:

  "C: \ Programmer \ søn \ VirtualBox \ VBoxManage.exe" startvm GridMachine 

Men at køre script i en "hovedløs" state vi er nødt til at bruge:

  "C: \ Programmer \ søn \ VirtualBox \ VBoxHeadless.exe"-startvm GridMachine - vrdp = off 

Dette vil starte den virtuelle maskine uden GUI og gør det muligt at spare staten yndefuldt. Det andet argument slukker RDP, så det ikke i konflikt med Windows RDP, eller give dig en besked om at lytte på port 3389. Den virtuelle maskine navn er store og små bogstaver!

Dernæst vil vi nødt til at sætte vinduer på op til kick off vores arbejdstager VM, når maskinen har været inaktiv. For at gøre dette (på Windows XP) Du bliver nødt til at gå Start -> Alle Programmer -> Tilbehør -> Systemværktøjer -> Planlagte Opgaver som nedenfor:

planlagte opgaver

Klik derefter på 'Tilføj Scheduled Task "efterfulgt af Gennemse for at tilføje et brugerdefineret program. Navigere til din VBoxManage script og klik ok. Planlæg din opgave for nogen af ​​de muligheder (vi vil ændre dette i et minut) og fortsætte. Efter at springe det næste skærmbillede Windows vil spørge dig, hvem du vil køre denne opgave, ville jeg foreslå enten 'Administrator' eller oprette en ny bruger med rettigheder. Husk at vi ikke ønsker at blande sig med den standard personalet konto på maskinen på noget tidspunkt. Klik på Næste og kontrol viser, avancerede indstillinger for denne opgave.

Til slutningen af kørslen tekstfeltet tilføje vores 'startvm GridMachine' snor og sikre, at der kun kører, når logget ind er tilbage unticked. Besøg tidsplanen opgaven næste og ændre tidsplanen drop ned til indstillingen ', når tomgang', vælge den tid, du ønsker at maskinen skal være ledig, før man går videre til næste fane.

Endelig Fjern markeringen den mulighed, der hedder stoppe opgaven, hvis den har kørt X tid, men kryds mulighed for at stoppe den opgave, hvis maskinen ikke længere er ledig.

tidsplan

Det var det så for Windows host setup!

Resumé

I denne del har vi oprettet en virtuel maskine til at fungere som en arbejdstager, samt den måde, hvorpå vi kalder og udføre vores job behandling scripts (for mig selv en PHP script). Herfra ser vi på, hvordan du opsætter vores kopier af Windows til at starte den virtuelle maskine i hovedløse tilstand, når computeren bliver ledig, og gemme dens tilstand, når brugeren genoptager brugen af ​​maskinen. Forhåbentlig på dette punkt du ser hvor nemt det er at etablere et sådant system og er kløe at få nogle eksperimenter gang selv!

Næste gang

I Kapitel 4 vil vi se på ved hjælp af værktøjer til at sikre, at du kører den nyeste version af kode og data kilder, så opnåede resultater er altid up-to-date med de nyeste forretningsoplysninger og logik.

Office Grid Computing ved hjælp af virtuelle miljøer - Del 1

Ved Steven Lloyd Watkin , fredag ​​4 Dec 2009 11:23

Indledning

Jeg arbejder i en virksomhed, hvor vi køre mange batchjob forarbejdning af millioner af optegnelser over data hver dag, og jeg har tænkt for nylig om alle de maskiner, der sidder rundt om hver eneste dag at gøre noget i flere timer. Ville det ikke være godt, hvis vi kunne bruge disse maskiner til at styrke den regnekraft af vores systemer? I dette sæt af artikler jeg har tænkt mig at se på de potentielle fordele ved at ansætte et kontor gitter ved hjælp af virtualiserede miljøer.

Som en PHP udvikler jeg har tænkt mig at bruge værktøjer, som jeg bruger hver dag, nemlig, Linux, mySQL , PHP, VirtualBox og undergravende virksomhed (SVN). Men jeg håber, at denne guide vil tilpasse sig andre sprog og teknologier lige så godt.

Den løsning jeg give vil være meget løst baseret på den type behandling vi havde brug for at opnå men dette kan ikke være rigtigt igennem hele artiklen, som jeg vil ændre tingene til enkelthed, eller til at producere mere interessant brug scenarier.

Disse virtualiserede miljøer, der kan køre på windows maskiner, da dette er hvad de fleste af kontorer køre. Behandlingen, at kontormaskiner ikke bør ikke gribe ind med personale ved hjælp af disse maskiner, bør kræve, ingen vedligeholdelse på maskinen, og være let indsættes til nye maskiner, som de bliver tilgængelige. Desuden bør nye virtuelle maskiner, der ikke kræver nogen yderligere konfiguration, da det reducerer skalerbarhed og lethed, hvor elnettet kan udvides.

Hvorfor Implementer et Office Computing Grid?

For det første du tænker måske, hvorfor ikke bare bruge en cloud computing ressource såsom Amazons EC2-platform ? Nå årsagerne kan være flere, for eksempel:

  • Du vil ikke overdrage visse data til en cloud computing miljø
  • Du kan ikke sætte bestemte data i et cloud computing miljø for juridiske årsager (f.eks data forlader landet), potentielt af juridiske årsager, fx NHS optegnelser.
  • Du ønsker at holde din forarbejdningsenheder tæt og har fuld kontrol over hardware også
  • Du behøver ikke projektmidlerne til at køre cloud tilfælde
  • Dit kontor har ikke en forbindelse til internettet og dermed dets ikke muligt at bruge en sky ressource
  • Du ikke kan lide regn, skyer tyder regn, derfor skal du holde sig langt væk

Jeg er sikker på listen kunne fortsætte, men jeg tror, ​​det er nok for nu.

Fordele ved et kontor Computing Grid

Nå, lad os lave noget matematik (og i ægte fysik stil lader foretage nogle fejende antagelser). Forestil dig at du har stor velnæret behandling server, der kører 100 arbejdspladser om dagen. I dit kontor, du har 50 maskiner, der er inaktive 16 timer om dagen, hver af disse maskiner er 10% så stærk som din velnæret behandling skille. (Alle resultater her er afrundet til at undervurdere performance stigning).

Så kunne 1 maskine * 10% strøm * 2 / 3 tid = 0,067 dvs 1 desktop-forarbejdning i spildtid proces 6 Fuld job om dagen.

Hvis du nu skalere det op det tager 15 tomgang desktops til at behandle så mange arbejdspladser pr dag, som din vigtigste behandling server gør.

Så i vores foregive kontor på 50 maskiner, vi kunne øge vores regnekraft fra 1 server op til 4 fulde behandling servere, eller vi kunne være behandlingen 400 arbejdspladser om dagen i stedet for 100.

Læg mærke til, for ingen investering i ny hardware dit firma har netop øget sin batch forarbejdningskapacitet 4 gange! Potentielt du vil øge dit strømforbrug, men fra de fleste kontormiljøer Jeg har været i maskiner er generelt tilbage på natten alligevel, så man kunne se dette som et grønt initiativ.

Andre fordele også betyde, at investeringer i nye (eller opdateret) behandling servere kan blive forsinket, hvis dit kontor maskiner er tilstrækkelige, og at som du forbedre styrken i din kontormaskiner dit kontor forsyningsnet bliver mere kraftfuld automatisk.

Teknologier

Hvad du har brug for? (Eller mere korrekt, hvad har jeg brug):

  • Idle kontormaskiner (i mit tilfælde et ekstra gamle Windows XP laptop)
  • VirtualBox (eller en anden virtualiserings-klient-software)
  • En virtuel maskine med PHP, MySQL running kører en skære ned OS, jeg ringer disse mine Limp servere:)
  • Jobs til at køre
  • Job server (kan være en anden virtuel maskine eller andet sted)

Typisk Job

De typer af job, at dette system er designet til at køre er som følger:

  • System modtager en liste over data, som vi har brug for at matche og returnere resultater
  • Matchende omfatter det at tjekke / søge flere (temmelig statisk) datakilder
  • Resultater fra datakilder kan kræve yderligere validering, sammenlægning, kontrol af yderligere datakilder, som reaktion på resultaterne
  • Data returneres med matchende poster, fuldt valideret og bearbejdet
  • Hver post inden for et job er uafhængig af resten

Så dybest set, vi kigger på kørende jobs, som kræver en blanding af database opslag og nogle talknusning, en ret typisk scenario i et erhvervsmiljø.

Grid løsninger er ikke kun fordelagtig for behandling job af denne type. Dybest set kan enhver proces, som kan opdeles i selvstændige enheder køres parallelt. Se dette Wikipedia for eksempler og mere information: Grid Computing , men et par kendte eksempler er Seti @ Home og BIONC . Der er rammer for at køre computing net, og disse er værd at se på.

Hvad vil vi opnå?

Ved udgangen af ​​disse artikler håber jeg at vise, at indsætte et kontor net ikke behøver at være enormt dyrt eller tidskrævende. Jeg har tænkt mig at diskutere:

  • Opsætning af jobbet kontrolsystem, job konfiguration
  • Oprettelse af en passende behandling af virtuel maskine
  • Sådan setup systemet på en Windows-maskine
  • Sikrer, at du bruger den nyeste kode og data
  • Deployment og benchmarking
  • Se fremad

Jeg vil være bygning (ok jeg byggede, så skrev dette) et eksempel på program for at teste de koncepter på en lokal maskine ved hjælp af Windows XP og min "GridMachine" virtuel maskine. Mit job kontrol server vil være min primære maskine, der kører Fedora 11 .

Dette er på ingen måde betød at demonstrere et fuldt fungerende robust system, dets betød mere for en demonstration og diskutere viser, at disse ting kan opnås en rimelig kort tid og med små omkostninger. Du er velkommen til at sende mig eventuelle kommentarer, rettelser eller forbedringer, og jeg vil gøre mit bedste for at holde denne artikel opdateret til at matche.

Næste gang

I del 2 vil jeg starte med at se på jobbet styring, og se på, hvordan arbejdspladser skal konfigureres for at opnå størst forarbejdningsstøtte samtidig sikre, at hvert job er behandlet, uden at mislykkes.

Office Grid Computing ved hjælp af virtuelle miljøer - Del 2

Ved Steven Lloyd Watkin , fredag ​​4 Dec 2009 11:23

Indledning

Jeg arbejder i en virksomhed, hvor vi køre mange batchjob forarbejdning af millioner af optegnelser over data hver dag, og jeg har tænkt for nylig om alle de maskiner, der sidder rundt om hver eneste dag at gøre noget i flere timer. Ville det ikke være godt, hvis vi kunne bruge disse maskiner til at styrke den regnekraft af vores systemer? I dette sæt af artikler jeg har tænkt mig at se på de potentielle fordele ved at ansætte et kontor gitter ved hjælp af virtualiserede miljøer.

I del 1 jeg gav et overblik over systemet og teknologier jeg vil bruge samt drøftet nogle af de potentielle grunde til, at du ønsker at oprette et kontor gitter.

Job Control

Hvis du vil køre jobs så du vil få brug for nogle måde at styre dem. Dit job kontrolsystem (på dit job server) skal være virkelig velgennemtænkt, før selv forsøger at køre et kontor gitter. Så det første, hvad er opgaver for et job kontrolsystem:

  • Uddel opgaver efter anmodning fra arbejdstagerne
  • Fortæl arbejdere hvilken type af job til at køre
  • Spor job
  • Sørg for, at arbejdspladser er kun køre én gang
  • Giv jobdata til arbejdstagere, eller i hvert fald fortælle dem, hvor du kan få det

Systemet skal også udvides, en løsning der virker for nu i et enkelt tilfælde kan udvides til at køre flere typer af arbejdspladser, fordi virksomheden ser en værdi i et gitter løsning. For eksempel kan arbejdspladser få prioriteter, mere end én jobtype kan eksistere (dvs. flere code baser), i sidste ende kan du endda køre flere forskellige arbejdstager maskiner, der er optimeret for hver type af arbejde (selv om det bevæger sig væk fra det »generiske arbejdstager 'idé). Forsøg altid at tænke på fremtiden, når udvikle systemer, kan en kortsigtet vision føre til på længere sigt frustration og øget udviklingsbistand tid.

Job Server

Vi vil få brug for et sted at styre vores job fra, bør dette være det eneste system i dit net, der har en fast ressource locator, være, at en IP-adresse, værtsnavn, URL (ved hjælp af intern DNS), osv. Dette skyldes arbejderne har brug for at vide hvor de skal lede efter job, arbejdstagere har behov for at finde det job kontrolsystem (ikke jobbet kontrolsystem finde arbejderne).

The job server itself doesn't really have a complicated task (in a basic system anyhow), it needs to store a list of jobs, hand out jobs, receive results, and subsequently store them for later retrieval. How these parts (such as 'hand out jobs') are defined can be very basic. Later on we can extend the system to include an administration interface to add, edit, delete, suspend jobs but this is beyond this exercise.

There is no reason whatsoever then that your job server could not be a virtual machine running within your main processing server provided it doesn't drain too many resources from it. The job server however does need high availability, if it goes down on a Friday evening you're going to lose a whole weekend of processing, potentially costing you a couple of weeks worth of processing time (when compared to your main processing server alone). You may want to consider putting your job server on a load balanced environment for high availability.

Grundlæggende opsætning

The basic setup for our job server will consist of what I'm calling one of my LiMP servers (that is Li nux, m ySql, P HP). The code running on the workers will actually work out what jobs it can run by interacting with with job control system databases. Later on we could create a web service and actually hand out jobs rather than having the workers do the hard work themselves, but for now we'll continue using the KISS principle (Keep it Simple, Stupid!).

So, lets create three mySQL tables to deal with jobs. These will be `jobs`, `jobRecords`, and `jobResults`.

jobs table Here I'm using SQL Buddy a great little alternative to phpMyAdmin just because its easier to install on centOS (for others see: 10 Great alternatives to phpMyAdmin )

This table consists of 5 simple fields,

  • id: Uniquely identify the job
  • name: Could be a client reference, or any number of other identifiers
  • Status: You need to know where the job is at, eg
    • 0: Not started
    • 1: Picked up
    • 2: Completed
  • started_by: Who's started doing the job? This isn't entirely required but is a nice to have. I'd suggest tracking workers by their IP address on your network
  • started_at: When did the worker start the job? By tracking jobs that have not completed within X amount of time we know we need to pick up the job once again and start processing by another worker. Workers could stop processing/go offline for any number of reasons, power failure, crash, network loss, etc.

It is easy how this table could be extended with a few additional fields to allow for statistics tracking, a finish time column to see how long the job took, a counter to see how many workers picked up the job (obviously this needs to tend to 1), job priority, the list can go on and on. In more complex job scenarios it would be possible to specify how much memory the worker would need access to (and therefore only use suitable workers), or even what type of worker would be required.

Lets add a few example jobs:

example jobs

The next table again is quite simple to understand, these are our job records. They are linked to the main jobs table by a column `jobs_id`. The make up of this table very much depends on the data that you need to supply to your workers, lets make a very simple example where we have four columns:

  • id: ID of the record
  • name: Person's name
  • address: Person's address
  • jobs_id: The job ID that this record is linked to

The third and final table consists of a results table, it has much the same make up as our records table, and with the addition of some columns could be part of the records table:

  • job_record_id: Link the result to the job table
  • result: The result data

…and that's all you need for job control! (albeit at a very basic level) In my case I'm pointed to another table where my data to process was located, but this could just as easily been a file, parameters to run simulation code, you name it.

Selecting a job

As stated previously, the workers will do our job management for us for now, so all we need to really do is find a job that needs processing and get the information. How would we do this? Well pick our job selection criteria and look for jobs, in SQL I did the following:

  1. Take any jobs that are not marked as complete but from our worker and reset them (substitute __ME__ with an identifier, easiest would be IP address):
     UPDATE `jobs` SET `status` = 0 WHERE `status` = 1 AND `started_by` = __ME__; 
  2. Using our job selection criteria, select a job and tell the control system that this worker is dealing with it:
     UPDATE `jobs` SET `status` = 1, `started_by` = __ME__, `started_at` = NOW() WHERE `status` = 0 OR
    (`status` = 1 AND `started_at` > DATE_SUB(NOW(), INTERVAL X HOUR)) ORDER BY `id` ASC; 

    By grabbing jobs that haven't returned results in X amount of time we ensure that all jobs are run in the event of a worker crashing or going AWOL.

  3. Next grab the jobs details followed by the records themselves:
     SELECT * FROM `jobs` WHERE `started_by` = __ME__ LIMIT 1;
    SELECT * FROM `job_records` WHERE `id` = __JOBID__; 

Upon completion of the job we insert our result records and mark the job as complete. Remember as jobs can suspend/resume at any time allow for some robustness in your script. It might be that the task suspends half way through updating the job control system, so checking the number of records in a job and the number of results saved back to the job control system would be a wise move.

In addition, whilst this demonstrates how jobs can be selected and managed from an SQL-query frame you should really be abstracting your job control so that if you decide to switch to using a web service, a file based system, XML , or any other number of systems it will not affect the code above it.

Job Configuration

The next aspect to consider is job size and configuration. By playing with job configuration we can strike an excellent balance between speed, process replication, and reliability. Take a couple of scenarios:

  1. Jobs take 1 day each to run: This means that your workers need 15 days to process each job (remember 10% of the power for 2/3rds of the time). This is clearly not a wise configuration, your job size is way too big! It would take at least double the time to get a job processed should the initial worker go AWOL (time to pick up that it hasn't returned a result plus reprocessing time). In an ideal you'd have at least one full job easily cleared by the end of each long idle period, that way you keep the jobs ticking over and at worst case a job would take two days to process should the first go missing.
  2. Jobs take 1 minute to run: This means that your workers take about 15 minutes to run each job. Whilst this may initially seem ideal, you gain additional work processing during lunch time, coffee breaks, meetings, etc this scenario puts strain on other areas of your system and introduces its own problems. For example, firstly your setup/processing time ratio is going to go right down, therefore losing system efficiency. Your network is going to be constantly streaming job information to the various workers frustrating staff who are dong their day to day work. You're also going to put more strain on your job processing server as it has to dish out lots and lots of small pieces of work on a regular basis. Lastly, in this situation if your job server goes down you're going to create a huge back log of uncompleted work whereas bigger jobs could of continued processing blissfully unaware that the job server was experiencing difficulties.

I virkeligheden vil der ikke være en ideel konfiguration til dit net setup, meget afhænger af de tilgængelige ressourcer, typer af job, job ekspeditionstid krav, netværks-kapacitet, og så videre. Men nogle retningslinjer vil være:

  • Størrelse job, så at hver arbejdstager kan komme igennem mindst 3-4 arbejdspladser i en periode på 15 timer (den længste sandsynlige inaktiv periode)
  • Spil med jobbet størrelse, så setup tid bliver temmelig ubetydelige i forhold til behandlingstiden (under hensyntagen til ovenstående punkt).
  • Hvis et job ikke komplet i dobbelt så lang tid (måske mindre), du forventer at færdiggøre det antage, at det er væk væk fra mig og begynde at behandle det med en anden arbejdstager. Dette betyder, at du måske nødt til at vente i op til tre gange den normale længde af et job til den er færdig (muligvis længere, hvis den efterfølgende jobbet mislykkes). Du ønsker måske at reducere denne tid, men vær forsigtig med ikke at reducere det alt for meget som du kan begynde at overlappe behandlings opgaver på regelmæssig basis.
  • Jobs bør være uafhængige af eksterne krav, så meget som muligt. Jobbet server, for eksempel, bør kun kontaktes ved starten og slutningen af ​​hver opgave.
  • Må ikke mætte dit netværk, vil dette få to negative effekter, vil din dagtimerne personalet finde ved hjælp af netværket frustrerende og problemer, kan opleves med tilslutninger timing et problem, som kun vil blive værre, når du skalere din net.
  • Sikre jobs kan køre på dine medarbejdere. Hvis arbejdspladser bliver for hukommelsen intensiv eller diskplads intensivt job vil begynde at opgive, og det eneste du vil bemærke er et fald i antal arbejdspladser behandles uden reel grund til hvorfor.

Indsendelse Resultater af et job

When submitting the results of a job it is important to check that results have not been submitted by another worker, especially if the current worker has been dormant for some time.

When results are submitted ensure that the number of results matches the number of records within the job.

As stated previously, and can not be over emphasised, build fault tolerance into job retrieval and results submission. The workers can (and most likely will) go into suspend mode at the most inconvenient of times and this needs to be catered for. Also once again abstracting away your results submission will help cater for future changes to your job control system much easier to deal with.

Resumé

In this section we have looked at what a job control server needs to do and how to get a very basic system set up. We discussed how to retrieve a job from the control system and how best to configure jobs to get the most our of your office grid system. To finish, a paragraph or two on submitting results back to the job control server was presented.

  • A job control server manages jobs and ensures that all work units are completed
  • By abstracting your job select/results submission we can change the technology of the control server without much problems
  • Configure your jobs to ensure that they are run quickly and efficiently without putting too much pressure on your network infrastructure, and without duplicating processing tasks on a regular basis.
  • Ensure that you build fault tolerance and error checking into your routines, workers can suspend and resume and the most inconvenient of times. Remember to check if results have already been submitted by another worker.

Next time

In part 3 we'll create our virtual processing machine and set up our windows machines to become idle-time workers.

Office Grid Computing ved hjælp af virtuelle miljøer - Del 5

By Steven Lloyd Watkin , Friday 4th December 2009 11:03 pm

Indledning

Jeg arbejder i en virksomhed, hvor vi køre mange batchjob forarbejdning af millioner af optegnelser over data hver dag, og jeg har tænkt for nylig om alle de maskiner, der sidder rundt om hver eneste dag at gøre noget i flere timer. Ville det ikke være godt, hvis vi kunne bruge disse maskiner til at styrke den regnekraft af vores systemer? I dette sæt af artikler jeg har tænkt mig at se på de potentielle fordele ved at ansætte et kontor gitter ved hjælp af virtualiserede miljøer.

I del 4, kiggede vi på ved hjælp af værktøjer til at sikre, at vi kører den nyeste version af kode og data kilder, så opnåede resultater er altid up-to-date med de nyeste forretningsoplysninger og logik.

Pre-Deployment

Før implementering dit grid system, hvis der er én ting, du gør, og en ting alene, det er benchmark dit nuværende system! Ligegyldigt hvad du fortæller kolleger om, hvor meget ekstra arbejde dit system vil gøre, medmindre du har tal til at bakke dette op din garantier er ingenting.

  • hvor mange poster kan du behandle i øjeblikket? Om dagen? I timen?
  • Hvor lang tid tager det typisk tager at vende rundt et job?
  • Hvor meget mere kapacitet, har du?

Der er også yderligere spørgsmål:

  • If your processing server (or one of your processing servers) goes down how will this affect your capabilities, will you be crippled?
  • Hvilke fordele håber du / forventer at få fra et gitter system?
  • Er dine kontormaskiner stand til at køre de job?
  • Are your (or can you jobs be converted) to wrok in this style of running?

Det sidste store punkt er at tage din tid på større ændringer, som denne. Opdater din behandling kode for at arbejde med den nye metode, benchmark igen. Eventuelt oprettelse af din behandling server til at køre en virtuel maskine, efter at alle dine forarbejdning server vil bare være en anden arbejdstager (bare en meget kraftig en relativt). Lad den nye proces at bosætte sig.

Deployment

Mit forslag ville være at pop ind på kontoret en weekend udføre alle de installationer og opsætning. Do this just before a fortnight's holiday and leave so other poor chap to deal with the consequences… maybe not…

Deployment for et system som dette behov for at være langsom. På trods af at det er relativt enkelt at etablere dette system vil påvirke hele dit kontor infrastruktur (såvel den digitale én). For det første, rul ud til et par af maskiner ad gangen, overvåge netværkstrafik, hvor arbejdstageren værter udføre på en dag-til-dag basis. Du skal muligvis ændre dit job konfiguration som svar på dine resultater.

Når systemet har afgjort med et par maskiner (lad os sige 10% af alle kontormaskiner, dvs 5) fortsat at overvåge trafikken på nettet og vært maskine performance. Næste benchmark igen, bør du nu være behandling 33% flere arbejdspladser end dit første benchmarks. Marker dette er tilfældet, eller at du i det mindste i denne ballpark. Hvis ikke, undersøge hvad der foregår, inden vi går videre. Repeat this cycle until you happily have all office machines running without killing individual machine performance or grinding your network to a standstill.

På alle tider holde benchmarking, selv efter at alle installationer er lavet. Kontroller, hvor ny kode opdateringer påvirke hastigheden på dit system, skal du kontrollere alle arbejdstagere rapporterer med og forarbejdning job. Langsomt (meget langsomt) tilvæksten dit job konfiguration for at få det bedste ud af dine medarbejdere og netværk.

Stop!

Hvad nu hvis du ønsker at stoppe dine medarbejdere i at køre på et tidspunkt? De er alle derude løb, regenerere, og prøver deres bedste for at behandle data som sultne insekter. Svaret kan synes indlysende, men det værd at tilføje just in case sin overset. Du skal blot redigere din behandling script med en exit (0) or die () eller en anden erklæring om at dræbe din behandling job. An important reason why we always try to update to the latest processing script before any run!

Demonstration System

For at skrive denne række korte artikler, jeg skabte en meget lille gitter at demonstrere de teknologier og metoder. Jeg har læst masser af artikler, tutorials, og anvendt forskellige værktøjer til at konfigurere og overvåge, hvad der foregik. På ingen måde har jeg gået ud og mættet en hel kontor med trafik og heller ikke jeg har haft adgang til en regulær medarbejdere pc for at se, hvordan vært præstation var påvirket.

Min demonstration systemet var meget ydmyg faktisk. Jeg brugte min normale desktop sat op som et job Control Server. On this I had installed mySQL server installed set up as a master in replication, PHP , and SVN linked through apache (for access via worker VM).

Jeg har nu oprettet en CentOS arbejdstager maskine på VirtualBox på en 6 år gammel Windows XP laptop. I setup scheduled tasks as specified after copying the VM onto the machine and let it go.

Den virtuelle maskine blev sat op med PHP, undergravende virksomhed, og mySQL. Jeg har checket ud en afdeling ved navn »arbejdstager« fra mit job kontrol servere repository, og sørgede for det kunne blive opdateret ved hjælp af 'svn update'. Næste jeg setup MySQL som en slave og kontrolleret, at data blev kopiere fra mySQL på jobbet kontrol-serveren ned til arbejdstageren VM. After all this I setup the bash script and the cron job.

My processing script basically went along the lines of this (very simple stuff):

  • Læs i navnefeltet
  • Counted the number of similar names in a table from the data source held on the VM
  • Tælles antallet af navne, som ovenfor, men at opdele navnet af mellemrum (dvs. fornavn, mellemnavn efternavn)
  • Gentagne denne proces 1.000 gange

Hvert job tog cirka 20 minutter at køre. På et tidspunkt åbnede jeg flere kopier af den arbejdstager VM på vinduerne bærbare computer, og så de arbejdspladser kontrolleres ud af hver af arbejdstageren IP-adresser. På dette punkt, jeg også bekræftet, at replikationen automatisk genstartes.

Forlader den bærbare computer i tomgang resulterede i en arbejdstager begynder at behandle job fra jobbet Control Server. Når genoptage laptop brug var der en forsinkelse på ca 30-60 sekunder, dette er en rimelig mængde af tid og personale vil skulle gøres opmærksom på, at deres maskine kan holde pause for en kort stund, når du returnerer til maskinen. Nyere maskiner kan ikke have en pause på denne lange. Fordelen ved mængden af ​​behandlingen udføres af disse maskiner i tomgang perioder vil mere end opveje ansatte med at vente en kort periode (f.eks 1 minut) ankommer til deres maskiner af en morgen (jeg ofte vente længere, at dette for en Windows Defender Update til at finde sted), hvis de blev gjort opmærksom på dette (nyttig tid til at snuppe en morgenkaffe!).

Overall I feel confident that I have demonstrated the technologies that could be used to create such a system. I have shown that such a system does work on a (very) small scale and with some more experimenting could be scaled up utilise the resources of an office's machines. If I don't get to the point of doing this I would be very interested to know/see when someone else does.

Konklusioner / Evaluering

The next obvious step would be to actually get a real world example and start to deploy a system such as this within an office environment and see what happens. Asking a business to commit to this without a trail blazing company to prove the technology and effectiveness may be a little difficult. Grid / Distributed computing er meget populær, er nogle kredse og har nogle store applikationer (BIONC, SETI @ Home, Folding @ Home, osv.). I did not, however, find a smaller scale and simple system like this in my searches that could be rolled out within an office environment.

Jeg har oprettet en dybest set gratis system ved hjælp af primært open source-software og værktøjer til rådighed i næsten ethvert kontor. De teknologier var dybest set demonstreret og vise at udføre og arbejde som forventet. Forhåbentlig har jeg vise, at der med ikke meget arbejde, og med en meget enkel opsætning, du kan installere et kontor grid computing-system, der er kraftfuld, billig, A og skalerbar alle på samme tid.

Once a system is up and running there is almost no end to the amount of customisation and improvements you can make. For eksempel statistik / benchmarking kan nemt tilføjes viser værdien af ​​et sådant system hver dag. New machines can be added quickly and easily as and when they arrive with upgrades to existing hardware bolstering your processing power.

Jeg håber du har nydt at læse denne serie af artikler og givet dig stof til eftertanke om at drive et kontor skinnesystem. Løsningen præsenteres her, vil ikke nødvendigvis arbejde i alle situationer, men bør kunne tilpasses, så du kan få dine data forarbejdning foretaget ved hjælp af din egen løsning.

Du er velkommen til at sende mig eventuelle kommentarer, rettelser eller forbedringer, og jeg vil gøre mit bedste for at holde denne artikel opdateret til at matche.













Panorama Tema ved Themocracy

5 besøgende online nu
2 guests, 3 bots, 0 members
Max visitors today: 12 at 06:16 am UTC
Denne måned: 22 på 2011/08/06 12:30 UTC
I år: 130 kl 28-03-2011 22:40 UTC
Al tid: 130 kl 28-03-2011 10:40 UTC