Problema de munca

Mi s-a cerut sa fac o chestie, va explic mai jos. Pe care n-o s-o fac ca “nu e timp” si ca e aiurea sa ma plateasca si pe mine si pe un coleg pentru cat ar dura s-o fac. ROI mic. Daca nu cumva se poate mai usor si nu stiu eu.

Eu lucrez acum (si) cu un modul  din SAP care se numeste Master Data Governance.  Care e foarte misto dar un pic under-developed pentru deceniul asta. Ceea ce e si mai misto, ca asa castig eu bani multi.

Introducere, pentru aia care s-au pierdut din momentul in care am scris SAP, companiile au nevoie de calitatea datelor din sistemele lor.  Secolul ( sau poate doar deceniul) asta este  despre date si calitatea datelor. Ca sa poti sa faci analize si proiectii competente.

Datele tranzactionale generate automatizat de sisteme sunt ok. Robotii nu-s prosti si handicapati ca noi.

Celelalte generate de “mana omului” sunt ca …penis.

Imaginati-va companii in care oamenii introduc date despre materiale, despre clienti. Despre.   De capul lor.  Asa te trezesti cu 17000 de adrese fara zipcode, in conditiile in care in mai multe aplicatii , unele legale,  codul asta postal e obligatoriu. Si vrei sa muti datele astea dintr-un sistem unde n-ai niciun fel de reguli intr-unul “compliant” ( sunt Raducioiu, nu stiu cuvantul potrivit) cu standardele. Si nu merge.

Asa ca companiile  au evoluat de la Master Data Management la Master Data Governance. Adica baga  un apasaci datele alea “in calculator”, dar nu devin active si folosite in toata compania imediat. Nu, ca poate a introdus cacaturi. Intra intr-un proces de aprobare, isi mai dau si altii cu parerea, mai experti decat el si daca e ok, intra in sistem.  Despre procesul asta de aprobare e vorba in “Governance” si din asta sug bani.

Ajunge cu introducerea.

In MDG ai  modele de date. Va arat acum unu “standard” dezvoltat deja de SAP, pentru Business Partner ( clienti si furnizori ). Din motive de discretie si contract nu va pot arata fix ce lucrez, adica un model custom.

Entity types alea sunt un concept complex, pe care nu am sa-l dezvolt, dar ganditi-va la ele ca la niste structuri de date. Ca sunt linii, ca sunt doar un camp,  nu conteaza – structuri, nu intram in detalii.

Cand introduci date, mii si zeci de mii de intrari si cand sunt mai multi care fac asta, ar trebui sa te asiguri ca nu introduci duplicate. Si ar trebui sa rulezi ceva queries, sau sa cauti prin datele introduse cumva ca sa te asiguri ca nu a introdus deja cineva clientul ala, in cazul de sus. Doar ca nu asa functioneaza angajatii. Pe angajati ii doare in pula. Nici un select nu stiu sa scrie, nici un excel n-ar deschide. Consuma timp.  Motiv pentru care tre’ sa faci un proces automat care verifica el si le arata la prosti pe ecran, ba, eu cred ca esti pe cale ssa introduci un duplicat, ia da o geana  ici ( sub ici , pui un link unde da omu’ tau click si ii aduce potentialul duplicat). Si ala vede mai departe ce face.

Sapu’ s-a gandit si la asta,  si are ceva “built in”, ca sa nu stai sa scrii cod gramada, ca handicapatu'( asa li se spunea in Romania la programatori, pe vremea cand nu plateau impozit pe venit) .

Si clicka-clicka, iti faci o aplicatie de cautare, cu un profil pe care il configurezi cam ca mai jos.

Ai niste campuri , un mod de cautare, vezi aici HA, de la Hanna, care stie cu fuzzy search si alte manele .

Gen  distanta dintre cuvinte (Damerau – Levenshtein) pe care am implementat-o si eu manual acum vreo 5 ani si care era un chin pentru baza de date.  Not anymore.

Mai vedeti acolo ceva pondere in relevanta penru stabilirea candidatului la a fi duplicat si ordinea de cautare.

Boon.  Asta a fost introducerea de fapt.

Vedeti acolo LATITUDE SI LONGITUDE.  S-a cerut sa verific daca o locatie e duplicat.  In afara de nume, astea-s doua coordonate utile in stabilirea acestui fapt. Ar mai fi tara si oras, dar sa nu ne pierdem in detalii.

