Programistyczne WTF jakie Was spotkały

Programistyczne WTF jakie Was spotkały
Spearhead
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1007
6
Riddle napisał(a):

Więc taka ifologia, może i wydaje się niehaxiorska i amatorska, to dla mnie jest prosta, czytelna, łatwa do zmiany - właśnie dlatego że jest taka prymitywna. Nie muszę sobie łechtać ego próbując niepotrzebnie skomplikować ten kod.

A może by po prostu przenieść poziom wcięcia do atrybutu:

Kopiuj
<div class="indent" indent-level=4>...</div>

I łapać w CSS-ach tak:

Kopiuj
.indent[indent-level=4] {
    margin-left: 16px * 4;
}

Albo nawet użyć zmiennych CSS:

Kopiuj
<div class="indent" style="--indent-level: 4">...</div>

I obsłużyć wszystkie poziomy w jednym miejscu:

Kopiuj
.indent {
    margin-left: calc(16px * var(--indent-level));
}
Spine
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6965
8

Programista zamknął issue mojego autorstwa na Githubie, żeby zrobić własną kopię tego issue.

DE
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 599
6
Spine napisał(a):

Programista zamknął issue mojego autorstwa na Githubie, żeby zrobić własną kopię tego issue.

A pod spodem możliwość wsparcia @Adam Boduch

Screenshot_20250109_183242_Chrome.jpg

Manna5
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Kraków
  • Postów: 667
10

Sklep internetowy Bonito.pl i jego wyszukiwarka. Ogólnie działa, ale jak wpisałem do niej nazwę podręcznika, to wyskoczyła lista znalezionych produktów, a wśród nich dwa, których szukałem - podręcznik oraz zeszyt ćwiczeń do niego. Gdybym kliknął jeden z nich normalnie strona tego produktu zastąpiłaby stronę z wyszukiwaniem i musiałbym je powtórzyć, by przejść do tego drugiego. Wobec tego kliknąłem odnośniki do książek środkowym przyciskiem myszy (co w Firefoxie oznacza otwarcie odnośnika w nowej karcie) i oto efekt:
screenshot-20250323191835.png
Tak właśnie jest przy odtwarzaniu zachowania pewnych elementów HTML za pomocą JavaScriptu, w tym przypadku odnośnika. Autor skryptu uznał, że działanie odnośnika sprowadza się do przeniesienia na jakąś stronę po kliknięciu lewym przyciskiem myszy i to zaimplementował. Gdyby był to po prostu "prawdziwy" odnośnik do odpowiedniej strony, to zadziałałyby jednak dodatkowe funkcjonalności przeglądarki związane z odnośnikami, jak otwieranie w nowej karcie. W ten sposób - nie. Nowa karta się otworzyła, bo formalnie był to nawet odnośnik, ale javascriptowy, niedziałający w świeżej karcie przeglądarki.

MarekR22
  • Rejestracja: dni
  • Ostatnio: dni
1

Root CA osiągnął swój wiek ostateczny "not valid after", więc doinstalowałem odnowioną wersję.

Testuje aplikacja (międzyinnymi git) nadal raportuje, że Root CA jest za stary.
No to sprawdza co i jak:

Kopiuj
 openssl s_client -connect someServer.com:443 -showcerts

Wyświetla opis certificate chain i wszystkie elementy chain'a z serwera są ważne.
Patrzę w cert store i widzę, że Root CA jest dodany do zaufanych, więc o co chodzi?

Po paru godzinach okazało się, że ktoś wystawił nowy certyfikat na ten sam klucz.
W systemie nadal był zainstalowany stary już nieważny Root CA.
Walidacja certyfikatów odszukuje zaufane certyfikaty po fingerprint klucza, a skoro są dwa certyfikaty na ten sam klucz to, walidator wybierał starego Root CA a nowy nie był brany pod uwagę.
Wystarczyło skasować z systemu stary nieważny już certyfikat i wszystko działa.

W sumie, niezły fail że ktoś ponownie użył tego samego klucza i wystawił na niego nowy certyfikat. Jeśli ktoś próbował złamać klucz to nadal ma szansę, więc cały sens odnawiania certyfikatu traci sens.

MarekR22
  • Rejestracja: dni
  • Ostatnio: dni
0

Go czasami jest dziwne:
https://go.dev/play/p/NvQ8UXLAEvL

