Programistyczne WTF jakie Was spotkały

5

Prawie wszystkie wpisy na tej stronie dotyczą łotdafaków UX-owych, a nie programistycznych. Może powinien być osobny temat?

3

Niby rekrutacja, ale dla mnie bardziej UX WTF
Wejdźcie na stronę https://workeo.dev/offer/bitclear-scaladeveloper i kliknijcie sobie Aplikuj. Na jednym ekranie tylko jedno pytanie, po wypełnieniu pytania przechodzi się do następnego. Bo programista jest za głupi żeby wypełniać kilka pytań na raz.
Piersze pytanie Jak masz na imię Drugie pytanie Jak się nazywasz. I co ja mam tam podać? Imię i nazwisko czy samo nazwisko?

najgorszy jaki widziałem w życiu formularz do wysyłania CV. Chyba dostosowany do pokolenia Z, W takich momentach czyje się stary :(

27

Grzebiemy w czyimś projekcie. W Javie wymyślili nowy typ danych, który leci też na front. Roboczo nazywam to HindiBool. Ma dwie wartości:
"YES", null

11

Zaszła potrzeba wysyłania niektórych logów do jakiegoś serwera Syslog. Ok więc jako że korzystamy z log4net, to postanowiłem użyć appendera wbudowanego, a mianowicie RemoteSyslogAppender. Ok wszystko fajnie logi idą - jest git. Jednakże, klient chce wysyłać tekst zawierający polskie litery. No ok, kodowanie UTF-8 i wszystko fajnie. Jest opcja encoding w konfiguracji - super. No nie super, bo okazało się, że log4net wycina polskie znaki. Próbowałem też jakieś niemieckie - też nie ma. Nie to, że krzaki. Ich w ogóle nie było. No to WTF. Sprawdzam w kodzie źródłowym, a tam to:

// Accept only visible ASCII characters and space. See RFC 3164 section 4.1.3
if (((int)c >= 32) && ((int)c <= 126))
{
   builder.Append(c);
}

Czyli "it's not a bug it's a feature". Sprawdzam rzeczone RFC:

The code set traditionally and most often used has also been seven-bit ASCII in an
eight-bit field like that used in the PRI and HEADER parts. In this
code set, the only allowable characters are the ABNF VCHAR values
(%d33-126) and spaces (SP value %d32). However, no indication of the
code set used within the MSG is required, nor is it expected. Other
code sets MAY be used as long as the characters used in the MSG are
exclusively visible characters and spaces similar to those described
above.

Czyli używanie innych znaków nie jest zakazane lub odradzane, ale ten appender je arbitralnie wycina niezależnie od podanego kodowania. Nic o tym nie ma w dokumentacji https://logging.apache.org/log4net/release/sdk/html/T_log4net_Appender_RemoteSyslogAppender.htm

2

Kolejne WTF z cyklu. W kodzie źródłowym appendera (log4net) RemoteSyslogAppender natrafiłem na to:

  #if NET_4_5 || NETSTANDARD
                      Client.SendAsync(buffer, buffer.Length, RemoteEndPoint).Wait();
  #else
                      this.Client.Send(buffer, buffer.Length, this.RemoteEndPoint);
  #endif

gdzie Client to System.Net.Sockets.UdpClient.

Czy potrafi mi ktoś wyjaśnić po kiego używać asynchronicznej wersji i wywoływać na tym Wait jak można po prostu użyć synchronicznej?

0

Największym WTFem jest chyba używanie log4net po 2005 roku.

9

Bardziej UX-owy niż programistyczny...

https://developer.allegro.pl/documentation/#

Spróbujcie zescrollować na dół strony ;)

8

Coś się te procenty nie zgadzają… :D

CCrasher.png

6

kod pisany w C, zmienna typu int pełniąca rolę booleana niby wszystko normalne, tylko dlaczego TRUE jest oznaczone przez -1

1

W .NET 5 dodano rekordy, fajny feature, który docelowo miał pozwalać na szybkie i łatwe tworzenie klas z domyślnym value-based comparision. Szybki check jak to zajebiście działa.

using System;
					
