Programistyczne WTF jakie Was spotkały

3

Jak myślicie, jaki będzie wynik takiego kodu:

$value = \array_rand(['apple', 'banana', 'pear']);

Co może być w $value? Pewnie jeden z tych owoców, nie? Otóż nie. Bo array_rand() zwraca losowy klucz 😐 A nie wartość.

1

Mam dodać endpoint w jednym serwisie w Javie. Serwis nowy, bo tylko jakiś rok ma. Nie wiem czym kierowali się autorzy, ale natłuczone dokładnie 47 interfejsów. Każdy z nich ma tylko jedną implementację. I teraz tak:

  • łudziłem się, że może ktoś w IDE wygenerował te interfejsy - NIE, bo w definicjach miejscami po kilka spacji, więc ktoś to klepał z palca i nawet nie raczył sformatować kodu,
  • no dobra, może potrzebowali do testowania - NIE, dodane mockito-inline to raz, a dwa wszędzie w testach używali konkretnych typów, nie bazowych; kolejna sprawa - żadna klasa nie była finalna,
  • no dobra, to pewnie wstrzykiwali po typie bazowym (apka na springu) - NIE, wszędzie typy konkretne, nie bazowe,
  • a już hitem było dodanie lomboka, z którego użyto na każdej implementacji @AllArgsConstructor (nic innego z lomboka nie użyto), mimo że każda klasa miała jedną, dwie, maksymalnie trzy składowe do wstrzyknięcia (czyli chciało im się pisać interfejsy, nie chciało się napisać czy po prostu wygenerować konstruktora...).

Osobiście nie jestem fanem interfejsów, które mają tylko jedną implementację, zwłaszcza gdy można się spodziewać podczas klepania kodu, że większej ilości po prostu nie będzie. Jeszcze, gdyby wstrzykiwano po typie interfejsu, to można to na siłę uratować, ale w opisanym przypadku powyżej jest to po prostu bez żadnego sensu.

5

Bugi teams dalsze mistrzostwo.
Na Windows współpracownika widzę normalnie Imię Nazwisko.
Na innym komputerze (MacOS) tak się wyświetla:
screenshot-20240605104846.png
To jest jeden użytkownik! Na górze tytuł rozmowy z "NU" (nieznany użytkownik), w treści rozmowy awatar "UU" (Unknown User) :).

Nie dość, że od miesiąca nie może zsynchronizować informacji o tym użytkowniku, to jeszcze wyświetla go na dwa sposoby.

2

Znalazłem taki kod w kodzie źródłowym laravela:

<?php
public static function configure(?string $basePath = null)
{
    $basePath = match (true) {
        is_string($basePath) => $basePath,
        default => static::inferBasePath(),
    };

I się zastanawiam, na prawdę ten match() jest lepszy niż ternary zwykły?

 $basePath = is_string($basePath) ? $basePath : static::inferBasePath();
0

screenshot-20240712151342.png

1

Czytam sobie dokumentację pewnej funkcji w PHP (niestety, okropny język), i znalazłem śmieszny kwiatek:

screenshot-20240731165350.png

Dokumentacja tutaj pisze że globalna funkcja to "procedural style", ale już statyczna metoda na klasie to jest "Object-oriented style".

Co jest zabawne, bo oba te podejścia są proceduralne (nie żeby było z tym coś złego ofc).

7

DSC00692.JPG
Zapewne program tworzący spis treści wpisał komunikat o błędzie do wyjścia, a powinien raczej zatrzymać się i powiadomić o sytuacji na konsoli, żeby wydawcy książki na pewno się zorientowali.

1

screenshot-20240902213455.png

wiek, masę i wzrost wybierasz klikając w plusiki i minusiki począwszy od 1. Jak masz 180 cm to 180 kliknięć przed Tobą ;)
Na szczęście da się wpisać z klawiatury.

1
LitwinWileński napisał(a):

screenshot-20240902213455.png

wiek, masę i wzrost wybierasz klikając w plusiki i minusiki począwszy od 1. Jak masz 180 cm to 180 kliknięć przed Tobą ;)

I to jest dobry powód żeby schudnąć, odrąbac sobie nogi i po prostu nie być starym.

0

zrozumiem prostą walidację x>0, ale nie wiem gdzie szukali maksymalnych wartości xDscreenshot-20240902232005.png

1

Wczoraj chciałem zobaczyć, jak się używa Scikit-learn w Pythonie.

tworzę sobie virtual env, instaluję co trzeba, przeklejam kod przykładu, nawet coś działa. Potem przeklejam kod kolejnego przykładu, odpalam i nie działa.
Pokazał się błąd:

ImportError: Error importing numpy: you should not try to import numpy from
        its source directory; please exit the numpy source tree, and relaunch
        your python interpreter from there.

Więc próbuję przenieść pliki nie wiadomo gdzie, ale dalej ten sam błąd.
Szukam w Google i sugerują, że wersje bibliotek mogą się nie zgadzać. Albo że ściężka się nie zgadza. Ale to się zgadzało. Nawet zapgrejdowałem Pythona, żeby nowe paczki wgrać. Albo napisali że trzeba dograć jakąś bibliotekę libopenblas-dev. Ogólnie już zacząłem przypuszczać, że to pod spodem mam niezaktualizowane paczki systemowe, z których to pod spodem korzysta. Ale nie bardzo chciało mi się w to bawić.

Dzisiaj natomiast, ponieważ chciałem zrozumieć, skąd ten błąd wynikł, to zacząłem szukać błędu, który wywołał ten podstawowy błąd.

ImportError: cannot import name 'Integral' from partially initialized module 'numbers' (most likely due to a circular import)