Kopiuj
package main

import "fmt"

func foo(capacity int) int {
	x := make([]int, 0, capacity)
	x = append(x, 1, 2, 3, 4)
	y := x[1:3]
	fmt.Println("Before modification. Capacity: ", capacity)
	fmt.Println("x:", x)
	fmt.Println("y:", y)
	x = append(x, 11, 12)
	y[1] = -1
	fmt.Println("After modification. Capacity: ", capacity)
	fmt.Println("x:", x)
	fmt.Println("y:", y)
	return x[2]
}

func main() {
	a := foo(5)
	b := foo(6)
	fmt.Println("a:", a, "  b:", b)
}

Wynik działania:

Kopiuj
Before modification. Capacity:  5
x: [1 2 3 4]
y: [2 3]
After modification. Capacity:  5
x: [1 2 3 4 11 12]
y: [2 -1]
Before modification. Capacity:  6
x: [1 2 3 4]
y: [2 3]
After modification. Capacity:  6
x: [1 2 -1 4 11 12]
y: [2 -1]
a: 3   b: -1
obscurity
  • Rejestracja: dni
  • Ostatnio: dni
1

C# zachowuje się tak samo, z tym że w C# nie da się zrobić tego przypadkiem. Żeby użyć "widoku" na wycinek listy trzeba użyć CollectionsMarshal.AsSpan a ten ma uwagę że Items should not be added or removed from the List<T> while the Span<T> is in use..

Kopiuj
using System.Runtime.InteropServices;

int foo(int capacity)
{
    List<int> x = new(capacity);
    x.AddRange([1, 2, 3, 4]);
    var y = CollectionsMarshal.AsSpan(x)[1..3];
    Console.WriteLine($"Before modification. Capacity:  {capacity}");
    Console.WriteLine($"x: [{string.Join(" ", x)}]");
    Console.WriteLine($"y: [{string.Join(" ", y.ToArray())}]");
    x.AddRange([11, 12]);
    y[1] = -1;
    Console.WriteLine($"After modification. Capacity:  {capacity}");
    Console.WriteLine($"x: [{string.Join(" ", x)}]");
    Console.WriteLine($"y: [{string.Join(" ", y.ToArray())}]");
    return x[2];
}

var a = foo(5);
var b = foo(6);
Console.WriteLine($"a: {a}  b: {b}");

wynik taki sam:

Kopiuj
Before modification. Capacity:  5
x: [1 2 3 4]
y: [2 3]
After modification. Capacity:  5
x: [1 2 3 4 11 12]
y: [2 -1]
Before modification. Capacity:  6
x: [1 2 3 4]
y: [2 3]
After modification. Capacity:  6
x: [1 2 -1 4 11 12]
y: [2 -1]
a: 3  b: -1

Powód taki jak napisano w komentarzach powyżej - przy przekroczeniu pojemności listy, tworzona jest pod spodem nowa, większa tablica a mamy referencję na starą tablicę.

W zasadzie go też tu pokazuje że mutujesz x

Kopiuj
x = append(x, 11, 12)

więc nie powinno nic dziwić; wszystko jest logiczne bo zamiana tego na

Kopiuj
z := append(x, 11, 12)
y[1] = -1
fmt.Println("After modification. Capacity: ", capacity)
fmt.Println("x:", x)
fmt.Println("y:", y)
fmt.Println("z:", z)

pokazuje

Kopiuj
Before modification. Capacity:  5
x: [1 2 3 4]
y: [2 3]
After modification. Capacity:  5
x: [1 2 -1 4]
y: [2 -1]
z: [1 2 3 4 11 12]
Before modification. Capacity:  6
x: [1 2 3 4]
y: [2 3]
After modification. Capacity:  6
x: [1 2 -1 4]
y: [2 -1]
z: [1 2 -1 4 11 12]
a: -1   b: -1

Choć tu z kolei zaskakujące jest że przy capacity 6 zmienione zostało zarówno x jak i z co świadczy że x jest tą samą tablicą co z a jednak przy wyświetlaniu elementów x pokazuje tylko 4 elementy a z 6. Ciekawy język

Marooned
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Poznań
1

