01 Singleton

Information about 01 Singleton

Published on September 17, 2007

Author: CoolDude26

Source: authorstream.com

Content

Singleton:  Singleton Singleton – Úvod:  Singleton – Úvod Známý také jako Jedináček Účel zaručuje aby třída měla pouze jednu instanci k instanci poskytuje globální přístupový bod Motivace globální proměnná objekt zpřístupňuje ale nezaručuje jedinou instanci lépe - třída se sama stará o své instance na rozdíl od globální proměnné „neznečišťuje' namespace vytvoření instance se může provádět při prvním přístupu (až když je to potřeba) před vytvořením instance lze provést potřebné inicializační akce Použitelnost jediná instance třídy přístupná přes známý přístupový bod instance rozšiřitelná pomocí podtříd př.: pooling – správce nějakých systémových zdrojů DatabaseConnectionPool – přiděluje spojení do DB jednotlivým částem aplikace WindowManager – v okenním systému existuje jeden objekt spravující okna Singleton - struktura:  Struktura Součásti Singleton definuje operaci Instance, která klientům umožňuje přístup ke své jediné instanci instance je statickou metodou je zodpovědný za vytvoření jediné vlastní instance Singleton - struktura statická metoda pro přístup k instanci instance je uloženaand#xB;ve statické proměnné Singleton – spolupráce a důsledky:  Singleton – spolupráce a důsledky Důsledky řízený (globální) přístup k jediné instanci čistý namespace lze tvořit podtřídy variabilita v počtu instancí pokud je použito více vláken, je nutné metodu Instance synchronizovat aby nedošlo v důsledku kolize k vytvoření více instancí Singletonu Singleton – základní implementace:  Singleton – základní implementace Zajištění jediné instance statický ukazatel inicializovaný statickou metodou Instance Privátní konstruktor public metoda pro vyzvednutí ukazatele při přímém pokusu o vytvoření třídy kompilační chyba class Singleton { public: static Singleton* Instance(); protected: Singleton(); private: static Singleton* instance_; }; Singleton* Singleton::instance_ = 0; Singleton* Singleton::Instance() { if( ! instance_) { instance_ = new Singleton; } return instance_; } Singleton – implementace dědičnosti:  Singleton – implementace dědičnosti rodičovské třídě je třeba sdělit jakou třídu má vrátit switch registr potomků registrace potomků a jejich vyhladávání class Singleton { public: static void Register(const char* name, Singleton*); static Singleton* Instance(); protected: static Singleton* Lookup(const char* name); private: static Singleton* instance_; static Listandlt;NameSingletonPairandgt;* registry_; }; Singleton* Singleton::Instance() { if(! instance_) { const char* singletonName = getenv('SINGLETON'); instance_ = Lookup(singletonName); } return instance_; } Dodá uživateland#xB;nebo prostředíand#xB;při spuštění neexistuje-li zadaný jedináček vrátí 0 Singleton – implementace dědičnosti:  Singleton – implementace dědičnosti Problém - kde se vezmou instance potomků ve svém konstruktoru se potomek sám zaregistruje není moc hezké Singleton se již nestará o vytváření, ale o zpřístupnění class MySingleton : public Singleton { ... MySingleton() { ... Singleton::Register( 'MyS', this); } }; Singleton - příklad s bludištěm:  Singleton - příklad s bludištěm Použití AbstractFactory - továrna na bludiště MazeFactory by měla mít jen jednu instanci singleton zajišťuje vracení stejné instance třídy MazeFactory Implementace MazeFactory class MazeFactory { public: static MazeFactory* Instance(); // další rozhraní protected: MazeFactory(); private: static MazeFactory* instance_; }; MazeFactory* MazeFactory::instance_ = 0; MazeFactory* MazeFactory::Instance () { if( ! instance) { instance_ = new MazeFactory; } return instance_; } Singleton - příklad s dokonalejším bludištěm:  Singleton - příklad s dokonalejším bludištěm MazeFactory* MazeFactory::Instance () { if( ! instance_) { const char* mazeStyle = getenv('MAZESTYLE'); if( ! strcmp(mazeStyle, 'bombed')) { instance_ = new BombedMazeFactory; } else if (! strcmp(mazeStyle, 'enchanted')) { // ... other possible subclasses instance_ = new EnchantedMazeFactory; } else { // default instance_ = new MazeFactory; } } return instance_; } při definování nové podtřídy je nutné modifikovat Instance problém (netýká se tohoto jednoduchého příkladu) pro abstract factory definované ve frameworku možné řešení - použití registru Singleton – shrnutí, související NV:  Singleton – shrnutí, související NV Možné použití zjednodušení stavu aplikace - zajištění pouze jedné instance nějakého objektu řízení přístupu do DB, tiskových zdrojů… omezení plýtvaní zdrojů (lze přidělit existující spojení) možnost regulovat počty, frekvence… přístupů přidělení spojení s vhodnými právy Související NV Abstract Factory, Builder, Prototype častá implementace pomocí singletonu Facade v případě potřeby pouze jednoho vstup do systému State stavové objekty jsou často Singletony Destrukce Singletonu:  Destrukce Singletonu GoF '95 relativně jednoduchý vzor neřeší zánik objektu od té doby rozsáhlé diskuse Vlissides '98: 'I used to think it was one of the more trivial of our patterns ... Boy, I was wrong!' Zodpovědnost za zrušení kdy je objekt zrušen?? singleton vlastní sám sebe na rozdíl od Factory Method apod., které předají vlastnictví klientovi vlastnictví → zodpovědnost za zrušení různě implementačně náročné - podle toho jaké problémy chceme řešit Destrukce Singletonu - Ostrich:  Destrukce Singletonu - Ostrich 'Ostrichovo' řešení problém destrukce ignorovat statická paměť se uvolní automaticky při ukončení procesu jako každá kulturní třída by měl mít destruktor zápis do logu, uzavření spojení, odhlášení, ... obrana proti příliš aktivním klientům - private class Single { public: static Single* inst(); private: ~Single() { /*uklid*/ } Single() { /*inicializace*/ } static Single* inst_; /*nejakadata*/ }; Single* Single::inst_ = 0; int main() { Single* s = Single::Inst(); return 0; } int main() { Single* s = Single::Inst(); s-andgt;~Single(); return 0; } Destrukce Singletonu - Ostrich:  Destrukce Singletonu - Ostrich 'Ostrichovo' řešení problém destrukce ignorovat statická paměť se uvolní automaticky při ukončení procesu jako každá kulturní třída by měl mít destruktor zápis do logu, uzavření spojení, odhlášení, ... obrana proti příliš aktivním klientům - private class Single { public: static Single* Inst(); private: ~Single() { /*uklid*/ } Single() { /*inicializace*/ } static Single* inst_; /*nejakadata*/ }; Single* Single::inst_ = 0; int main() { Single* s = Single::Inst(); return 0; } Destruktor se nezavolá! Proč? Destruktor se nezavolá! Proč? Destrukce Singletonu - Ostrich:  Destrukce Singletonu - Ostrich 'Ostrichovo' řešení problém destrukce ignorovat statická paměť se uvolní automaticky při ukončení procesu jako každá kulturní třída by měl mít destruktor zápis do logu, uzavření spojení, odhlášení, ... obrana proti příliš aktivním klientům - private class Single { public: static Single* Inst(); private: ~Single() { /*uklid*/ } Single() { /*inicializace*/ } static Single* inst_; /*nejakadata*/ }; Single* Single::inst_ = 0; int main() { Single* s = Single::Inst(); return 0; } Destruktor se nezavolá! Proč? Destruktor se nezavolá! Proč? Nemáme statický objektand#xB;na který by se vyvolal destruktor ukazatel není objekt Destrukce Singletonu - Killer:  Destrukce Singletonu - Killer class SingleKiller { public: void SetSingle( Single* inst) { inst_ = inst; }; Single* GetSingle() { return inst_; } ~SingleKiller(); private: static Single* inst_; }; class Single { public: static Single* Inst(); friend class SingleKiller; private: ~Single() { /*uklid*/ } Single() { /*nejakainicializace*/ } static SingleKiller killer_; /*nejakadata*/ }; Single* SingleKiller::inst_ = 0; SingleKiller Single::killer_; Single* Single::Inst() { if( ! killer_.GetSingle()) killer_.SetSingle( new Single); return killer_.GetSingle(); } SingleKiller::~SingleKiller() { delete inst_; } idea: ukazatel zabalit do třídy starající se o destrukci 1: destrukce statické proměnné 2: destruktor killera 3: destruktor singletonu killer obsahuje ukazatel na vlastní singleton 3: Single::~Single() 2: SingleKiller::~SingleKiller() 1: dynamic atexit destructor for Single::killer_() exit() mainCRTStartup() Destrukce Singletonu - Meyers:  Destrukce Singletonu - Meyers Scott Meyers místo statické proměnné třídy a funkce vracející ukazatel na dynamický objekt ... ... funkce vracející referenci na statický objekt ve funkci nevýhoda: složitější rozšiřitelnost (vždy se vytvoří základní třída) class Single { public: static Singleandamp; Inst(); private: ~Single() { /*uklid*/ } Single() { /*inicializace*/ } /*nejakadata*/ }; Singleandamp; Single::Inst() { static Single inst_; return inst_; } int main() { Singleandamp; s = Single::Inst(); return 0; } 1: zavolá se metoda 2: inicializace statického objektu pouze při prvním průchodu registrace atexit 3: konstruktor objektu 4: návrat zkonstruovaného objektu 5: konec programuand#xB;destrukce statických proměnných 6: destruktor objektu Destrukce Singletonu - atexit:  Destrukce Singletonu - atexit Odstraňování statických proměnných LIFO - nejdříve se odstraní naposledy inicializované int atexit( void*(uFun)()); při vytváření objektu se zaregistruje funkce pro zrušení při ukončení programu se postupně zavolají registrované funkce Singleandamp; Single::Inst() { extern void __DestroySingle( void); static bool __init = false; static char __buffer[ sizeof( Single)]; if( ! __init) { new Single( __buffer); atexit( __DestroySingle); } return *(Single*)__buffer; } pseudokód co se děje při inicializaci Destrukce Singletonu - pořadí:  Destrukce Singletonu - pořadí Dead reference problem při nevhodném pořadí mohou vzniknout reference na neexistující objekty příklad: singletony Keyboard, Display, Log vytvoření instance Log pouze při chybě destrukce Logu by měla následovat až po destrukcích ostatních singletonů ... nebo aspoň poznat problém a slušně umřít inicializace Keyboard inicializace Display s chybou inicializace Log a zapsání chyby konec programu destrukce Log destrukce Display destrukce Keyboard s chybou reference neexistujícího objektu Log Destrukce Singletonu - detekce mrtvé reference:  Destrukce Singletonu - detekce mrtvé reference Detekce destruovaného objektu přidání statické proměnné, její nastavení v destruktoru class Single { public: static Singleandamp; Inst() { if( ! inst_) { if( destroyed_) throw ...; else Create(); } return *inst_; } private: static void Single::Create() { static Single theInstance_; inst_ = andamp;theInstance_; } Single() {} ~Single() { inst_=0; destroyed_=true; } static Single* inst_; static bool destroyed_; }; Single* Single::inst_ = 0; bool Single::destroyed_ = false; detekce problému nastavení zrušení inicializace přesunutaand#xB;do privátní metody příznak zrušení Destrukce Singletonu - Fénix:  Destrukce Singletonu - Fénix Detekce někdy nestačí - nutnost přístupu k singletonu kdykoliv idea: bájný pták Fénix vstane ze svého popela znovuvytvoření při detekci zrušeného objektu příklad KDL - Keyboard a Display obyčejné singletony, Log Fénix C++: paměť statických objektů zůstane zachována až do konce běhu programu class Singleton { ... void KillPhoenix(); }; void Singleton::OnDeadRef() { Create(); new(pInstance_) Singleton; atexit(KillPhoenix); destroyed_ = false; } void Singleton::KillPhoenix() { pInstance_-andgt;~Singleton(); } zbytek třídy nezměněn při detekci zrušení se uloží reference na paměť zrušeného objektu destruktor proběhl paměť zůstává zachována placement new zavolání konstruktoru registrace destruktoru fénixu explicitní zavolání destruktoru nelze delete ! Destrukce Singletonu - dlouhověkost:  Destrukce Singletonu - dlouhověkost Problém fénixe - obnovení stavu někdy může být oživení obtížné ztráta stavu, uložení, uzavření, ... Singleton s dlouhověkostí při vytváření singletonu priorita destrukce KDL - Log bude mít větší dlouhověkost explicitní mechanismus destrukce objektů nelze použít destrukci řízenou kompilátorem - pouze dynamické objekty class SomeSingle { ... }; class SomeClass { ... }; SomeClass* pGlobalObject(new SomeClass); template andlt;typename Tandgt; void SetLongevity(T* pDynObj, int longevity); int main() { SetLongevity(andamp;SomeSingle().Inst(), 5); SetLongevity(pGlobalObject, 6); ... } mechanismus by měl fungovatand#xB;na jakékoliv (dynamické) objekty šablona proand#xB;nastavování dlouhověkosti po ukončení programu se objekty destruují v tomto pořadí prioritní fronta na zabití Destrukce Singletonu - implementace dlouhověkosti:  Destrukce Singletonu - implementace dlouhověkosti prioritní fronta při stejných prioritách se chová jako zásobník pravidlo C++ - dříve inicializované objekty se destruují později čeho to bude fronta? neexistuje společný předek, registrační funkce je šablona ukazatel na abstraktního předka šablon obsahujících ukazatel na objekt delete obj; šablona instanciovánaand#xB;a objekt vytvořenand#xB;šablonou SetLongevity virtuální držákand#xB;virtuální destruktor Destrukce Singletonu - implementace dlouhověkosti:  Destrukce Singletonu - implementace dlouhověkosti class LifetimeTracker { public: LifetimeTracker(unsigned int x) : longevity_(x) {} virtual ~LifetimeTracker() = 0; friend inline bool Compare( unsigned longevity, const LifetimeTracker* p) { return p-andgt;longevity_ andgt; longevity; } private: unsigned longevity_; }; inline LifetimeTracker::~LifetimeTracker() {} typedef LifetimeTracker** TrackerArray; extern TrackerArray pTA; extern unsigned int elements; template andlt;typename Tandgt; struct Deleter { static void Delete(T* pObj) { delete pObj; } }; virtuální držák umí zabíjet ... ... a porovnávat stáří vlastní fronta na zabití způsob zabití defaultně delete lze i free, ... Destrukce Singletonu - implementace dlouhověkosti:  Destrukce Singletonu - implementace dlouhověkosti template andlt;typename T, typename Destroyerandgt; class ConcreteLTT : public LifetimeTracker { public: ConcreteLTT(T* p, unsigned longevity, Destroyer d = Deleterandlt;Tandgt;::Delete ) : LifetimeTracker(longevity), pTracked_(p), destroyer_(d) {} ~ConcreteLTT() { destroyer_(pTracked_); } private: T* pTracked_; Destroyer destroyer_; }; konkrétní tracker pro objekty typu T odvozený od virtuálního držáku automaticky vytvořený šablonou umí kulturně zemřít zná objekt na zabití Destrukce Singletonu - implementace dlouhověkosti:  Destrukce Singletonu - implementace dlouhověkosti template andlt;typename T, typename Destroyerandgt; void SetLongevity(T* pDynObject, unsigned int longevity, Destroyer d = Deleterandlt;Tandgt;::Delete) { TrackerArray pNewTA = static_castandlt;TrackerArrayandgt;( realloc(pTA, sizeof(T) * (elements + 1))); if (!pNewTA) throw bad_alloc(); pTA = pNewTA; LifetimeTracker* p = new ConcreteLTTandlt;T, Destroyerandgt;( pDynObject, longevity, d); TrackerArray pos = upper_bound( pTA, pTA + elements, longevity, Compare); copy_backward(pos, pTA + elements, pTA + elements + 1); *pos = p; ++elements; atexit(AtExitFn); } static void AtExitFn() { assert(elements andgt; 0 andamp;andamp; pTrackerArray != 0); LifetimeTracker* pTop = pTA[elements - 1]; pTA = static_castandlt;TrackerArrayandgt;(realloc(pTA, sizeof(T) * --elements)); delete pTop; } Pozor! Prvek vyjmoutand#xB;z fronty dříve než delete Proč? Šablona - pro každý typ vygeneruje funkci místo na nový záznam nový konkrétní tracker pro daný typ rozhrnutí podle longevity zatřídění a registrace provede se při exitu delete  ~ConcreteLTTandlt;Tandgt;  destroyer  ~T Destrukce Singletonu - multithreading:  Destrukce Singletonu - multithreading Vícevláknové prostředí samo o sobě není pokryté standardy platformové závislé knihovny krásná rasová konvice  Ochrana mutexem velmi neefektivní - zamykání při každém přístupu Singletonandamp; Instance() { if( ! instance_) { instance_ = new Singleton; } return *instance_; } sem se dostanou obě vlákna dva Singleton objekty  Singletonandamp; Instance() { // mutex_ is a mutex object Lock guard(mutex_); if( ! instance_) { instance_ = new Singleton; } return *instance_; } konstruktor zamkne destruktor odemkne Destrukce Singletonu - Double-Checked Locking:  Pokus o zefektivnění zamykání pouze při inicializaci nefunguje! kód se sice zamkne druhé vlákno se tam dostane později Double-Checked Locking Pattern Doug Schmidt andamp; Tim Harrison, C++ Report 1996 Singletonandamp; Instance() { if( ! instance_) { Lock guard(mutex_); instance_ = new Singleton; } return *instance_; } Destrukce Singletonu - Double-Checked Locking přesun do inicializace Destrukce Singletonu - Double-Checked Locking:  Double-Checked Locking Pattern Doug Schmidt andamp; Tim Harrison, C++ Report 1996 Už je to konečně správně? Singletonandamp; Singleton::Instance() { if( ! instance_) { Lock guard(lock_); if( ! instance_) { instance_ = new Singleton; } } return *instance_; } Destrukce Singletonu - Double-Checked Locking test inicializace sem se může dostat víc vláken odsud už jen jedno vlákno zde mi to už nikdo nezmění Destrukce Singletonu - Double-Checked Locking:  Double-Checked Locking Pattern Doug Schmidt andamp; Tim Harrison, C++ Report 1996 Už je to konečně správně? C++ - není!  víc vláken - norma nezaručuje vůbec nic speciálně multi- a vícejaderné procesory zápisy a čtení různých vláken nemusí být sekvenční řešení: platformově závislé synchronizační primitiva memory barriers, ... Singletonandamp; Singleton::Instance() { if( ! instance_) { Lock guard(lock_); if( ! instance_) { instance_ = new Singleton; } } return *instance_; } Destrukce Singletonu - Double-Checked Locking test inicializace sem se může dostat víc vláken odsud už jen jedno vlákno zde mi to už nikdo nezmění Obecná implementace Singletonu:  Politiky (Policy classes) mnoho kombinací možností implementace šablona s možností vlastních voleb Alexandrescu: Modern C++ Design knihovna Loki (@SourceForge) template andlt; class T, template andlt;classandgt; class CreationPolicy = CreateUsingNew, template andlt;classandgt; class LifetimePolicy = DefaultLifetime, template andlt;classandgt; class ThreadingModel = SingleThreaded andgt; class SingletonHolder { ... }; Obecná implementace Singletonu class KeyboardImpl { ... }; class LogImpl { ... }; inline unsigned int GetLongevity(KeyboardImpl*) { return 1; } inline unsigned int GetLongevity(LogImpl*) { return 2; } typedef SingletonHolderandlt;KeyboardImpl, SingletonWithLongevityandgt; Keyboard; typedef SingletonHolderandlt;LogImpl, SingletonWithLongevityandgt; Log; Obecná implementace Singletonu - politiky:  Obecná implementace Singletonu - politiky Singleton - shrnutí:  Singleton - shrnutí Implementace bez destrukce statická proměnná obsahující ukazatel na dynamický objekt Destrukce bez závislostí naivní pštrosí metoda nefunguje, destruktor se nezavolá Killer obalení ukazatele třídou starající se o destrukci Meyers funkce vracející referenci na statický objekt Destrukce podporující závislosti dead reference detection při detekci zrušeného objektu výjimka Fénix po zrušení objektu jeho znovuvytvoření dlouhověkost specifikace pořadí destrukcí Více vláken Double-checked locking problémy se synchronizací pretty simple pattern 