i tu już StackOverflow był sensownieszy i dał mi odpowiedź: https://stackoverflow.com/questions/72717979/python-importerror-cannot-import-name-from-partially-initialized-module

Co się okazało?

Otóż. To nie był problem z bibliotekami, tylko że niepozornie nazwałem plik numbers.py XD
Jaki był tego efekt? Że pod spodem jak gdzieś był importowany moduł numbers to chciał mój plik zaimportować, zamiast jakiś tam moduł pod spodem.

Zmieniłem nazwę pliku z numbers.py na blah.py i co się okazało? Działa.

Czyli czegoś się nauczyłem dzisiaj - w Pythonie trzeba uważać, jak się nazywa pliki.

0

@LukeJL to jak Python zostal powaznym branzowym standardem bardzo czesto mnie zastanaiwa. Problem ktory mnie ugryzl ostatnio (na samym dole link do buga) https://mas.to/@swelljoe/112957549219054708

1

Coś czego ostatnio się dowiedziałem o javascript i straciłem na tym dobre 15 minut. Zagadka - czy te dwa zapisy dadzą te same rezultaty:

[a, b, c].sort((x, y) => compareFn(x.n, y.n)).map(x => x.n)
[a, b, c].map(x => x.n).sort(compareFn)

?
...

Okazuje się że w przypadku gdy mamy wartości undefined to nie:

const a = {n:3};
const b = {};
const c = {n:1};

const compareFn = (x, y) => x === undefined ? -1 : y === undefined ? 1 : x - y;

console.log([a, b, c].sort((x, y) => compareFn(x.n, y.n)).map(x => x.n)); // [undefined, 1, 3]
console.log([a, b, c].map(x => x.n).sort(compareFn));                     // [1, 3, undefined]

Dokumentacja https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort jasno mówi:

If compareFn is supplied, all non-undefined array elements are sorted according to the return value of the compare function (all undefined elements are sorted to the end of the array, with no call to compareFn).

Czyli wartości undefined w ogóle nie trafiają do naszej funkcji sortującej i lądują zawsze na końcu bez kontroli, chcesz je mieć na początku to kombinuj. Tu wychodzi duża różnica między undefined, null a empty bo nulle są normalnie obsługiwane, a empty nie trafia nawet do funkcji map i też zawsze lądują na końcu tablicy

1

@obscurity Jak odejmujesz undefined od number to dostajesz NaN, a to że sortowanie się psuje jak zwracasz NaN to mnie akurat nie dziwi.

0

Ale przekombinowałeś.

Chodzi Ci o to:

[undefined].sort(() => /* not called; */); // [undefined];
4

Oficjalna strona Motorloli https://www.motorola.com/pl/smartphones/ ma "doskonały" system filtrów. Wygląda, jakby każde z urządzeń dodawała inna osoba i pisała rzeczy z palca, a system filtrów przeszukiwał te oferty i robił distinc row na parametrach, czego efektem są takie koszmarki:
screenshot-20240923132206.png
czy
screenshot-20240923132248.png

0

Ludzie to mają fantazje aby zastraszać bank niebezpiecznikiem bo nie lubią danej implementacji logowania :D

Zwróciłem uwagę, że ING jako jeden z ostatnich banków na polskim rynku wymusza na użytkownikach logowanie przez podanie tylko kilku wybranych znaków hasła. O wadach tego rozwiązania toczyło się już wiele dyskusji, natomiast zastanawia mnie jedna rzecz:
W jakiej formie bank przechowuje hasła użytkowników? Hasło w całości można zahashować dzięki czemu bank nigdzie nie przechowuje hasła w formie możliwej do odczytania. Natomiast aby porównać poszczególne znaki hasła trzeba to hasło mieć w formie do odczytania. Ewentualnie przechowywać hashe każdej kombinacji wybranych znaków z hasła (w co nie chce mi się wierzyć). Czy zatem bank, w swojej trosce o bezpieczeństwo hasła, przechowuje je przewrotnie w plaintexcie?

Oczywiście postuluje, jako jeden z wielu użytkowników, o udostępnienie użytkownikom opcji wpisywania hasła w całości, co przynajmniej umożliwi ustawienie sobie hasła o odpowiedniej długości i poziomie skomplikowania. Do tego czasu połowa użytkowników pewnie nadal będzie miała za hasło "12345678", co sprytniejsi "23456789" Emotikon: Mrugający

Prośba o przekazanie opinii w górę drabinki korporacyjnej. Mam nadzieję, że prośby o zdrowy rozsądek zostaną w końcu wysłuchane, inaczej chyba zostanie nam kampania oparta o Niebezpiecznik, Zaufaną Trzecią Stronę, ewentualnie konsultacje z CERT Polska.

Pozdrawiam
DC

https://spolecznosc.ing.pl/-/Bankowo%C5%9B%C4%87-internetowa/Has%C5%82o-maskowane-partial-password/td-p/44250

0

Wygląda to na nieplanowaną "aktualizację systemów operacyjnych". Źródło: https://www.zakup.obligacjeskarbowe.pl/
screenshot-20240930221420.png

1

0

screenshot-20241003222300.png

https://www.esp.pwpw.pl/Account/Index
Maksymalny rozmiar załącznika to 1024KB, na szczęście włączenie najniższej jakości w aparacie dawało załączniki około 800KB.

1

1

screenshot-20241011113414.png
Źródło: https://api.raporty.pse.pl/

PSE chyba jednak stać na to by to poprawić...

0

screenshot-20241022005547.png

Ciekawe czy ten róż to ostateczna wersja, czy pójdą na całość i dodadzą więcej kolorów, aby mieć gejowską tęczę zamiast paska postępu. Wszystko poragią zepsuć. 😕

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.