Dropbox rozwalił system logowania wprowadzając niemożliwe do przejścia captcha.
Są dwie opcje: albo ustawianie ludzika na miejscu 5x [przechodziłem 3x, więc 15 ludzików] - za każdym razem na końcu wyskakuje komunikat "udowodniłeś, że jesteś człowiekiem" i po chwili "Odpowiedź funkcji CAPTCHA nie została zweryfikowana pomyślnie. Spróbuj ponownie."

Jest alternatywne "Wyzwanie dźwiękowe"
"Naciśnij Odtwórz, wpisz numer utworu ze śpiewem ptaków, a następnie naciśnij Enter lub przycisk Gotowe poniżej"
Ponownie 5x zadanie, w każdym lecą 3 kawałki i w pierwszym żaden z nich nie miał śpiewu ptaków :D Kolejne już miały, ale i tak na koniec "Nieprawidłowa odpowiedź. Spróbuj jeszcze raz."

Wisi o tym wątek na ich forum
https://www.dropboxforum.com/discussions/101001020/almost-impossible-to-login-due-to-games-captcha/829652
Ale żeby tam napisać [zgadliście] trzeba się zalogować :D

Jak to przeszło od pomysłu, przez wdrożenie po testy, to nie ogarniam.

obscurity
  • Rejestracja: dni
  • Ostatnio: dni
2

Nigdy się w to nie zagłębiałem ale wreszcie zrozumiałem czemu upgrade telefonu z androidem to takie piekło w porównaniu do iphone'ów i czemu muszę się do wszystkiego logować i ustawiać od nowa.
Otóż ostatnio miałem wymienić tablet córki bo ekran się stłukł, problem polega na tym że chciała żebym przeniósł jej też save'y z jakiejś głupiej gry no i tu zaczęły się schody.
Narzędzia do przenosin nie przenoszą danych aplikacji.
Najpierw pomyślałem że nie ma problemu - wszystkie dane są na karcie sd, po prostu ją przeniosę do nowego tableta, ale nie - okazuje się że dane androida na karcie sd są szyfrowane i tylko do użytku na pierwotnym urządzeniu.
Druga myśl - spoko, użyję adb backupu - nie, adb backup od kilku wersji androida nie robi backupu danych aplikacji.
Kolejna próba - zaloguję się jako aplikacja przez adb run-as i ręcznie je skopiuję poza folder - nic z tego aplikacje z domysłu od androida chyba 13 mają to wyłączone by default.

Okazuje się że od kilku lat google umyślnie blokuje wszelkie metody dostępu do app data, obecnie nie ma żadnej możliwości ich skopiowania czy podejrzenia poza zrootowaniem urządzenia. Nie ma obecnie żadnej aplikacji ani narzędzia które skopiuje dane aplikacji bez dostępu roota bo jest to po prostu niemożliwe. Oficjalne stanowisko google jest takie że dane aplikacji powinny być trzymane w chmurze i zarządzane przez aplikację, nie ma więc potrzeby dostępu do nich. Poza przypadkami w których developer o tym nie pomyślał...
Czeka mnie więc szukanie jak zrootować to dziadostwo albo przekazanie nowemu pokoleniu pierwszej lekcji życiowej o ulotności danych cyfrowych, jeszcze się zastanowię.

Bardzo się bronię przed applem ale google sobie sam wbija gwoździe do trumny

obscurity
  • Rejestracja: dni
  • Ostatnio: dni
1

Co znowu...?
screenshot-20250519222253.png

miałem na początku problem ze zrozumieniem polecenia
w przeciwieństwie do groka któremu z ciekawości przesłałem ten obrazek i nie miał wątpliwości:

The elements that fulfill the task (sandwiches) are the ones in the following positions:

Top right
Middle center
Bottom center
Bottom right

czy captche na pewno spełniają swoje podstawowe założenia skoro AI potrafi je szybciej rozwiązywać?

Marooned
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Poznań
4

Dziś trafiłem na takie fajne dwie klasy w naszej standardowej projektowej bibliotece UI
screenshot-20250605161236.png

CZ
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2541
4

No a wy co tam, nadal tylko mierne "Software Developer"?

SpecjalizacjaIsTheKey.png

obscurity
  • Rejestracja: dni
  • Ostatnio: dni
4