Related presentations


Other presentations created by CoolDude26

CH8 PowerPoint Robotics
31. 12. 2007
0 views

CH8 PowerPoint Robotics

challenging behavior
17. 09. 2007
0 views

challenging behavior

ch1
17. 09. 2007
0 views

ch1

IP P mohan
19. 09. 2007
0 views

IP P mohan

RMP October 2006 Data
11. 10. 2007
0 views

RMP October 2006 Data

standing2
12. 10. 2007
0 views

standing2

lam talk
15. 10. 2007
0 views

lam talk

Escher
15. 10. 2007
0 views

Escher

2006 Radicarbon History
16. 10. 2007
0 views

2006 Radicarbon History

pre b373
17. 10. 2007
0 views

pre b373

banderas2
22. 10. 2007
0 views

banderas2

ostrichsm
17. 09. 2007
0 views

ostrichsm

209 OASIS Ostrich presentation
17. 09. 2007
0 views

209 OASIS Ostrich presentation

ssec software development
07. 10. 2007
0 views

ssec software development

dianxinyezhuanxing
12. 10. 2007
0 views

dianxinyezhuanxing

africa presentation
23. 10. 2007
0 views

africa presentation

spatial databases
23. 10. 2007
0 views

spatial databases

vollhardt lecc2005
17. 10. 2007
0 views

