MySQL Jokeri

Pitanje za milion dolara u nekom popularnom kvizu. Imate samo 15 sekundi za odgovor. Srecni ste jer ste izvukli pitanje iz vase omiljene oblasti 🙂

Kako obrisati sve korisnike ciji nick pocinje sa donjom crtom (‘_’).

I vas odgovor je naravno:

delete from users where username like '_%';

Vec mastate o raskalasnom zivotu daleko od kompjutera, mozda i neka jahtica pride (i sve sto ide u to lol). Glas voditelja vraca vas u surovu realnost. “Zao mi je, ovo nije tacan odgovor”. U neverici gledate vas query i milione koji su otisli u nepovrat.

Verovali ili ne, slicnu nevericu iskusio sam na svojoj kozi pre nekoliko veceri, tacnije 8. aprila. U tabeli sa nekoliko miliona generisanih domena uocen je bug (mala greska u regularnom izrazu) i nekako su generisani i domeni koji pocinju sa znakom “_”. Underscore (donja crta) naravno nije dozvoljen kod domena, bug je ispravljen ali treba obrisati i te nevalidne domene iz baze. Nista lakse, jedan brzi query i sve ce ubrzo biti pocisceno. Otvaram mysql klijent i bez mnogo razmisljanja kucam:

mysql> delete from result_domains where domain like '_%';
Query OK, 9035782 rows affected (9 min 57.35 sec)

WTF!?? Query je obrisao sve domene iz tabele. Ali kaaakooo???

I onda se setim. Donja crta – ‘_’ je poput ‘%’, takodje joker karakter koji za razliku od ‘%’ (koji menja ‘nula ili vise’ karaktera), ‘_’ menja tacno jedan karakter. Ne secam se kada sam ga poslednji put koristio (ako sam ga uopste koristio), ali znam da mi je on dosao glave.

Cimam admina na ICQ … treba mi backup, server taj i taj, tabela ta i ta, poslednji koji imamo … ASAP! Posle 30-tak sekundi admin se javlja “ok, poslednji koji imamo je od 8 marta. Gde da ti stavim?”. FUCK!!!

FUCK!!! FUCK!!! FUCK!!! FUUUUCK!!!

Ustajem od kompjutera i besno setam kroz sobu. Na postoji nacin da objasnim klijentu da sam jednim jedinim kverijem sjebao sate i sate mukotrpnog rada, podatke vredne verovatno hiljade dolara. Da imam utoku verovatno bih pao u iskusenje da pucam sebi u glavu. Mozda pre toga da sredim i admina? Kako god, sta je tu je, ne preostaje nista drugo nego da napisem email i objasnim svom klijentu sta se desilo.

Sedam ponovo za comp, ali umesto da otvorim thunderbird, cimam ponovo admina.

– Ja: “Jebote … kako se desilo da je poslednji backup star mesec dana???”
– Admin: “Kako to mislis? Ovo je backup od sinoc!?”
– Ja: “Rekao si 8 mart???”
– Admin: “Ups. Sorry, 8. April. Sad gledam, kreiran je pre samo par sati. Moze?”

I tako, my ass has been saved. Ali moglo je i biti drugacije. Mnogo drugacije.

Pouka price:

1) Budite ekstremno oprezni kada kucate nesto unutar mysql klijenta (ili phpmyadmina) koji barata sa live podacima
2) Ako morate da brisete/update-ujete nesto, uvek uradite prvo count nad istim podacima i istom where klauzom kako bi ste se uverili da je to bas ono sto ste zeleli.

Npr:

mysql> select count(*) from result_domains where domain like '_%';
+----------+
| count(*) |
+----------+
|  9035782 |
+----------+
1 row in set (5.27 sec)

(ups nesto ne valja, ovo ce obrisati sve domene koje imamo)

mysql> select count(*) from result_domains where domain like '\_%';
+----------+
| count(*) |
+----------+
|        0 |
+----------+
1 row in set (4.18 sec)

