Nasze newsy
Śledź nasze aktualności.
Tworzenie webaplikacji to nie tylko klepanie setek linii kodu czy też przeczesywanie internetu w poszukiwaniu gotowych rozwiązań problemów programistycznych. Czasami samemu trzeba opracować rozwiązanie powierzonego zadania.
Klient posiadający platformę do zarządzania ofertami poskarżył się, że kontrahenci, którzy dodają swoje oferty przekazują też zdjęcia, które nie powinny się znaleźć w platformie. Do platformy dodawane jest setki zdjęć dziennie więc ręczne przeglądanie i usuwanie ich nie wchodzi w grę. Trzeba było więc zrobić narzędzie do wyłapywania tych samych zdjęć i blokowania ich przed dodawaniem. Pojawiły się więc dwa rozwiązania.
Obydwa rozwiązania zakładały przechowywanie zdjęć w "czarnej liście" zdjęć. Stworzony został więc moduł do dodawania i przechowywania zdjęć które mają zostać blokowane podczas importu ofert.
Rozwiązanie 1
Wyszukiwanie zdjęć, które mają te same rozmiary ale tylko dla danego kontrahenta. Podczas importu skrypt sprawdza czy zaimportowane zdjęcie ma taki sam rozmiar jak zdjęcia w czarnej liście. Oczywiście tylko zdjęcia danego kontrahenta. Zdjęcia o podobnych rozmiarach można też usunąć z poziomu blacklisty zdjęć. Przykładowy kod z użyciem frameworka Laravel znajduje się poniżej:
$data = post('checked');
foreach($data as $zdjecieczarnalistaid){
$zdjecieczarnalista = ZdjeciaczarnalistaModel::find($zdjecieczarnalistaid);
$dostawcy_id = $zdjecieczarnalista->dostawcy_id;
$ret = Zdjecia::where('file_size', $zdjecieczarnalista->zdjecie->file_size)
->whereHas('oferty', function($q) use ($dostawcy_id){ $q->where('dostawcy_id', $dostawcy_id); })
->delete();
}
Rozwiązanie 2
Z pomocą programu imagemagic porównywać zdjęcia za pomocą narzędzia porównującego. Narzędzie zwraca informacje u różnicach pomiędzy zdjęciem badanym a wzorcowym na poszczególnych kanałach RGB lub całości. Trzeba tylko przeprowadzić testy i ustalić próg podobieństwa.
Rozwiązanie pierwsze jest szybkie ale nie doskonałe. Kontrahent może doda inne zdjęcie które będzie miało taki sam rozmiar i zostanie ono zablokowane. Jeżeli jednak przyjmiemy że rozmiar zdjęć może się wahać od 10000b do 100000b (10kb do 100kb) to prawdopodobieństwo zablokowania takiego zdjęcia wynosi 1/90000. Wydaje się, że prawdopodobieństwo jest akceptowalne. Drugi problem to taki, że jeżeli kontahent wrzuci trochę mniejsze (większe) zdjęcie lub inaczej skompresowane to system go nie wychwyci i trzeba będzie dodać nowe zdjęcie do czarnej listy.
Rozwiązanie drugie jest dużo pewniejsze ale problemem może okazać się wydajność systemu przetwarzającego zdjęcia po jego dodaniu. System już teraz konwertuje zdjęcia z jpeg do webp i wstępnie dodatkowo je przetwarza. Zajmuje to dużo czasu. Dodanie kolejnej procedury przetwarzającej każde zdjęcie może przysporzyć sporych problemów z wydajnością. Tym bardziej że każde nowo dodane zdjęcie musi zostać porównane ze wszystkimi zdjęciami kontrahenta znajdującymi się na czarnej liście. Bywa że dla jednego dostawcy zostają dodane 3 zdjęcia do czarnej listy.
Wybór padł na rozwiązanie nie koniecznie idealne ale za to bardzo wydajne. Lista rozmiarów zdjęć z czarnej listy jest przechowywana w pamięci a obiekt każdego zdjęcia i tak przechowuje informacje o rozmiarze zdjęcia.
Śledź nasze aktualności.
Jak poprawnie iterować dużą ilość danych w Laravel Eloquent
Nowa wtyczka do Octobercms zwiększająca bezpieczeństwo stron www.