Si-am zis simplu: Faci exact match pe geolocatie si daca e match, hai cu duplicatul. Acolo nu-i chiar exact match ca e exact match pe fiecare coordonata, ceea ce nu-i corect. Deloc. Da-n fine pot sa concatenez campurile alea intr-unu, iar apoi am exact match pe locatie.

Clientul vine si zice ca nu e asa, ca vrea fuzzy match, fie, merge si aia. dar vrea o toleranta cu raza de 5km .

Suna simplu, si eu as pune conditii d-astea daca as fi client. Dar.

Coordonatele  geografice standard de GPS sunt in radiani ( nu au  subunitatile de grad in minute si secunde – care-i o porcarie, intre noi fie vorba) ci in  fractiune de grad (decimals), dar tot aia e.

Problema cu Pamantul  e doua. Una e ca e rotund ( azi mi-as dori sa fie plat,  unde-s aia cu Societatea Pamantului Plat sa fac un lobby cu ei ca sa fie plat) , a doua e ca  nici chiar asa de rotund nu e.

Pe a doua o trecem la toleranta si ramanem cu prima.

Si daca e rotund ai sistemul asta de impartire de sfera.

Linii paralele pe latitudine si nu asa de paralele pe longitudine.

Ceea ce inseamna  ca latitudinea se poate transforma in mod direct in km – vreo 110 mii si ceva pe grad,  dar longitudinea nu.  Ca daca esti la polul  geografic ai toate gradele intr-un milimetru (punct).

Desigur ca exista transformare matematica pentru a calcula  longitudinea in km de la un punct de referinta, si nu-i chiar complicata. Long. Km =  Cosinus ( Lat. Rad. ) x  Lungimea unui grad de longitudine la ecuator  – adica unde latitudinea e 0.

La prima vedere nu-i greu. La a doua vedere trebuie sa mai fac 2 campuri  cu  Latitudine si Longitudine in KM. Sa le calculez la introducere pentru fiecare locatie.  Si sa le normez  tot la 5km. Adica  deplasarea pe linia ecuatorului ,  din punctul de longitudine 0, va avea valoarea , nu 5, ci 1.

Si sa le compar pe alea – DAAAR, tot nu e ok, ca o raza de 5km in jurul unui punct nu are  multe de aface cu fuzzines si cu  Damerau – Levenshtein. E alta matematica.

Eu obtin o granularite exprimata in spatii patrate, ca patratul negru de mai jos. Ei vor o continuitate determinata de raza unui cerc.

 

Eh, nu pot sa construiesc o transformare matematica prin care sa mapez o proiectie plana in cercuri. Ca fie se suprapun fie am zone de “umbra”. Daca nu intelegeti ce spun ar cam fi fost momentul sa inchideti pagina acum 20 de randuri.

Pot sa rezolv problema cu o matrice de distante, intre fiecare si fiecare locatie. Sau la momentul la care se calculeaza duplicatele sa scriu eu  propria functie care  verifica coordonatele introduse  versus toate celelalte , sau versus toate intr-un range, ca nu suntem idioti. Dar asta nu mai e clicka-clicka, stiu s-o fac, dar pe urma tre’ sa integrez cu standardul de clicka-clicka si aci nu mai e usor si prin urmare nu merita sa platesti niste  mii de euro ( vorbesc de client) pentru diferenta de precizie.

Nu, nu va cer sfatu’, doar ma laud si va intreb daca jobul vostru’ e la fel de mishteaux.

Asta ca sa aveti ce face pana la down time, ca eu sigur am.

 

 

 

 