public class Program
{
	public static void Main()
	{
		var a = new A { Value = "Test" };
		var b = new A { Value = "Test" };
		
		Console.WriteLine(a == b);
		
		IA c = new A { Value = "Test" };
		IA d = new A { Value = "Test" };
		Console.WriteLine(c == d);
	}
	
	public interface IA
	{
	}
	
	public record A : IA
	{
		public string Value {get; init;}
	}
}

Wyniku nie będę zdradzał, ale dla mnie to expectations vs reality.

8

Pamiętajcie, piszcie długie i opisowe nazwy funkcji aby każdy rozumiał o co chodzi np.

IntPtr_objc_msgSend_IntPtr_IntPtr_IntPtr_IntPtr_IntPtr_IntPtr_IntPtr_IntPtr_IntPtr_IntPtr_IntPtr(...)

[BindingImpl (BindingImplOptions.Optimizable)]
public static IntPtr GetAppearance (IntPtr class_ptr, UITraitCollection traits, params Type [] whenFoundIn)
{
	if (traits == null)
		throw new ArgumentNullException ("traits");

	IntPtr[] ptrs = TypesToPointers (whenFoundIn);

	if (Runtime.IsARM64CallingConvention) {
		// The native function takes a variable number of arguments ('appearanceWhenContainedIn:'), terminated with a nil value.
		// Unfortunately iOS/ARM64 (not the general ARM64 ABI as published by ARM) has a different calling convention for varargs methods
		// than regular methods: all variable arguments are passed on the stack, no matter how many normal arguments there are.
		// Normally 8 arguments are passed in registers, then the subsequent ones are passed on the stack, so what we do is to provide
		// 6 dummy arguments (remember that Objective-C always has two hidden arguments (id, SEL), which are the two first arguments
		// here), in order to push the arguments we care about to the stack.
		return IntPtr_objc_msgSend_IntPtr_IntPtr_IntPtr_IntPtr_IntPtr_IntPtr_IntPtr_IntPtr_IntPtr_IntPtr_IntPtr (
			class_ptr, // x0
			Selector.GetHandle (UIAppearance.selAppearanceForTraitCollectionWhenContainedIn), // x1
			traits.Handle, // x2
			ptrs [0], // x3
			IntPtr.Zero, // x4
			IntPtr.Zero, // x5
			IntPtr.Zero, // x6
			IntPtr.Zero, // x7
			ptrs [1], // the rest is on the stack. This is where iOS/ARM64 expects the first varargs arguments.
			ptrs [2], ptrs [3], ptrs [4], IntPtr.Zero);
	} else {
		return Messaging.IntPtr_objc_msgSend_IntPtr_IntPtr_IntPtr_IntPtr_IntPtr (class_ptr, Selector.GetHandle (UIAppearance.selAppearanceForTraitCollectionWhenContainedIn), 
											 traits.Handle, ptrs [0], ptrs [1], ptrs [2], ptrs [3]);
	}
}
3

Może nie programistyczny ale organizacyjny. Zespół w którym pracuję podzielił się na 2. Wynikł z tego poważny problem, ponieważ w moim zespole nie ma certyfikowane sc(r)um-mastera. Dramat w jednym akcie.

8

Amazon uruchomił polską stronę, Amazon.pl. Próbuję wyszukać Philip K. Dick, czyli zgodnie z faktycznym zapisem imienia. Nic. Zero. Null. Strona mówi tylko, że wyszukała nie Philip, ale... Philips, czyli dodała s na końcu imienia. W pierwszej chwili jednak pomyślałem, że coś mi się ubzdurało, więc wpisałem Phillip K. Dick, czyli przez dwa l. Znalazło 21 pozycji. Co ciekawe, właściwe wyniki (setki pozycji) daje dopiero kliknięcie Zamiast tego wyszukaj philip k. dick.

dick1.png
dick2.png

Oczywiście Amazon.com sam poprawia imię przy wyszukiwaniu, przy czym wyszukanie błędnego (Search instead...) zwraca zbliżony zestaw wyników, co wyszukanie poprawnego.

10
Hibernate operation: could not prepare statement; SQL [select ....]
(...)
Caused by: java.sql.SQLException: Prepared or callable statement has more than 2000 parameter markers.