Aha, sada je sve ok 🙂

3) Uvek pravite redovan backup. Ako to za vas rade admini postarajte se da rade svoj posao kako treba. Cak i tada nije losa ideja da s vremena na vreme napravite sopstveni backup.

P.S. Problem sa pocetka price (matchovanje stringa koji pocinje sa ‘_’) resava se jednostavnim escapovanjem specijalnog karaktera. Dakle:

select foo from footable where somefield like '\_%';

ili ako ste ljubitelj regularnih izraza:

select foo from footable where somefield regexp '^_';

Jubilej i još ponešto

Kako su krenule stvari u mom životu, još malo pa ću na ovom Blogu imati samo vremena da obeležavam jubileje. Pre par nedelja pisao sam o svojoj IT (pra)istoriji, a danas sasvim slučajno zahvaljujući Varaginom istraživanju o počecima Blogova u Srbiji provalih da je i moj Blog sve matoriji. Da dragi moji, juče je prošlo tri godine od mog prvog neveštog posta na očajnom engleskom jeziku. Od očajnog engleskog jedino je bila gora platforma – Movable Type. Ni sam ne znam kako sam izdržao gotovo pune dve godine pre nego što sam sa Movable Type-a prešao na WordPress. No, da ne mlatim mnogo o istoriji, ionako sam to već pisao na prošloj godišnjici, pa bolje da se ne ponavljam 🙂

Poslednjih nekoliko meseci od kada se Jovana razbolela bili su užasno teški. Selidba za Beograd, zatim svakodnevni odlasci u bolnicu, hemotarapija, antibiotici, transfuzije, komplikacije. I ono najteže i najgore od svega. Neizvesnost. Kada sve dnevne obaveze nestanu, kada se monitor i sva svetla ugase. Neizvesnot i strah. Teško opisiv. Budan si a opet imaš noćne more … i tako sve do jutra kada prvi zraci zore probude neku novu nadu … i onda uhvatim san. Sat, ponekad dva.

Za svo to vreme verovali ili ne, nekoliko puta pomislio sam kako je divno živeti u državi kao što je Srbija. Non stop neko sranje, izbori, Kosovo, PatriJote vs. izdajnici, pad vlade, koncesija.. ali i Pobede Noleta, Čavića… Kako god, dovoljno je da uključiš vesti i eto ti reality show. Ne treba ti veliki …ovaj … mali batica 🙂

Jovana je juče imala “randomizaciju” terapije. To je ono … faza lečenja kada se slučajnim odabirom bira jedna od grana nastavka terapije, a uspešnost se beleži statistički “tamo negde”, tako da se jednoga dana može znati koja grana je bila bolja. Ništa lepše nego kada i sami postanete deo statistike. 🙁

Elem, postojale su dve varijante, u najkraćem duža i kraća. Nekako nam je zbog svega više odgovarala kraća, 2-3 meseca lečenja u odnosu na dužu koja u idealnom slučaju (bez komplikacija) traje 6. Barem na papiru, manje citostatika, “bockanja”, smaranja … Naravno, izvukli smo dužu.

Kada mi je doktor između ostalog objašnjavao da će za randomizaciju koristiti kompjuter u šali sam mu “objasnio” da kao programer odlično znam da je kompjuter “djavolja naprava” i da je poslednje što želim da kompjuter pseudo slučajnim brojevima odlučuje kako će se moje dete lečiti. Možda da ipak bacamo novčić 🙂 Kada je doktor posle došao sa rezultatima “randomizacije” samo mi je rekao “… lepo ste rekli … djavolja naprava” 🙂

Epilog … još 6 meseci u Beogradu.

20 godina mog IT-a

Kada sam sinoć u želji da malo trolujem na facebook-u linkovao svoju prošlogodišnju pljuvačinu po 8. Martu setio sam se jedne vrlo lične i nadasve interesantne stvari. Naime, baš na taj dan, 8. Mart 1988. godine stigao je moj prvi kompjuter. Commodore 64. Debeljko. Mala siva kutija… Tako mnogo epiteta da bi se opisala jedna divna stvar za koju me vezuju tako divne uspomene.