vollhardt lecc2005

232nm13
29. 10. 2007
0 views

232nm13

ans321L2
17. 09. 2007
0 views

ans321L2

Plan Bleu partie2
24. 10. 2007
0 views

Plan Bleu partie2

05 galaxies
29. 08. 2007
0 views

05 galaxies

nuclearWeapons
23. 12. 2007
0 views

nuclearWeapons

ChristensenNov2
29. 08. 2007
0 views

ChristensenNov2

Unit3
03. 01. 2008
0 views

Unit3

como fazer palestra espirita
07. 01. 2008
0 views

como fazer palestra espirita

XES Architecture Vacuum v2
17. 09. 2007
0 views

XES Architecture Vacuum v2

2 tinyos
29. 10. 2007
0 views

2 tinyos

Lecture16 overheads
21. 08. 2007
0 views

Lecture16 overheads

Hip Injuries in Athletics PartI
01. 08. 2007
0 views

Hip Injuries in Athletics PartI

jsimon irvine
29. 08. 2007
0 views

jsimon irvine

GeorgeMiley LOFAR May06
29. 08. 2007
0 views

GeorgeMiley LOFAR May06

jim brady
05. 10. 2007
0 views

jim brady

automotive invitation
24. 10. 2007
0 views

automotive invitation

microscopy
15. 10. 2007
0 views