Żeby w angularze zrobić podatność XSS trzeba się postarać. W projekcie który właśnie mój team przejął zrobili pipe safeHtml który przepuszcza wartości przez bypassSecurityTrustHtml i w kodzie budowane są node'y HTMLa przez łączenie stringów razem z danymi użytkownika w stylu '<div style="width: 100%;font-size:12px;color:' + color + '">' + titel + '</div> (tak, łącznie ze stylami inline i literówkami). Dane od użytkownika są "zabezpieczone" przez string replace na < i > ale nie jestem pewny czy nawet wszędzie. Programiści na seniorskim poziomie z pensją $100k+.
To prawdopodobnie jest odpowiedź na to co się stanie gdy zatrudnisz do projektu w angularze developerów jquery.

FA
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: warszawa
  • Postów: 315
4

Prosze w wybrac wszyskie liczbny w zrakresie uzywajac combobox'a XDD
To jest jak z memów na najgorsze UI

screenshot-20250628112707.png

Marooned
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Poznań
2

Ciekawostka - tydzień temu wywalił nam się system, bo BE wysyłał { flaga: "false" }
a dla JS "false" == true ;-) [niepusty string]
Nie ma nudy :D

MarekR22
  • Rejestracja: dni
  • Ostatnio: dni
4

Konwersja UUID do formy binarnej, dla wygody przykład dla 01020304-1011-2021-3031-414243444346 (pierwsza cyfra bajtów to numer segmentu UUID, druga cyfra pozycja w segmencie UUID).

  • java - duża endiana na całej długości (tak jak w formie tekstowej) - Ok
Kopiuj
01 02 03 04 10 11 20 21 30 31 41 42 43 44 43 46
  • C# - mała endiana w pierwszych 3 segmentach - duża endiana w ostatnich dwóch segmentach. WAT?
Kopiuj
04 03 02 01 11 10 21 20 30 31 41 42 43 44 43 46 

I teraz wyobraźcie sobie, że ktoś przepycha dane przez gRpc między aplikacjami w różnych jeżykach.

MarekR22
  • Rejestracja: dni
  • Ostatnio: dni
2

cudo zaokrąglania w C/C++ od MSVC:
https://godbolt.org/z/Pne8MdEz7

Kopiuj
#include <cfenv>
#include <iostream>
 
int main() {
    std::cout << "FE_DOWNWARD\n";
    std::fesetround(FE_DOWNWARD);
    std::cout << -0.0 << '\n';
    std::cout << 0.0 << '\n';
    
    std::cout << "FE_UPWARD\n";
    std::fesetround(FE_UPWARD);
    std::cout << -0.0 << '\n';
    std::cout << 0.0 << '\n';
}

MSVC prints:

Kopiuj
FE_DOWNWARD
-0.00001
0
FE_UPWARD
-0
0.00001
DE
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 599
1

screenshot-20250728133416.png

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12269
3

Jak wam się podoba nowy message box w MS Paint? 🤣

PS: nie da się zmienić myszą rozmiaru tego okienka — ot Microsoft najwyraźniej uznał, że było za małe.

screenshot-20251102215812.png

A jakby tego było mało, zepsuli również Menedżer zadań:

Eh… ta firma schodzi na psy…

1programmer
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 623
2

Może słaby WTF, ale czuję wewnętrzną potrzebę podzielenia się tym.

Pracuję w startupie zajmującym się rozpoznawaniem twarzy, robimy swoje modele AI itd. Ogólnie już jesteśmy na plus, ale wystartowaliśmy o dotację z UE (ale konkurs rozstrzygały polskie nieroby z urzędów).

Zajęliśmy drugie miejsce, a przegraliśmy z eko grzybami XDDD

WhiteLightning
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3257
1

Moze nie spotkalo mnie bezposrednio ale to jest genialne:

Github actions - ktos napisal funkcje safe_sleep ktora jak sama nazwa wskazuje potrafila dzialac na runnerach w nieskonczonosc przepalajac gigantyczne ilosci kasy w cloudzie. Watek odnosnie buga ze zlotym komentarzem:

That hanging sleep didn't just block workflows — it padded Microsoft's quarterly earnings.
The dev who wrote it unintentionally built the most lucrative infinite loop in CI history.
If that doesn't earn a promotion, I don't know what does.

i filmik z omowieniem tematu, warto te kilkanascie minut poswiecic: Ciekawe czy AI byla w to zamieszana, jesli tak, jest spora szansa w niedlugim czasie na powrot eldorado, jesli trzeba bedzie takie szambo ogarniac.

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.