Stigao je na danasnji dan pre 20 godina iz Belgije. Donela mi ga je moja tetka kako bi smo uštedeli (na kraju je ispalo duplo skuplje nego da smo ga kupili ovde). Uz C64 dobio sam i Flopy Disk Drive 1541-II koji je tada koštao još skuplje nego sam kompjuter. Poređenja radi, ako bi danas C64 koštao 300Eura, 1541 koštao bi nekih 400. Takav je bio odnos. Inače, u to vreme ova skalamerija sa sve carinom izašla je cirka 1000 DM (Nemačkih Maraka). I dan danas se sećam onih oblih ispravljača za C64 (i nešto manje oblih za 1541) koji bi se nakon par sati igranja toliko usijali da je pretila opasnost da izbije požar (naročito u letnjim mesecima), 5.25″ SS DD disketa koje si jednim rezanjem pretvarao u Double Side 🙂

Naravno, matorci su odmah mislili da će im se ova skupa investicija brzo isplatiti čim njihov sin sedne za tastaturu i nauči to khm…programiranje. No umesto da sednem za tastaturu ja sam se prihvatio Joysticka (QuickShot II). 1942, Commando, Test Drive, The last ninja a nešto kasnije Pirates! i Defender of the crown samo su neke od igrica koje su obeležile taj period mog detinjsta. U to vreme piraterija je naravno cvetala, piratizovane igrice mogao si bez problema da pronadjes u oglasima koji su se objavljivali u Svetu Kompjutera. Cak je SK u to vreme pravio i neko takmičenje tipa “Pirat No1” gde su korisnici glasali za najboljeg pirata. Ah, kakvo doba 🙂

Pošto u to vreme nije bilo Blogovanja, svoju kreativnost u pisanju (buahaha) ispoljavao sam u rubrici “A šta da radim” koju je uređivao koliko se sećam izvesni Nenad Vasović. Moje opise igara SK nikada nije objavio 🙂

Nešto kasnije je došao mašinac (seća li se iko monitora 4951249152), gde sam prateći legendarni intro servis (Milan Vještica RIP) naučio prve korake u asembleru. LDA, STA, STX, … Sećam se kako sam pisao po sveskama adrese raznih registara u C64 (tipa za sprajtove) i nekih mini listinga oduševljavajući se sasvim običnim stvarima.

A onda … onda nam se desio narod, pa zatim ratovi, kriza, sankcije, beda. Umesto da C64 zamenim (logično) Amigom, C64 je ostao moj jedini kompjuter tokom cele srednje škole. Čak sam i svoj maturski pisao na njemu. Program u pascalu koji je svirao “Child in time” od Deep Purple-a potpuno je razvijan na Oxford Pascalu, tadasnjoj implementaciji Pascala na C64. Naravno, isti source je radio savrseno na PC-u 🙂 Desetak godina kasnije neki klinci su me na nekoj žurci (na pomen da sam išao u tehničku) pitali da li znam ludaka iz te generacije koji je napravio program koji svira Child in time. 🙂

Leta 1995 (par meseci nakon vojnog roka) kompjuter sam prodao za tadašnjih 250 maraka. Trebala mi je kinta za letovanje. To letovanje i dan danas pamtim, ali bih voleo da mi je i C64 sada ovde. Ponekad kada me uhvati nostalgija poteram Defender u C64 emulatoru, čisto da me želja mine. Ali ništa dok ne sedneš pred TV, ubaciš džojstik u port II i igraš sve dok ne osetiš onaj miris usijane plastike iz C64 transformatora.

P.S. Ovaj post je pisan preko Telenor GPRS-a, obrirom da mi je po marfiju sbb istekao u subotu taman na vreme da SBB ne prihvati moju online uplatu. Otud nema odgovarajućih slika “debeljka” 🙂