microscopy

General Psychopathology
16. 02. 2008
0 views

General Psychopathology

The Virus of Violence
20. 02. 2008
0 views

The Virus of Violence

cindy pragma grid
17. 10. 2007
0 views

cindy pragma grid

ASOCallPresentation2 006WBSD
18. 03. 2008
0 views

ASOCallPresentation2 006WBSD

China Korea Trip Info
25. 03. 2008
0 views

China Korea Trip Info

A105 021 GalI
29. 08. 2007
0 views

A105 021 GalI

widefield yan
29. 08. 2007
0 views

widefield yan

blain cosmoskyoto
29. 08. 2007
0 views

blain cosmoskyoto

Corporate Profile November 2007
27. 03. 2008
0 views

Corporate Profile November 2007

Cal Mrtg Watkins
10. 04. 2008
0 views

Cal Mrtg Watkins

pcreek
13. 04. 2008
0 views

pcreek

7 9 kraft
29. 08. 2007
0 views

7 9 kraft

neos innovation challenge short
14. 04. 2008
0 views

neos innovation challenge short

nslab diffserv 06a
16. 04. 2008
0 views

nslab diffserv 06a

podraza medicare
17. 04. 2008
0 views

podraza medicare

Capitalizing
18. 04. 2008
0 views

Capitalizing

