• Offtopic
  • Web Development rasprave/preporuke/problemi

Pogledam nakon posla danas.

chono Ok, moram se skoncentrirat, pa ću na codepen ili negdje dići ovo što si napravio, tj barem okvirno.

chono Problem je upravo to "obogacivanje" POLJA1, gdje koristenje "where-object", "contains" ili bilo cega drugog traje predugo, jer je AD uz sve filtere prevelik i to vrti jako dugo.

Znači prvi korak je uzeti POLJE1 i proširiti ga podacima koje imaš iz AD-a, po emailu?
POLJE1 je podatak koji imaš iz jednog sustava, i ono je referenca za podatke ili? Pokušavam povezat taj dio i AD dio. Što iz originalnog POLJE1 mičeš, ili ništa ne mičeš, nego samo tražiš te mailove u AD podacima i kad nađeš, proširiš?
Jesi razmišljao raditi obrnuto, da AD podatke obradiš? Ako moraš maknuti višak u tom dijelu, da ga makneš? Pretpostavljam da radiš previše loopova na velikom podatku, u ovom slučaju AD podatku, možda je dobro probati obrnuto.

EDIT:
https://code.labstack.com/XkU_q8IY

Projekt (ne znam uopće tko nudi Powershell online emulaciju, pa sam ovo prvo našao). 2 puta na run da izbaci rez dolje 🙂
Možete početi slagati primjer unutra

    foggy tako je, POLJE1 sadrzi samo email i date, to je export iz jednog sustava. Ja mu onda na te postojece podatke zaljepim SamAccountName i Name iz ADa, kako bi mogao po SamAccountNameu usporediti sa POLJEM2.

      chono Ok, onda brzinsko pitanje, to što sam te pitao: Zašto AD podatak ne obradiš tako da njemu makneš višak na neki način? Koji bi onda uvjet bio?

      Podaci:

      • AD podaci, imaš duplića? Tipa duplih elemenata koji imaju isti email?
      • POLJE1 neobrađeno, ima li tamo duplih email elemenata?

      EDIT:
      https://code.labstack.com/XkU_q8IY
      Ovako nekako ti izgledaju podaci? Nakucao sam samo stringove i ubacio u array objekata. Jesu ti tak podaci pohranjeni?
      Ako želite nešto mijenjati, napravite svoj projekt na ovoj domeni da se ne koljemo međusobno.

      EDIT 2:
      Vidi jel ti ovo pomaže:

      `Write-Host 'Hello Chono, lets take you for a ride!'
      $polje1 = @([pscustomobject]@{email="email1@email.com";date="04/19/2022"},
      [pscustomobject]@{email="email2@email.com";date="04/18/2022"})
      $poljeAD = @([pscustomobject]@{date="04/19/2022";SamAccountName='userName1';RealName="Real Name hehehehehehe";Office='Office 1';email='email1@email.com'},
      [pscustomobject]@{date="04/18/2022";SamAccountName='userName2';RealName="Real Name 2";Office='Office 2';email='email2@email.com'},
      [pscustomobject]@{date="04/17/2022";SamAccountName='userName3';RealName="Real Name 3";Office='Office 3';email='email3@email.com'})

      foreach( $elem1 in $polje1 ) {
      $realNameExp = $poljeAD | Where-Object { $_.email -eq $elem1.email }
      Write-Host "Expanded data for polje1 $($elem1.email): $($realNameExp)"
      }`

        foggy nema duplica u polju1 i u ADu. Email je unikatan. I maknuo sam nepotrebne stvari iz ADa sa filterom da mi izvuce samo realname, samaccountname, mail.

        Ovo zadnje sto si napravio u foreachu sam napravio i ja, ali to traje predugo kada imas puno podataka.

          chono Oke, to me zanimalo. Znači ovo je sporiji pristup jer vrti po 1 Where-Object u svakoj iteraciji, mogu si mislit koliko je to podataka... Powershell nije najpametniji vidim. Oke, idući approach, konverzija podatka... Daj mi malo vremena (ak se ne javim do 17h pojeo me posao).

          Haha, vidi ovog:
          https://stackoverflow.com/questions/33009695/powershell-where-slow-is-there-a-faster-way-to-search-object

          Ima tvoj kind of problem 😃

            foggy nikako nije najpametniji 😂 vidis da moram sam pisati funkciju za sortiranje, jer pws sort metoda ne radi kako treba.

              chono Ajmo preko hashtable keyeva (poljeAD konverzija objekta u key vrijednost helperpolja - powered by stackoverflow):

              Write-Host 'Hello Chono, lets take you for a ride!'
              $polje1 = @([pscustomobject]@{email="email1@email.com";date="04/19/2022";RealName=""},
              [pscustomobject]@{email="email2@email.com";date="04/18/2022";RealName=""})
              $poljeAD = @([pscustomobject]@{date="04/19/2022";SamAccountName='userName1';RealName="Real Name hehehehehehe";Office='Office 1';email='email1@email.com'},
              [pscustomobject]@{date="04/18/2022";SamAccountName='userName2';RealName="Real Name 2";Office='Office 2';email='email2@email.com'},
              [pscustomobject]@{date="04/17/2022";SamAccountName='userName3';RealName="Real Name 3";Office='Office 3';email='email3@email.com'})
              
              $helperPolje = @{}
              $poljeAD | ForEach-Object {
                $helperPolje[$_.email] = $_
                Write-Host $helperPolje[$_.email].email
              }
              
              $polje1 | ForEach-Object {
                $email = $_.email
                if($helperPolje.ContainsKey($email)){
                	Write-Host "Entered the loop"
                  $_.RealName = $helperPolje[$_.email].RealName
                }
              }
              
              Write-Host "Expanded data for polje1 $($polje1[0].email): $($polje1[0].RealName)" `
              [URL=https://i.imgur.com/WMEhBuI.png][IMG]https://i.imgur.com/WMEhBuI.png[/IMG][/URL]
              
              EDIT (malo bolje napisano, bez da imaš prošireno polje1):
              `Write-Host 'Hello Chono, lets take you for a ride!'
              $polje1 = @([pscustomobject]@{email="email1@email.com";date="04/19/2022"},
              [pscustomobject]@{email="email2@email.com";date="04/18/2022"})
              $poljeAD = @([pscustomobject]@{date="04/19/2022";SamAccountName='userName1';RealName="Real Name hehehehehehe";Office='Office 1';email='email1@email.com'},
              [pscustomobject]@{date="04/18/2022";SamAccountName='userName2';RealName="Real Name 2";Office='Office 2';email='email2@email.com'},
              [pscustomobject]@{date="04/17/2022";SamAccountName='userName3';RealName="Real Name 3";Office='Office 3';email='email3@email.com'})
              
              $helperPolje = @{}
              $poljeAD | ForEach-Object {
                $helperPolje[$_.email] = $_
              }
              
              $polje1 | ForEach-Object {
                $email = $_.email
                if($helperPolje.ContainsKey($email)){
                	Write-Host "Entered the loop"
                  $_ | Add-Member -MemberType NoteProperty -Name 'RealName' -Value $helperPolje[$_.email].RealName
                }
              }
              
              Write-Host "Expanded data for polje1 $($polje1[0].email): $($polje1[0].RealName)"

              Probaj na pravim podacima ako nisi pa javiš (pazi samo, ovaj forumski editor mi je maknuo sve underscore znakove, tam gdje je italik išao je underscore prije tog dijela)...

                foggy tek sad vidim 😁 da, uspio sam temporary poljem, ali nisam zadovoljan brzinom izvedbe, jer radi vrlo slicno vremenski kao bez binary searcha.
                Stvarno cu morati nekako napisati quicksort koji sadrzi parametar polje i sve kolumne koje polje sadrzi

                  chono Prokleti Powershell. Možda Fićo ima nešto u prstima, ja evo koristim powershell prvi put u životu sada na ovaj način, većinom su to jednostavne petlje za triggeranje drugih buildova i slične stvari, ništa što ima heavy load...
                  Ja bih ti preporučio otvorit topic na stack overflowu gdje ćeš im dati primjer kao što sam ja pokušao, pa će ti netko objasnit što je najbolje i zašto ovako ili onako. Do tada ćemo se igrati malo s ovim, upicanit ćemo tvoju metodu ako je uspiješ prekucat tu negdje u kod (ako ti se da).

                  Inače, Python je bolestan za obradu podataka, zato sam spomenuo da svoje varijable možeš pohraniti kao jenkins varijablu, pa ih onda možemo doslovno poslati u koji framework želimo u narednom ili istom koraku.

                    foggy Možda Fićo ima nešto u prstima

                    Imam gorčinu i razočaranje.

                    Inače, Python je bolestan za obradu podataka, zato sam spomenuo da svoje varijable možeš pohraniti kao jenkins varijablu, pa ih onda možemo doslovno poslati u koji framework želimo u narednom ili istom koraku.

                    Znači, čitam ovo kaj @chono piše i krenem pisati da bi možda najpraktičnije bilo napraviti Python skripticu za ovo, on je super s velikom količinom podataka. I onda vidim i ti spomeneš Python. 😄

                    Ukratko, prošao sam kroz ovo što je napisano zadnjih dana i meni se jednostavno čini kao problem koji traži jako puno fine tuninga za nešto što je izvedivo van okvira Powershella. Kažem da mi se čini zato što s Powershellom nemam iskustva. Igrao sam se s Jenkins skriptama, ali nikada nisam radio detaljniju obradu podataka, uvijek se to pokušavalo svesti na provjere flagova i konkateniranje ili pozivanje složenijih funkcija.

                    Još ću proučiti, malo razmisliti pa vidjeti hoće li mi pasti neki alternativni pristup.


                    Jedino kaj trenutno mogu je vratiti se na ideju korištenja Pythona za ovo. Lagan je za savladati, takoreći se pišu rečenice i ovakvo što bi mogao pojesti. Na tebi bi bilo da složiš skriptu koja dovlači podatke iz AD-a i onda sve predaje kao argument toj .py skripti. I onda pustiti da Python odradi svoje i negdje ti spremi gotove podatke.

                    U tom bih slučaju išao u smjeru:

                    1. Dohvati mi podatke iz POLJA 1
                    2. Dohvati mi podatke iz AD-a
                    3. Pozovi .py skriptu kojoj se predaju podaci iz koraka 1 i 2, u njoj raditi enrichment

                    Sada dobivaš više slobode za eksperimentiranje i igranje s vremenom izvođenja. Možeš, recimo, napraviti u istoj toj skripti i da se predaje POLJE 2 i zatim radiš čitavu logiku unutra. Možeš i izbaciti dobiveno enrichano polje i onda izvesti običnu usporedbu između dva polja jer si sada riješio problem enrichmenta. Ili pak možeš napraviti zasebnu .py skriptu koja vrši usporedbu oba polja i pozvati ju nakon izvođenja prve .py skripte.

                    Ako odeš u ovom smjeru i iz kojeg god se razloga ne budeš snalazio, javi se pa nastavimo.

                    EDIT: Ili još bolje, sve samo hiti u Python. 😃 Nisam ovoliko shillao Python od... Nikad...

                      Fico da, sve mi se vise cini da cu morati prosiriti okvire 😁 ovo trenutno dela, sporo, ali dela. Tako da selim u Python glavni dio koda i napravit cu to elegantnije i bolje.
                      Da budem iskren, malo sam razocaran u powershell nakon ovog...
                      I ovo sto @foggy pise, stavis AD import podataka u Jenk env varijablu i delas s njom u Pythonu, samo je pozoves.

                        chono I ovo sto @foggy pise, stavis AD import podataka u Jenk env varijablu i delas s njom u Pythonu, samo je pozoves.

                        Šalješ u doslovno bilo šta što pripremiš kao okruženje. Docker i može bit unutra što poželiš, ili jednostavno na mašini gdje radiš build digneš što ti fali (Python, NodeJs...) i obradiš tamo direkt.

                        @foggy @Fico rijesio kompletno u pwsu i to sada radi u par sekundi, cijela skripta.

                        Quicksort funkcija starta na pola polja, tako da ide lijevo i desno i sortira:

                        function quicksort($Array) {
                            $Less = @()
                            $Equal = @()
                            $Greater = @()
                            if( $Array.Count -gt 1 ) { 
                                $Pivot = $Array[$Array.count / 2]
                                foreach( $x in $Array) {
                                    if($x -lt $Pivot) { 
                                        $Less += @($x) 
                                    }
                                    elseif ($x -eq $Pivot) { 
                                        $Equal += @($x)
                                    }
                                    else { 
                                        $Greater += @($x) 
                                    }
                                }    
                                $Array = (@(quicksort $Less) + @($Equal) + @(quicksort $Greater))
                            }
                            $Array
                        }
                        
                        Pomocu zamjenskog polja kreirao zavrsno, popunio prethodno konstruiranu klasu i voila:
                        
                        [System.Collections.ArrayList]$ArraySorted = quicksort $POLJE1.Mail
                        $FinalArray = @()
                        foreach ($Email in $ArraySorted) {
                            if ($POLJE1.Mail -eq $Email) {
                                $index = [array]::indexof($POLJE1.Mail,$Email)
                                $ThisVar = [ADUSER]::new()
                                $ThisVar.SamAccountName = $POLJE1[$index].SamAccountName
                                $ThisVar.Mail = $Email
                                $ThisVar.Name = $POLJE1[$index].Name
                                $ThisVar.extensionAttribute8 = $POLJE1[$index].extensionAttribute8
                                $FinalArray += $ThisVar
                            }
                        }

                        Sada se bacam da sve ovo odradim unutar funkcije quicksort, da sortira polje i zadrzi sve kolumne sa vrijednostima.

                          chono Znači ne mogu vjerovat da nakon 7 major verzija oni nisu u stanju optimizirati svoje god-given metode nad listama, i da si morao pisati svoj kod za jebeni sort. Strašno. Nadam se da bash ima bolje ovo odrađeno, inače mi je draže u bashu pisati ovakve stvari. I čestitam, nadvladao si powershell 😃

                          Inače, super inicijativa, meni osobno super zanimljivo uplivat u problem koji nisam nikad pokušao srediti, i evo, naučio sam da na poslu sigurno u powershellu neću obrađivati podatke 😃

                            foggy Inače, super inicijativa, meni osobno super zanimljivo uplivat u problem koji nisam nikad pokušao srediti, i evo, naučio sam da na poslu sigurno u powershellu neću obrađivati podatke

                            Da, meni se isto dopada ideja. Ima nas više IT-evaca na forumu i mislim da možemo komotno iskoristiti kao ležerniji Stack Overflow. Napravim prikladnu temu danas ili sutra pa ju i tu linkam da se lakše nađe.

                            Ovo mi je draze nego video gdje Tuhy kolje Melaniu! Uspio sam napisati kompletnu quicksort funkciju kojoj das polje, das joj ime kolumne, ona sortira po toj kolumni i vrati ti natrag kompletno sortirano polje sa svim kolumnama:

                            function quicksort($Array, $Property) {
                                $Less = @()
                                $Equal = @()
                                $Greater = @()
                                if( $Array.Count -gt 1 ) { 
                                    $Pivot = $Array[$Array.count / 2].$Property
                                    foreach( $x in $Array) {
                                        if($x.$Property -lt $Pivot) { 
                                            $Less += $x
                                        }
                                        elseif ($x.$Property -eq $Pivot) { 
                                            $Equal += $x
                                        }
                                        else { 
                                            $Greater += $x
                                        }
                                    }   
                                    $Array = (@(quicksort $Less $Property) + @($Equal) + @(quicksort $Greater $Property))
                                }
                                $Array
                            }

                            Treba 2 sekunde za polje od cca 4000 entrya sto je odlicno!

                            Inače, imaš Code funkciju u editoru za formatiranje

                              Fenix "Dodaj kod" misliš? Tako sam ja to ubacio gore za svoj kod pa nije ispalo dobro.

                                foggy napišeš kod, selektiraš ga, klikneš na ikonu i dobiješ ovo što i Chono u zadnjem postu