POZNÁMKA: Architektura je v aktivním vývoji: události prostřednictvím Kafky, bajty prostřednictvím Media Gateway do MinIO, analytika v ClickHouse a tenké čtení API pro GUI. Ingest píše WARCs; shrnutí jsou sidecar objekty klíčovány přesným textovým hashem. Tento příspěvek sleduje velké nápady; jemně zrnité témata (témata / schémata, skóre funkce, RBAC, DLQ) přistane, jak se stabilizují. BillsTechDecková Mnohokrát v životě musíme něco udělat, ne proto, že je to snadné, ale proto, že je to těžké. Jsem v jednom z těchto prostorů. Můj sen: vybudovat program, který vyzvedne a koreluje s technickými novinkami. Zajímá vás další gen rozšířené reality? BillsTechDeck vám může pomoci najít informace o tom! Svět je široce otevřený pro typy gadgetů a technických oznámení, které můžete získat z korelovaného zdroje, abyste vyhodnotili technologické trendy a možná získali celkový obraz, který vás může unést energickým googlováním. Je to problém, který jsem narazil při pohledu na informace o Vision Pro od Apple nebo když jsem čekal na nové zprávy o Switch 2. Začněme s přehledem systému tím, že ukážeme průtokový diagram (hrubý). Některé úvahy: všechny šipky ukazující zpět na zprávu proudí do různých front. Také, zvažte každý subsystém, aby byl v Docker kontejnerech a orchestrován K8 a v potrubí CI / CD (nezahrnul jsem ho do grafu, protože by to bylo příliš zaneprázdněné). V podstatě chci zprávy, trendy, zdroje, analýzy, shrnutí na jednom místě, abych vytvořil koherentní objem dat, který mohu pochopit zeitgeist technických zpráv, gadgetů a trendů. Pokus o něco koherentního: Nyní jsem jen koníček, takže netvrdím, že něco vím. Bavím se, což je opravdová radost. Znovu jsem to zopakoval Hodně sooooo Pojďme rozbít kroky (odcházet Související kroky : Kafka Harvester čerpá vstupy z IngressOrca, který je založen na informacích z FeedbackService. Používá MinIO jako způsob, jak spojit WARCs a také být schopen nakládat s bohatými médii distribuovaným způsobem. Médium je uloženo v MinIO clusteru (Media Cluster), který pracuje na klíčích sha256 a sha1 (v případě WARCs, ale budou mít také sha256 hash klíče pro systémovou kongruenci) Sanitizer dostane pracovní místa v řadě z Harvesteru a čerpá média z mediální brány k sanitizaci.Pokud je špinavá, stále ji udržujeme, abychom vykonávali forenziku v kontrolovaném prostředí OCR se spouští na bohatých médiích na základě pracovních míst od Kafky spaCy (NER) je spuštěn na všechno. spaCy předkládá propojenou práci do sanitární kontroly spaCy, a pokud je to správné, je odesláno do skóre služby, aby se rozhodlo, zda je automatické shrnutí phi4 oprávněné, pokud není oprávněné, je odesláno do korelačního motoru. Phi4 se spouští na konkrétních částech dat buď zaručených službou skóre nebo iniciovaným uživatelem. Korelační motor běží na všem Každý subsystém bude mít robustní audity a předloží se do logových frontů, které budou spravovány LogHandlerem a v LogSilo/ElasticSearch. Podsystémy/prodejci, kteří potřebují přístup k médiím, budou s klastrem MinIO komunikovat prostřednictvím klidného volání prostřednictvím MediaGateway. Různí manipulátoři hovoří s GUIHandlerem, který zobrazuje na GUI. GUIHandler může odesílat ControlEvents (žádat o phi4 shrnutí, upravovat věci) FeedbackService mluví s HistoricalHandlerem, aby čerpal z HistoricalSilo, aby vyškolil model, který poskytne lepší informace pro IngressOrca (Orchestrator), aby lépe zvolil, kdy, kde a jak můžeme čerpat lepší informace, abychom snížili plýtvání zdroji na hromadných datech Veškerá data jsou uložena v klastru MinIO (MediaCluster) a přístup prostřednictvím klidných hovorů Volání do Guihandleru se provádí odpočinkovými voláními Všechny subsystémy jsou kontejnerizovány a orchestrovány společností Kubernetes Harvesterová vstupní Feedbackové služby sanitizační Harvesterová OCR Vnitřní prostor (NER) Bláznivý obchodník Phi4 Korelační motor Logopeda LogSilo / Elastické vyhledávání Mediální cesta Mediální cluster Mediální cesta obchodník obchodník kontrolní Feedbackové služby Historický obchodník Historická vstupní Mediální klastr obchodník I'm sure I left out some detail, but that's the gist. The Harvester: Shromažďování dat Shromažďování dat Jak jsme shromáždili naše novinky o štíhlém Pixel Fold 3? Musíme to vytáhnout z internetu! Různé zdroje vyžadují různé metody sběru dat. Velké problémy, se kterými se potýkáme, jsou Všechny stránky mají také specifické struktury (jak složité).Naštěstí máme neuvěřitelný ekosystém za sběrem dat. detekce botů, filtrování DDoS, captchas, malformované informace Python je jeden z jazyk k použití pro tento účel a má živou komunitu, která usilovně pracuje na tom, aby pomohla hobbyistům, jako jsem já, uchopit klíčové informace o technologických specifikacích Steam Deck 2 a dalších rozhovorech o tom (jak neuvěřitelné). Neuvěřitelné Recon What is the site structure? What is the site's flow? What tricks are companies like Akamai pulling to impede my ability to get my precious tech snippets? What values change and where? When does my cookie become invalid depending on an abnormal flow? Does the javascript try to fool me? Is it dynamic, obfuscated or check for tampering? Are my user agents okay and when do I rotate them? How do I handle headers? How do I handle TLS Fingerprinting? This list is getting long so I'll just add "heuristics" Jedná se o velmi zapojený proces a vyžaduje dobré množství pozornosti. Takže cíle pro získání mých technických zpráv musí být kurovány obecně a rozsáhlé. a shromažďovat cenné informace o místech a jejich heuristiky je důležité. Padá Nastavení proxy CAPTCHAs *: image recognition tasks* Tradition CAPTCHAs *: Machine learning looking at user behavior to determine bot behavior* ReCAPTCHA *: pesky things that run in the background by grumpy site admins looking to stop me* Invisible CAPTCHAs Tradiční captcha Recaptcha Neviditelné CAPTCHA Zatímco menší seznam, to jsou rozhodně obrovské překážky a v žádném případě a vyčerpávající seznam. Všechny řešení těchto problémů vyžadují komplexní řešení. Mohla bych pokračovat, ale věřím, že přidám věci, jako je používání renomovaných rezidenčních proxy, mobilních proxy, omezování sazeb, uznávání a zmírňování otisků prstů zařízení a nakonec medové hrnce. Proto musíme mít různé úrovně přístupu: Graduate Response Crawling strategie "Testujte s granátovou pistolí, vystupte na příkaz, pokud je to fubar'd." "Testujte s granátovou pistolí, vystupte na příkaz, pokud je to fubar'd." : Level 1 Pellet Gun aiohttp scrapy Use for static pages, public APIs, or weakly protected endpoints. Low noise, low cost. : Level 2 Scoped Rifle Playwright + stealth plugins Use for JS-rendered sites, light bot defenses, simple captchas. Mimics real users, simulates browser behavior. Level 3: Ordinance Crawl4AI / Nodriver , heavyCAPTCHA solving , Mobile proxies Use when you hit: invisible captchas, anti-bot JavaScript puzzles, DOM obfuscation, or flow control defenses. Heavy but necessary for hard targets. Pelletová pistole Zastřelená puška příkaz Why This Matters Účinnost: Nespalujte Playwright cykly, když curl funguje. Stealth: Vyhněte se zbytečnému zvyšování poplachů. Dlouhověkost: běžet měsíce bez zákazu, ne týdny. I když nyní zavádíme složitost, která je v pořádku. Na začátku budeme mít velmi jednoduchá pravidla. Stává se robustnější můžeme dělat lepší hovory na lepší místa, protože bychom měli a vzory, které nás vedou. Historická Historická data Historická Tato část systému je pravděpodobně a bude ten, který vyžaduje neustálé aktualizace kvůli hře s kočkou a myší mezi weenies běžícími stránkami, které mě drží od mých sladkých, sladkých zpráv Samsung. most essential Přišel jsem s plánem, abych mohl vstřebávat, vstřebávat, vstřebávat a být schopen ověřit, než se opravdu musím starat o stahování dat v reálném čase. to be async and non-blocking. Internetový archiv Python Wrapper Kdybych právě začal čerpat spoustu aktuálních dat, neměl bych dobrou jistotu, že moje korelace nic neznamenají. Tento přístup mi umožňuje vstřebávat a soustředit se na zbytek systému, aniž bych musel stavět crawler, který bude vyžadovat spoustu změn. No data should be trusted: Umění lidí, kteří chtějí otrávit váš systém Umění lidí, kteří chtějí otrávit váš systém What's the problem with taking data from the internet? Well, anyone who has been on the internet for any length of time knows about the dirty trolls. Actors who are out to hose you and your noble goal of getting the new smart phone information. Because the fact that people want to pwn you, you have to assume the worst. Pojďme zdůraznit některé obavy (ne vyčerpávající seznam, jen chuť) Malice in action Javascript Payloads (XSS, Embedded goodness, etc) Worry about data exfiltration Browser Exploits Redirection and Phishing PDF Macros and Embedded Object Can do spooky things like "remote code execution" Info disclosures Initiate connections to scary C2's Handling various filetypes Office Document macros EXE/DLL (less of a concern since they'd be filtered Malicous archive files that contain executables and path traversals Image/Media file: hiding stegonagraphy or utilizing dirty dirty codecs Data Integrity Tampered data Spoofed sources People looking to poison my system with generally bad data Některé věci jsem z tohoto seznamu vynechal (jako servery, které se pokoušejí DDoS můj sběrač tím, že podávají tuny nepotřebných dat, aby ublížili mým pocitům). We first off want to isolate and contain all data we haven't vetted. A separate black box that either resides on a different network system or is . While occurs, it has to be weighed with the caveats that come with air-gapping (which I won't bore anyone with). air-gapped VLAN hopping Jedna úroveň běží rules on a file. Which is fine, and a great starting point. We have tools for macro analysis. We have Můžeme ověřit, že soubory jsou to, co jsou (zajištění, že špinavé troly neskrývají exe). Kontrolujeme hashy proti hrozbám. YARA PDF static code analysis We also have at the other extreme. It Až do doby, než se dostane do internetového archivu, přichází caveats. It provides dynamic analysis, behavioral reporting, threat detection... , Některé špinavé soubory mohou detekovat prostředí sandboxů. Jiné je mohou uniknout. Je to zdrojově náročné a má složité nastavení. Je to příliš zdrojově náročné a komplexní na chvíli. Kuřecí won't be implemented significant But it can be thwarted! it can be thwarted! Lastly, we have to worry about data poisoning. I don't have a clear path on how to handle this. There is a breadth of research papers I am going to go through to better understand the problem and approaches. No one said . I write this not a definitive writing of what I'm doing. More so highlighting the amount of ways bad hombres can Já a můj systém. safety is easy staggering compromise I have yet to see a lock that can't be picked. I can only make it as complicated as I can. With that in mind, I am designing this part with . Performance, memory safety and I just like it a lot. This will be a Média budou vyzvednuty a zveřejněny na Pro interakci s (MinIO cluster) Rust Tokio Mediální cesta Mediální klastr Mediální cesta Mediální klastr Na závěr : In conclusion: In conclusion: Ve většině případů, are for Čím dál mohu dát sladká, sladká jablka na strom a the better. bad actors looking Nízké zavěšení ovoce minimize my attack surface Pokud jsou údaje skanky, karanténujeme je, abychom je mohli analyzovat. . Historická Historická P4 střední: summarizing for busy people like me summarizing for busy people like me přicházejí s mnoha výzvami. zdroj moudrý, obsah moudrý. nicméně, mají také schopnost dát nám pevné shrnutí potenciálně dlouhých kousků informací. (Potřeboval jsem něco silnějšího) LLM je Phi4 střední Proč bych si vybral toto? Goldilocks size and performance Medium is bigger than mini. Medium has 14 billion parameters. Competitive enough with larger models but more efficient Optimized for my use cases Vhodné pro místní nasazení Cost effective (since I'm a lowly cabbage farmer) Flexibility in deployments I need something local and powerful and it fits the bill. Having it being its own docker image makes it easy. Another positive is my ability to fine tune it (for my greedy need for information on the new iPhone). Caveats! Hallucination Tis the cost of doing business. For this I may have to implement and RAG system. My own guys are working against me! *sigh* English In the end this is not an overall large deal since I'm not multilingual. Though it adds complexity should I want to expand data sources to places I can't understand I'm pigeonholing myself into consuming English. Vlastní lidé pracují proti mně! Angličtina Co tedy dělá a like me do? headstrong cabbage farmer Sanity checks. Things like volume yields : Checks if the summary's length is reasonable. Meaning Did Phi-4 produce a 150-word summary as requested, or did it return a single sentence or a 10-page novel? . Cardinality or categorical value checks : Checks if the entities (people, places, etc.) in the summary are a valid subset of the entities in the original article. Primary defense against hallucination. Meaning Does the summary mention 'Germany' when the source text only ever mentioned 'France'? . Completeness and fill rate checks Checks for the omission of critical information. Meaning: The original article mentioned three key companies, but the summary only includes one. Is the summary missing vital information? Uniqueness checks Checks for repetitive or redundant content within the summary. Meaning: Did the model get stuck in a loop and repeat the same sentence three times? . Range checks Checks if numerical data in the summary is factually correct based on the source. Meaning: The source text says profits were '$5 million,' but the summary says '$5 billion.' Is this a catastrophic numerical error? Presence checks The most basic check: did the service return anything at all? Meaning: Did the Phi-4 service time out or return an empty string instead of a summary? Data type validation checks. Checks if the summary adheres to the requested structure. Meaning: I asked for a JSON object with a 'title' and 'key_points' array. Is the output valid JSON with those exact keys? Consistency checks The deepest check for factual grounding and logical contradiction. Meaning: The source text says 'the project was cancelled,' but the summary implies it's ongoing. Does the summary contradict the facts of the original article? Things like volume yields Cardinality or categorical value checks Kompletnost a kontroly plnění Unikátní kontroly Range kontroly Presence checks Kontrola typu datové validace. Kontrola konzistence This list can quickly become like Benjamin Buford Blue naming uses for shrimp so I'll top it off there. To bude automaticky spuštěno na základě služby skóre nebo ručně požadované . moi Grabbing Entities with spaCy: Ať grabbing Relevantní věci grabbing Relevantní věci We are at the v sekci . spaCy Which model do I choose? nabízí celou řadu předškolních modelů, všechny s vlastním použitím. so out of the box . I will likely need to fine tune a custom a přidat . At the start I will need to annotate data to train my model (there are open source tools to somewhat automate this process). This will also encompass training it to . spaCy Obecný webový obsah it won't recognize tech jargon Není model custom components Rozpoznání typů entit I will need to be ( and ). I to go in and do and (tj. „Apple“ společnost a „apple“ ovoce). s tím přichází možnost budování vlastního subjektu propojení komponentu nebo externí integrace nástrojů (naději ne). fluent Pravidla založená na shodě matcher EntityRuler will need entity linking disambiguation Vzhledem k tomu, že se momentálně starám pouze o angličtinu, jsem požehnán tím, že neznám detekci jazyků. Past that I will need to consider performant things like and . When not in use turn it off! batch processing Složení deaktivuje S ohledem na možné Běhání s Budu muset zvážit na základě modelů a Využití paměti RAM je také nutné brát v úvahu. Paralelní procesy Pí4 CPU GPU There's Budu muset naplánovat text mimo doménu, do kterého se nevyhnutelně dostanu a je pro mě zásadní vědět, jak se s ním vypořádat. pre-processing, post-processing and possibly integrating external logic and models A na závěr a téměř nejdůležitější: Sanity checks. Schéma validace Kontrola správných datových typů Paying close attention to the behavior around critical fields Defining expected data types Establishing acceptable ranges with things like dates and word counts Define allowed values Define completeness thresholds Zvažování pravidel cross-fieldové konzistence Mnoho výše uvedených hygienických kontrol se zde vztahuje, ale v podrobnějším smyslu se zabývá entitami. seznam pokračuje a opět se stává seznamem použití pro krevety pro Forrest Gump. Cítím se v pohodě, pokud jde o úplnost této části. Data o korelaci: Dát věcem smysl Dát věcem smysl V tomto systému je important. I need a language that can provide me some memory guarantees as well as stop me from making newbie mistakes. I drifted towards na začátku. pomyslel jsem si a vrátil jsem se do . I'm simply not an experienced programátor a pravděpodobně by implementoval věci, které by otřásly mým systémem. Data korelace incredibly C++ Rust C++ v podstatě, Vezměte entity z and connects the dots. It will utilize to . I needed some real granularity and functionality for statistics in correlation. An earlier draft incorporated RocksDB, which wasn't robust enough with recent developments. Rust spaCy ClickHouse write/read/store pertinent věci So stats will be important (yay!). a způsob kódování je klíčový a budu muset být velmi promyšlený s tím, co dělám, proč to dělám a jak implementuji věci. for this part since I will have a lot of I/O processes talking to . idomatický Tokio Kliky Využíváme veškeré subjekty a Srovnávejte s nimi . Rich analýza historical data Zvažuji následující věci: Je tento vztah statisticky významný? Is this correlation more than just "chance"? Is this significance worth creating a graph relationship with? Is there factual backing to put emphasis on this specific relationship? Takže bych měl dělat věci, jako je vytvoření for connections. It'd also be a good idea to establish , měřítko, které skóre, jak moc je pravděpodobnější, že dvě entity se objeví společně než náhodou. kde vysoké a negativní skóre mi říkají skvělé věci o korelaci. p-value Pointwise Mutual information Using stats is essential for filtering out noise. For instance, the entities a se objeví spolu tisíckrát, ale toto spojení je a particularly insightful. Statistics help us prove that a rarer connection, like a specific tech company and a government agency, is far more significant even if it only appears a few times. Also, thinking of the Její Protože je to a . 'Apple' 'iPhone' obvious not Whitehouse not significant white building Předtím, než jsem se dostala do některých pojmů, které se cítím mimo oblast působnosti tohoto přehledu, nechám to na tom. Data: Zadní kostra the backbone Takže co mám dělat se všemi těmito údaji o horkých nových technologických předmětech? I hoard it. Budeme mít více databází (PostgreSQL, ClickHouse, Neo4j, MinIO a další) Veškerá data budou zpracována prostřednictvím . One will handle operations, one which will be used to store artifact data Dva z nich budou (Některé a ). Its a lot, but each DB has its own strength and I believe a simple To by mělo značné nevýhody. data handlers Neo4J Postgresivní (basically a metadata registry) ClickHouse Historická Korelace SQL Server pro všechno Historická Korelace datové struktury, Tabulky a primární klíče budou rovnoměrné (komplexní mezi jinými věcmi). bude výrazně jednodušší, i když bude určitě vyžadovat spoustu péče. Bude to zdroj spousty kontemplace, slz a frustrace. Dobrý design se vyplatí ve špejlech. Přiblížím se k tomu později, protože mám pocit, že budu mít mnohem lepší představu o tom, co potřebuji dále v systému, který dostanu. Dobře Kliky Skladované postupy umělecké ArtifactSilo is another beast. I feel as long as my V něm by mělo být painless (famous last words). My feelings are that I essentially want to try and make it as dumb as possible. I want to be able to point to point to my correlation engine and understand the If I started adding layers of complexity and correlation logic the data becomes more coupled and detracts from the value of my correlation engine ČT4J Correlator není telefonování Relativně „Proč?“ Tyto Bude to A DB have a lot of granular data from things like: Historická ClickHouse HistoricalSilo Kde získáváme dobré údaje Jaké vyhledávací dotazy přinesly nejlepší data What harvesting methods worked the best for which data source Where/when and potentially why we got dirty data Analýza těchto špinavých dat Pravděpodobně jich je mnohem víc a najdu je, až se k tomu dostanu. Tyto cluster bude mnohem méně bolestivé provádět než ostatní. stále musím ujistit, že vše je pás a zavěšení. Miníček Databáze bude intenzivní zážitek. Bude tam ještě hodně. Úvodní stránka > Webapp Time! Tyto Bude to A Zpočátku jsem to chtěl udělat desktopovou aplikací. uvědomil jsem si, že nakonec chci, aby ji používalo více lidí. Nebyla by to skvělá volba. Gui webapp Písek6 Použití A Mám přístup k tak široké škále knihoven. Mám neuvěřitelný přístup k informacím, které nemusí být k dispozici, pokud jsem použil GUI. , mé cíle byly velmi odlišné. Upřímně řečeno, prostě jsem nechtěl psát gui v Pythonu. Nemám dobrý důvod, proč to ne. webapp Pyside6 Vzhledem k tomu, že v mém střevě cítím ten hnědý pocit, hledal jsem jinou možnost. K tomu, najít dobré příklady toho, co lidé postavili s knihovnami gui bylo obtížné, ne-li nemožné.Mohla jsem určitě jen tlačit dopředu, ale nechtěla jsem použít něco pak dát do práce a přijít k uvědomění, že moje vize není možná s určitým gui. LOT A tak jsem šel s . There is a lot of benefit to it, but now I'll have to be really on top of security. However, I won't have to worry about that complexity until I believe I'm ready to show my project, and just maybe by then I could find some cool dudes to code with. webapp V podstatě, Gigi mluví s který mluví s , , , , a kontrolovat události, jako je schopnost vykonávat určité práce. bude muset být zamčen a promyšlený v tom, jak umístit pracovní místa do . obchodník Logopeda Obchodník s artefakty Historický obchodník kontrolní Kafka obchodník LogHandler ArtifactHandler Historický obchodník kontrolní Budeme muset být schopni sloužit všem druhům bohatých médií. Je mnohem opatrnější používat webovou aplikaci. Final words: Poslední úvahy Poslední úvahy Ne všechno jsem pokrýval. Jedna věc, kterou chci dodat, je můj výběr a . pro tento projekt právě teď je skutečně overkill. To nebyl můj počáteční výběr. Nicméně, jsem narazil do zmatku během vývoje, když můj počáteční výběr se stal neudržitelný. To je místo, kde jsem přistál. Tento příspěvek je nyní uzavřen na 4.5k slov Kafka Kafka Kafka An added bonus is that it looks good on a resume. Vždycky se snažím být vývojářem. Pokud . I won't Ale vypadalo by to hezky. Je před námi spousta práce, abych mohl vdechnout život mé lásce k technologickým trendům. Do I Udělat něco z toho? Potřeba No. I just think it's incredible fun. Všechny možnosti architektury a toku jsou předmětem změn. Na tomto blogu nebudu poskytovat kód (zachráním vaše oči). There are tradeoffs everywhere. Kdy jsem se rozhodl pro Kafku? Implementuji orchestrátor zdrojů, abych nezpálil zařízení? Jak velkou roli hraje definování „cenných“ dat? Co mám dělat v systému, abych vymazal zbytečná data? Budu potřebovat pozdní noční zasedání pálení dartů? Co dělat, když je kompromis? Jak kompenzovat otravu dat? na veganství. Vexing. Ať už je to děsivé, mám Čas a žádný šéf, aby mi řídil o selhání. Tajná zbraň To bude trvat roky. A to je v pořádku. Tento projekt může být pro čtenáře zvenčí šílený a ambiciózní. Jsem si toho dostatečně vědom, abych to přiznal. I když chci říci, že jsem neuvěřitelně zájem o všechny oblasti znalostí v rámci samotného systému. Není to 100 metrů sprint. . Dlouhý maraton Kousek po kousku Kousek po kousku Chci odejít z lekce, kterou jsem se naučil od Spruce je muž, který změnil adresu ústředí UPS na svůj vlastní, byt v Chicagu. To bylo povoleno po měsíce, kdy pan Spruce byl schopen uložit ~ 65 000 dolarů v hotovosti na svůj účet, který byl určen pro UPS. Pan Spruce Jak se to hodí? Poučení, které jsem se z tohoto příběhu naučil, je Pan Spruce se netrápil otázkami o tom, zda by skutečně mohl změnit adresu největší logistické společnosti na světě na svůj vlastní byt. . Odvaha A fungovalo to Odvaha A fungovalo to Zatímco mám pocit, že mohu rozhodně zbavit pan Spruceho nedostatku kontroly impulsů a absence předvídání, mohu internalizovat odvážnost, abych to zkusil.Mít úplné a naprosté zanedbání toho, co konsensus může považovat za „dosažitelné“, jsem schopen se vydat na cestu učení, která není upevněna tradicí, která je vtažena do rozumu, který jednoznačně říká „nemůžete“. Maybe I can't. I'd rather fail large than to not try. For that, I must embody Mr. Spruce's approach of totally not giving a fuck. If you stumbled across this blog, I hope you may have learned something. hodně lásky, Bill „Wizard“ Anderson