Meyer
22. 04. 2008
0 views

Meyer

forbes manhattan presentation
28. 04. 2008
0 views

forbes manhattan presentation

cs4811 ch09 uncertainty
17. 09. 2007
0 views

cs4811 ch09 uncertainty

Managing Tough Decisions
17. 09. 2007
0 views

Managing Tough Decisions

David Ellis powerpoint
30. 04. 2008
0 views

David Ellis powerpoint

Anesthetic Machines
02. 05. 2008
0 views

Anesthetic Machines

ADSL NTT
09. 10. 2007
0 views

ADSL NTT

ABM12006
15. 10. 2007
0 views

ABM12006

Richstone Mitchell
29. 08. 2007
0 views

Richstone Mitchell

CIP TOA and Beyond 5 29 07
03. 01. 2008
0 views

CIP TOA and Beyond 5 29 07

Thomson top panic05
18. 06. 2007
0 views

Thomson top panic05

Thesis defense rev12
18. 06. 2007
0 views

Thesis defense rev12

tftge dec 02
18. 06. 2007
0 views

tftge dec 02

Temp bone trauma slides 051012
18. 06. 2007
0 views

Temp bone trauma slides 051012

tamara
18. 06. 2007
0 views

tamara

tactical euro condor06
18. 06. 2007
0 views