16 Replies to “Problema de munca”

  1. Vezi ca cei de la ESRI au un modul pentru SAP care face chiar chestii din astea. Integreaza functionalitati de GIS in SAP.

    In alta ordine de idei, exista sdk-uri pe net (JS, .NET) care implementeza exact asemenea functii de geolocatie si de comparare coordante geo. Unele sunt open source.

    Tu primesti la input coord GPS in format WGS84 (proiectie Mercator sau WebMercator cel mai probabil). Daca nu ma inseala memoria (sunt cativa ani de cand nu am mai facut din astea), ar trebui sa transformi in sexazecimal (grade minute secunde). Ai putea sa te uiti la secunde si sa faci o aproximatie “inginereasca” (la latitudini nordice, europa gen, o secunda pe grad inseamna un anumit nr de km, nu mai tin minte cate)

    Link de ex : https://stevemorse.org/nearest/distance.php

    1. Nu-mi trebuie nimic in grade minute si secunde. Coordonatele GPS trebuiesc transformate in kilometri. Adica deplasarea in radiani de la 0,0 trebuie mapata in kilometri. Exista pentru .js, pentru .net, nu ma intereseaza n-am ce face cu ele. Am si zis ca nu e problema sa transform astea. E un rahat de cosinus. Acolo. Si distanta stiu cum se calculeaza.
      Problema-i cand vrei sa integrezi asta in serviciul de duplicate check oferit deja in pachet. Si cand tre’ sa faci calculul de distante dintre coordonatele introduse de utilizator versus cele * mii, sau zeci de mii de locatii deja introduse si sa intorci inapoi in timp real informatia daca-i suspect de a fi duplicat.

  2. O alta solutie este sa folosesti Google Maps API, in mod free (pana la 5000 interogari pe zi, parca) si faci apel de web service catre Google cu valorile X si Y si iti intoarce distanta de diferenta

    1. Solutia asta e gresita din mai multe motive. Te rog, nu mai sugera nimanui sa foloseasca genul asta de API pentru integrarea in produse pentru care oamenii platesc licente de sute de mii de euro si dezvoltarea inca pe atat. Macar pentru faptul ca poate oamenii astia nu sunt de acord sa le faca google tracing si profiling.
      Ca altfel am fi lucrat toti cu cod de pe github sau de pe stackoverflow.

      P.S. Cum am spus. Nu caut o solutie. Stiu sa fac singur asta. Si ar fi chiar amuzant. Doar ca nu e realist utila si n-o sa ma plateasca nimeni cateva zile s-o implementez si s-o testez ca chiar nu merita si nu au nevoie de asa precizie.

    1. Nu cred ca e cazul, deja s-au sesizat aia care platesc banii ca oamenii lor cer cam multe fite fara trebuinta reala iar acum se uita sa mai taie din ele. Dar ideea e tot aia.
      Stiu cum se face bucata aia pentru care gasesti API fara sa apelez la integrarea cu produse externe care nu au cum sa fie mai rapide decat un calcul efectuat local. Doar ca integrarea de la “rezultat”, fie ca-i oferit de mine in framework-ul standard e partea complexa si cauzatoare de efort.

      P.S. Eu inteleg ideea cu de ce sa te mai obosesti sa inventezi roata si sa iti faci roata ta, daca-i facut deja de altii, dar uite ca unii nu vor ca functionalitatea produselor lor sa depinda de a produselor altora . Si daca le spun ca vreau sa integrez un API gratuit asupra caruia nu au niciun control, intr-o aplicatie pe care ei platesc saci de bani si care se refera la CONTROLUL CALITATII DATELOR, cred ca ma pun intr-un colt si ma umplu de flegme. Asta dupa ce imi reziliaza contractul.
      Iar daca le spun ca vreau sa integrez un API pe bani asupra caruia nu prea au control , ci doar un SLA, cred ca nu ma umplu de flegme, dar un sut in cur tot imi ard.

      Ignorand aceste aspecte, ce interes as avea eu sa vreau sa fiu platit doar pentru integrare, cand pot s-o si contruiesc si mai fac si eu niste sutici, nu?

    2. Doar de amuzamentul discutiei. Stii tu un astfel de API care poate sa raspunda la 5-10 000 de astfel de interogari in mai putin de 0.1 secunde? Toate, nu fiecare. Ca daca-i peste depasesc deja timpul de raspuns al functionalitatii standard pe celelalte campuri.

  3. Nefiind de specialitate, am întrebat în altă parte și mi s-a zis:

    “Gata, am citit, dar tot n-am inteles care e marea dilema. Cel mai simplu ar fi sa foloseasca cele doua coordonate ortogonale pe sfera (unghiurile Euler), sa calculeze separat cele doua distante corespunzatoare diferentei in latitudine si longitudine, iar apoi s-o aleaga pe cea mai mare dintre ele. In felul asta, cercul devine patrat. Probabil ca stie si el asta, dar a rescrie o harta folosind o metrica diferita de cea local euclidiana cere efort si bani mai multi.”

    1. Am zis mai sus . Nu calculul distanței e marea problemă. Poate pentru cineva din afara SAP asta pare provocarea, dar nu.
      Faptul că am o funcție blackbox care calculează duplicate pe bază de diferența liniară a valorilor din câmpuri . Și că indiferent dacă ești pe o sferă / cub , când faci proiecția în plan – variația coordonatelor de poziție te înscrie într-un patrat , iar distanta e un cerc descris de o rază dintr-un punct descris de coordonatele de poziție și că ( vezi mai jos ) …

  4. Daca specs cere sa prelucrezi 10000 inregistrari in max 0.1 secunde, atunci nu e treaba de apelat api-uri externe, clar.
    Folosesc in mod curent atat google cloud cat si esri si aws (conturi platite, enterprise) si nu se incadreaza in cerintele astea.

    P.s. Conturile enterprise nu au profiling-ul de care vorbeai. Da, pe tarlaua mea cloud-ul e in standard.

    1. (->urmare la și că ) … Am fost optimist. La 10k queries + calcul de distante și de transformare de coordonate durează 0.25 secunde de secunde. În producție probabil merge mai repede că e sistemul mai bun.
      Dacă fac un singur query și iau toate locațiile și calculez distanțele dintre ele mă aștept să fie sub 0.1 secunde, dar agregat cu căutarea de duplicate executată de SAP pentru celelalte câmpuri va fi pe la minim 0.2 secunde
      Estimez 0.25.
      Așa că. Ar trebui să fac ceva profiling pe coordonate. Gen să îmi aleg ceva Range în funcție de coordonatele de referință. Distanțele pe longitudine sunt fundamental altele când vorbim de diferențe pe latitudine de la 0 la 30 la 45 la 60 la pol.
      Am muncit deja “în particular la asta câteva ore, din pasiune” . Dacă trebuie să le cer ălora să plătească efortul și să aloce timpul pentru implementare completa o să iasă câteva zile și niște mii de euro. Își vor da seama că îi doare in pulă dacă vorbim de diferențe intre coordonate de poziție în grade latitudine sau km, sau distanțe.

  5. foarte interesant. imi dau seama ca daca cere clientul, cere, dar altfel, nu e cel mai safe sa se caute pe baza codului unic de furnizor, gen cui, siret, etc? ca si daca are fix aceeasi adresa, si se schimba ca persoana juridica, teoretic ar trebui un nou cont, nu? cred ca practic nu prea face nimeni asta, dar totusi…

    eu sunt curioasa sincer ce se intampla de la “Si ala vede mai departe ce face.”, daca il lasa sa treaca mai departe si cu duplicatul gasit. :))

    1. Ei sunt furnizorul. Trimit echipamente la clienți. Clienții le vând la unii la alții , că nu sunt chiar șireturi. Uneori afla de locațiile alea și de potențiali clienți pe care trebuie să îi bântuie să le propună o achiziție.
      Ce spui tu cu cont nou e valabil pentru obiectul de date “client ”
      Acolo e vorba de o locație unde se desfășoară “operațiuni”. Nu-i sediu social , sau ceva și pot fi mai mulți clienți într-un singur loc.
      Acum se discută dacă să se impună un prag de asemănare peste care userului să îi fie refuzată introducerea , sau să implementez un proces mai special de aprobare in acel caz ( sper că nu, că la aia e mult de muncă și avem deja destul ) sau să treabă lui , că a fost avertizat.

    2. Oare nu e complicat cu facturarea dupa? Probabil adresa de facturare ramane aceeasi.

      As paria pe a doua varianta (sorry) :)) Nu de alta, dar daca voiau sa ii lase sa isi faca de cap nu te mai aduceau, iar sa le respinga ceva nu le convine ca si concept cred

  6. Nu prea are treaba cu facturarea. obiectul asta e introdus sa le foloseasca agentilor de vanzari ca sa stie unde opereaza aia, ce se opereaza acolo, ca sa poata sa ii spameze pe aia cu “nu vreti sa va dam un echipament?”
    La cat costa o magaoaie ca aia si ce face nu cred ca ii printeaza o eticheta cu adresa de livrare dintr-un SO si-o pun pe firma de logistica.
    Gen mining rigs, dar nu d-alea de bitcoini, lol.

    Nici macar nu au SAP pentru altceva decat master data. Au alte sisteme pentru procesele lor de ERP/CRM.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.