(nie mój serwis, ale te logi będę podsyłać każdemu kto twierdzi że Hibernate przecież ładnie ogarnia query i w ogóle o niczym nie trzeba myśleć...)

2

W PHP zawołanie funkcji z nadmiarowymi argumentami jest jednocześnie dozwolone i niedozwolone.

Wbudowane funkcje

ctype_lower("a", "b");              // error: ctype_lower() expects exactly 1 parameter, 2 given
array_unique([], SORT_STRING, []);  // error: array_unique() expects at most 2 parameters, 3 given

Funkcje użytkownika

$closure =  function ($arg) {};
function my_function($arg) {};

$closure(1, 2);      // works
my_function(1, 2);   // works
5

Może tak nie stricte programistyczne, ale na pewno WTF.
Niedługo minie rocznica komunikatu, który mi wyświetla Windows Update:

screenshot-20210315110948.png

4

19

https://docs.microsoft.com/en-us/previous-versions/office/developer/office-2007/aa432714(v=office.12)?redirectedfrom=MSDN

Trzystanowy boolean, który ma pięć możliwych wartości, z czego trzy są nie wspierane…

13

Cały dzień nie mogę się skupić na robocie, wręcz odczuwam psychosomatyczny ból spowodowany przez to, że muszę używać pewnej wewnątrzfirmowej libki, której trzon API stanowią takie klasy: EventEnvelope<TPayload> oraz GenericEventEnvelope.
Jak widać niegeneryczna wersja to ta, która ma generic w nazwie. Logiczne.

Architektom przy zatrudnianiu powinni ucinać ręce, żeby nie mogli pisać kodu. Diagramy przecięż można malować trzymając pędzel w zębach, za to oszczędzi się takich wtfów programistom.

6

Jak zaokrąglić liczbę do dwóch miejsc po przecinku w CSS:
https://stackoverflow.com/a/64921523

div {
    --shf: 4.9406564584124654e-322;
    width: calc(x * var(--shf) / var(--shf));
}

trzeba przyznać że pomysłowe (choć niezupełnie działa jak powinno)

14

Programistyczny WTF jest takie, kiedy niemal codziennie na spotkaniach programiści używają określeń "base64 encryption" albo "base64 hashing".

Zabawne jest to, że przyznają "base64 is not a very secure encryption", ale utrzymują że b64 to jest enkrypcja tak czy tak :D

(Wyjaśnienie: base64 to nie jest żadna enkrypcja, tylko zapis liczby w systemie 64-kowym, zamiast w binarnym czy dziesiętnym. Nie ma nic wspólnego z bezpieczeństwem danych).

4

Ja dużo rozumiem... ale żeby Android był tak ciężki? 20210319_081722.jpg

4
    public static final int XD = IntStream.rangeClosed(0, 10)
            .parallel()
            .reduce(0, (a, b) -> a + b);

    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }

Jeśli spróbujemy uruchomić powyższy kod to nic się nie stanie, nie dostaniemy żadnej informacji.
Ale jeśli zmienimy (a, b) -> a + b na Integer::sum to nasza aplikacja już zadziała.

11

Kolega prosi o pomoc. Ma projekt we Flutterze, ma zdalne API, próbuje z niego dostać dane i dostaje komunikat "API key needed". A klucz API wysyła, w takim nagłówku jak trzeba. Biorę przykładowy kod z dokumentacji API, w C# - działa. Piszę dokładny odpowiednik we Flutterze, korzystając z biblioteki http - nie działa. W czym rzecz?

Stwierdziłem, że podsłucham sobie komunikację sieciową. W Android Studio jest dodatek do tego, instaluję Android Studio. Nie działa - bo wymaga użycia określonej biblioteki w Androidzie. A Flutter robi to sam z siebie, w DevTools jest zakładka network - zawsze się człowiek czegoś uczy. Podglądam komunikację sieciową - wygląda w porządku, klucz API jest wysyłany. Z ciekawości buduję projekt dla weba, nie dla Androida - ta sama sytuacja, "API key needed". Eksportuję żądanie do formatu cURL bezpośrednio z zakładki network w przeglądarce, uruchamiam - nie działa.