tactical euro condor06

Stolarz D 1603
18. 06. 2007
0 views

Stolarz D 1603

stoc04
18. 06. 2007
0 views

stoc04

stabicp slides
18. 06. 2007
0 views

stabicp slides

Sofia Sima 2 ext new
18. 06. 2007
0 views

Sofia Sima 2 ext new

slacbaryo genesis
18. 06. 2007
0 views

slacbaryo genesis

iyef project homeless connect
31. 10. 2007
0 views

iyef project homeless connect

SOFG
18. 06. 2007
0 views

SOFG

NorthStar
13. 11. 2007
0 views

NorthStar

rickwilliams
21. 08. 2007
0 views

rickwilliams

Noah s Ark
03. 10. 2007
0 views

Noah s Ark

ambertech
19. 11. 2007
0 views

ambertech

Soc RespI SOC02
17. 09. 2007
0 views

Soc RespI SOC02

Internet Protocol Addresses
15. 06. 2007
0 views

Internet Protocol Addresses

Colour Reconnection
15. 06. 2007
0 views

Colour Reconnection

Research & Development
15. 06. 2007
0 views

Research & Development

Low Frequency Gravitational Wave
15. 06. 2007
0 views

Low Frequency Gravitational Wave

vander Marel mgct2 win
29. 08. 2007
0 views

vander Marel mgct2 win

G020514 00
17. 09. 2007
0 views

G020514 00

aas calzetti
29. 08. 2007
0 views

aas calzetti

jokes riddles
17. 09. 2007
0 views

jokes riddles

vaulttutorial
19. 09. 2007
0 views

vaulttutorial

Ch90 ExtensionsToFOPC
17. 09. 2007
0 views

Ch90 ExtensionsToFOPC

Mercurio
29. 08. 2007
0 views

Mercurio

Eric Gawiser pire galclust
29. 08. 2007
0 views

Eric Gawiser pire galclust

Eric Gawiser pire galform
29. 08. 2007
0 views

Eric Gawiser pire galform

1 Dirk Van Braeckel
23. 10. 2007
0 views

1 Dirk Van Braeckel

directors roundtable 0407
02. 10. 2007
0 views

directors roundtable 0407

MWR
01. 08. 2007
0 views

MWR

astro101 2000oct
15. 11. 2007
0 views

astro101 2000oct

CCAT06 Chapman
29. 08. 2007
0 views

CCAT06 Chapman

nips06 tutorial
17. 09. 2007
0 views

nips06 tutorial

90convexpo Jeff Tobe ppt
17. 09. 2007
0 views

90convexpo Jeff Tobe ppt