Biorę jeszcze jeden przykładowy projekt - w JavaScripcie. Dokumentacja jest źle zrobiona, nawet się nie ma prawa uruchomić. Poprawiam, wysyłam, działa. Eksportuję żądanie do cURL i przyglądam się.

Oprócz nieistotnych nagłówków typu User-Agent znajduję różnicę, wreszcie. Zmieniam - działa. Zmieniam znów - nie działa. A zatem to to.

Flutterowa biblioteka http domyślnie wysyła żądanie z Content-Type ustawionym na application/x-www-form-urlencoded; charset=utf-8. A tymczasem API oczekuje - uwaga uwaga - application/x-www-form-urlencoded. Bez określenia charsetu.

I zgodnie z logiką rzuca kodem 200 OK z komunikatem "API key needed" w JSON-ie.

I teraz najlepszy dowcip - nie mam pojęcia jak zmusić http do nie wysyłania tego nagłówka w ten sposób - jak się ustawia wszystko ręcznie, to i tak dorzuca, encoding ustawione na null nie zmienia (bo domyślnie to UTF-8) i tak dalej. Mogę sobie zmienić encoding, ale nie mogę go wyrzucić. Jest już 23, rzucam to wszytko w diabły, biorę inną bibliotekę niż "oficjalna" - Dio. Działa.

Dzisiaj, kilka dni po rozwiązaniu problemu, z ciekawości zaglądam na dokumentację tego API czy jest jakakolwiek wzmianka o tym. Gdzie tam. Ale jest sekcja "dyskusje". I rok temu ktoś miał ten sam problem, w PHP. Pod tym tylko komentarze "mam to samo, pomuszcie".

API płatne powyżej 300 żądań miesięcznie, minimum 10$ miesięcznie.

1

To mi przypomina pewne api do komunikacji z którym musiałem implementować sam protokół http, bo to coś wymagało podpisania nagłówka http w całości.
Konia z rzędem temu, kto uzyska surową formę http przed wysłaniem żądania w C#. Gdy pierwsze testy nie przechodziły, napisałem prośbę o pomoc do autorów. Dostałem w odpowiedzi, że nie tego się już nie robi, a podpisuje jedynie url :D. No świetnie - dziękuję za aktualną dokumentację. I spora część kodu wyleciała.

Jak już wszystko miałem przewalczone i działające przyszła pora na wdrożenie. Okazało się, że moja aplikacja ma się łączyć ze starszą wersją ich aplikacji, gdzie całe to API nie jest wspierane. Musiałem dopisywać integrację przez SDK. YAFUD

2

Połączyłem się przez RDP z moje kompa do VM managementu i z niej odpalony RDP do innej VM2 na fullscreen. Na VM2 klikam w menu start i zamykam system, bo chcę zmodyfikować konfiguracje i... nagle wywala mi zdalny pulpit! Okazało się że, klikając w menu start na VM2 wyświetliło się menu z managementu. Reszty chyba możecie się domyśleć. VM z managementu jest jedynym dojściem do zażądania całą infrastrukturą a włączyć można ją tylko przez bezpośrednie podpięcie pod servera XD dobrze że kolokacja blisko, a nie na drugim końcu kraju. Kochany M$.

0

Maven wprowadzil nowa wersje z poprawka security. Ale sposob komunikowania o co chodzi jest po prostu niesamowicie przyjazny:

Generalnie user dostaje w twarz komunikat:

Downloading from maven-default-http-blocker: http://0.0.0.0/.......

Tutaj zmiana: https://maven.apache.org/docs/3.8.0/release-notes.html

Tutaj komentarz do zmiany:
https://www.mail-archive.com/[email protected]/msg123882.html

8

Dzisiejszy WTF z Stackoverflow:

Stackoverflow_copy_limit_april_fool.pngStackoverflow_copy_limit_description_april_fool.png

:)

5

Ledwo włączyłem, a ten już narzeka, że za długo sesja trwa. :D

Screenshot_20210308-041354.png

0 użytkowników online, w tym zalogowanych: 0, gości: 0