Programistyczne WTF jakie Was spotkały

Programistyczne WTF jakie Was spotkały
MarekR22
  • Rejestracja: dni
  • Ostatnio: dni
4

iOS, UITableView, komórki ładowane z xib-a.
Kod prosty jak konstrukcja cepa. Apple oczywiście coś spieprzyło i wszystkie rzędy komórek maja biały background.
Debugger przeglądanie wszystkich widoków, wszędzie jest użyty kolor przezroczysty.
Google znalazło coś takiego: https://stackoverflow.com/q/18878258/1387438
Rozwiązanie zatwierdzone na SO strasznie mi się nie podoba, wolę by UI było kontrolowane przez plik xib, bez dodatkowego mieszania w to kodu.
Chwila zastanowienia i zrobiłem coś takiego:

Kopiuj
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(forClass: StrangeCell.self)! // to jest extension
    
    cell.someLable.text = viewModel.someText
    cell.someImageView.image = viewModel.image

    // workaround: THIS WORKS! WTF:
    cell.backgroundColor = cell.backgroundColor

    return cell
}

Jeśli ktoś nie widzi na czym polega WTF, przypisałem property samo do siebie co rozwiązuje problem od Apple :o

BP
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 53
0
Kopiuj
float x =  (float)Math.Sqrt(Math.Abs(Math.Pow(x1 -x2, 2) / Math.Pow(d, 2)))
Kopiuj
 ¯\_(ツ)_/¯
Azarien
  • Rejestracja: dni
  • Ostatnio: dni
0

Pewnie to ja coś „źle zrobiłem”, ale sam fakt że tak się może stać zasługuje na WTF…

Otóż zauważyłem że ostatni mój commit ma w opisie literówkę. Mogłem to tak zostawić, ale postanowiłem…

git commit --amend -m "Opis bez literówki."

A ten… zakomitował usunięcie wszystkich 20 tysięcy plików z repo. Tak w sekundę. Odkręcenie tego oczywiście jest możliwe, ale reset --hard będzie trwało z godzinę albo dłużej.

shagrin
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Norwegia, Stavanger
4

Padlam...

Kopiuj
else if ((mm == 4) || (mm == 6) || (mm == 9) || (mm == 11)) {
	if ((dd > 30) && (dd > 40)) {
		return false;
	}
	else if (dd > 70) {
		return false;
	}
}
else if ((mm == 1) || (mm == 3) || (mm == 5) || (mm == 7) || (mm == 8) || (mm == 10)
		|| (mm == 12)) {
	if ((dd > 31) && (dd > 40)) {
		return false;
	}
	else if (dd > 71) {
		return false;
	}
}
  • Rejestracja: dni
  • Ostatnio: dni
2
Kopiuj
if (angles[0] != angles[0] || angles[1] != angles[1])
{
	return angles;
}
 
return angles;
KP
  • Rejestracja: dni
  • Ostatnio: dni
2

Nauka programowania może być ciężka

Zrzut ekranu 2018-03-21 o 11.55.07.png

shagrin
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Norwegia, Stavanger
3

What...?

Kopiuj
Iterator<MyItem> myItems = something.getMyItems().iterator();
IntStream.range(0, something.getMyItems().size())
		.forEach(idx -> {
			MyItem myItem = myItems.next();
			// do stuff with myItem and idx...
	   })
LukeJL
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 8487
12

Patrzę, i ktoś nazwał firmę "jobshit". Dziwię się, czemu ktoś miał nazwać firmę wulgaryzmem. Po chwili kumam, że to nie chodzi o wulgaryzm, tylko o "Jobs it", po prostu ktoś niefortunnie umieścił trójkąt w tym miejscu (między "s" oraz "it"), że przeczytałem to jako gwiazdkę cenzurującą (jobs*it)

screenshot-20180324212105.png

Ciekawe ile jeszcze osób to w ten sposób odczytało.

YA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2384
1

Może nie WTF, ale rozbawił mnie sposób realizacji zadania. Jeden z developerów dostał zadanie oznaczenia w repozytorium GIT stanu kodu w momencie zakończenia prac. Pewnie myślicie, 'utworzyć taga'... Otoż można inaczej:

Kopiuj
commit XXXXXXXXXXXXXXXXXXXX (HEAD -> master, origin/master, origin/HEAD)
Author: XXXXXXXXXXXXXXXXXXX
Date:   Thu Mar 29 15:55:21 2018 +0200

    last commit
  • Rejestracja: dni
  • Ostatnio: dni
6
Kopiuj
var query = ctx.PERSON.Where(p => p.EMAIL == login && p.PASSWD == pass && p.STATUS == 1)
                    .Join(ctx.INSTITUTION, p => p.FK_INSTITUTION, inst => inst.ID,
                        (person, institution) => new {person, institution})
                    .Join(ctx.PERSON_PROJECT, p => p.person.ID, perProj => perProj.FK_PERSON,
                        (p, perProj) => new {p, perProj})
                    .Join(ctx.PROJECT, p => p.perProj.FK_PROJECT, proj => proj.ID, (p, proj) => new {p, proj})
                    .Join(ctx.PRIVILEGE_ROLE, p => p.p.perProj.FK_ROLE, privRol => privRol.FK_ROLE,
                        (p, privRol) => new {p, privRol})
                    .Join(ctx.PRIVILEGE, p => p.privRol.FK_PRIVILEGE, priv => priv.ID, (p, priv) => new {p, priv})
                    .Where(p => p.priv.NAME == "resource/mul/upload")
                    .Select(
                        p =>
                            new UserModel
                            {
                                Login = p.p.p.p.p.person.EMAIL,
                                FirstName = p.p.p.p.p.person.NAME,
                                LastName = p.p.p.p.p.person.SURNAME,
                                UserId = p.p.p.p.p.person.ID,
                                InstitutionId = p.p.p.p.p.institution.ID,
                                InstitutionName = p.p.p.p.p.institution.NAME,
                                OrganizationUnitId = (decimal)p.p.p.p.p.institution.FK_SWD_ORGANIZATION_UNIT
                            });

P.S. ten kod wyprodukował senior developer .NET

Pyxis
  • Rejestracja: dni
  • Ostatnio: dni
4

Nie wiem czy było, mam nadzieję że nie:

Kopiuj
if ($act_number)
{
    $act_number = $act_number;
}
else
{
    throw new Exception("Документ еще не подготовлен.");
}
Kopiuj
for ($i=0 ; $i<3 ; $i++) {
  switch($i) {
    case 1:
      // do some stuff
      break;
    case 2:
      // do some stuff
      break;;
    case 3:
      // do some stuff
      break;
  }
}

Jest tego więcej na shitcode.

nalik
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1039
5

Czysty kod ...

Kopiuj

if (/* jakis warunek */)
{
   // ciach ...
   while ( /* ciach */)  
   {
       switch (/* costam */)
       {
           case jakis_case:
               // ciach...
               if (/* jaki warunek */)
               {
                   while (/* costam */)
                   {
                       if (/* costam */)
                       {
                           // i jeszcze pare ifow


Leroy
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 107
0

Koledzy ucza sie pisac unit testy na produkcyjnym kodzie. :)

Kopiuj
@Test
public void testNotNull() {
    boolean x = getSomething();
    Assert.notNull(x);
}
MarekR22
  • Rejestracja: dni
  • Ostatnio: dni
11

Dziś w pracy parsknąłem śmiechem, bo zobaczyłem to:

Kopiuj
let isVisible = !isDriveWise ? true : false
someNotification(isVisible)

Tak isDriveWise to Bool. Przy czym wszyscy w zespole mają +3lata doświadczenia.

NikolaPolov
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 106
0
Kopiuj
let array = [ 1 , 2 , 3 ] ;
array.pagination = 'dowolny string'

JS <3

srsly
  • Rejestracja: dni
  • Ostatnio: dni
5

JS. Ktoś piszący wcześniej przejmowany przez nas projekt wybitnie nie był w stanie pojąć, na czym polegają testy:

Kopiuj
console.log("RUN WITH SUDO IF NOTHING HAPPENS, NEED PERMISSION TO FILE SYSTEM");
console.log("RUN WITH SUDO IF NOTHING HAPPENS, NEED PERMISSION TO FILE SYSTEM");
console.log("RUN WITH SUDO IF NOTHING HAPPENS, NEED PERMISSION TO FILE SYSTEM");
console.log("RUN WITH SUDO IF NOTHING HAPPENS, NEED PERMISSION TO FILE SYSTEM");
console.log("RUN WITH SUDO IF NOTHING HAPPENS, NEED PERMISSION TO FILE SYSTEM");
console.log("RUN WITH SUDO IF NOTHING HAPPENS, NEED PERMISSION TO FILE SYSTEM");

/* ... inicjalizacja oparta na wywołaniach setTimeout z czasami wyznaczonymi empirycznie ... */

var stepOne = false;
var stepTwo = false;
var stepThree = false;
var stepFour = false;
var stepFive = false;
var stepSix = false;
var stepSeven = false;
var stepEight = false;

I dalej, w każdym teście coś w rodzaju (dla każdego stepOne, stepTwo...):

Kopiuj
describe('...', function() {
    this.slow(8000);
    this.timeout(5000);
    it("should get ...", function(done) {
        var check = function() {
            if (stepSix) {
                doIt();
            } else {
                setTimeout(function() {
                    check();
                }, 300);
            }
        };
        var doIt = function() {
            testedObj.someCallback = function(url) {
                stepSeven = true;
                done();
            };

            testedObj.doSomething();
        };
        check();
    });
});

I tak aż do ostatniego testu, w którym zamiast done() wywoływano w końcu jedyny w całym pliku z testami expect...

  • Rejestracja: dni
  • Ostatnio: dni
2

Aha. FULL

java.png

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
3

Zagwozdka javowa z dzisiaj. Mamy poglądowy kod (krótkie PoC, dużo łatwiejsze do analizy niż prawdziwy kod, wiec nie cieszcie się jak się domyślicie o co chodzi :P):

Kopiuj
public class CatchTheBall {

    public void aintThrowingNothing() {
        try {
            function1();
            function2();
        } catch (Exception e) {
            throw e;
        }
    }

    private void function1() throws IllegalArgumentException {
        //whatever
    }

    private void function2() throws IllegalStateException {
        //whatever
    }
}

Nasza metoda aintThrowingNothing nie rzuca żadnego checked exception, mimo że mamy tam

Kopiuj
        } catch (Exception e) {
            throw e;
        }

czyli ewidentnie rzucamy tam jakiegoś Exceptiona.

Co ciekawe jeśli zmienimy ten kod na:

Kopiuj
        } catch (Exception e) {
            Exception ex = e;
            throw ex;
        }

czyli de facto tylko przypiszemy sobie e do nowej zmiennej (tego samego typu!) to nagle kompilator zaprotestuje i stwierdzi ze nie mozemy sobie rzucić checked exception bez deklarowania że go rzucamy albo bez try-catch.
@jarekr000000 @rubaszny_karp @Krolik @Koziołek

Nie będę spoilował o co chodzi ;)

jarekr000000
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: U krasnoludów - pod górą
  • Postów: 4712
1

@Shalom Jak ogarniasz takie ciekawostki - tu jest podobna świnia, którą można było podłożyć od 1.5.
Tym razem numer wycina erasure w genericsach. Zresztą, częć gości uznaje to za błąd w języku - do dziś chyba nie ma koncepcji co z tym zrobić...

Kopiuj
public class Swinia {

    public static void swinia(){
        Swinia.<RuntimeException>oops(new Exception("pieknie"));
    }

    public static <T extends Exception> void oops(Exception toThrow) throws T{
        throw (T) toThrow;
    }

    public static void main(String[] args) {
        try {
            swinia();
        } catch (Exception e) {
            System.out.println(e);
            System.out.println(e.getClass());
        }
    }
}
Koziołek
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Stacktrace
  • Postów: 6822
4

To teraz klasycznie. Mamy sobie aplikację napisaną w SAG Web Methods CAF, czyli takiej nakładce SAG na stare portlety (JSR 168), zatem wiele rzeczy jest delikatnie mówiąc "trudnych w obyciu". Jednym z bardziej kłopotliwych elementów jest komunikacja z usługami zewnętrznymi, a tu wykorzystujemy starego dobrego SOAPa. I nie ma w tym nic złego, ponieważ chcemy m.in. mieć możliwość zarządzania użytkownikami i ich uprawnieniami za pomocą SAML. I tu na scenie pojawia się WTF.

Zadanie brzmi wywołaj usługę zewnętrzną (poza aktualną domeną biznesową). Normalnie robimy, to w dość prosty sposób. Przyciks-> wywołanie naszego proxy -> wywołanie usługi właściwej. TYm razem jednak chcemy by właściwa usługa była wywołana z użyciem SAMLa operatora. Zatem...

Uruchamiamy naszą aplikację webową w specjalnie zmodyfikowanym IE, które przy ładowaniu strony prześle nam SAML operatora. Następnie wywołamy usługę bezpośrednio z JS. Zatem mamy już dwa WTFki - IE i SOAP z JS. Jednak wszystko to na głowę bije WTF numer trzy. Jeżeli SAML wygaśnie, to mamy wyświetlić klientowi alert o konieczności przelogowania się w aplikacji, bo nie ma możliwości odnowienia SAMLa w inny sposób. SAML wygasa co 5 minut. Kurtyna.

GS
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1265
4

Próbuję się zalogować do OneDrive. Po zalogowaniu się, dostaję pytanie o wiek:

screenshot-20180502181018.png

Tylko jak mam to potwierdzić? Przypuszczam, że jakiś przycisk jest, tylko się nie zmieścił. Okienka oczywiście ani rozciągnąć ani zmaksymalizować.
Z pomocą przychodzi Tab. Kilka wciśnięć i już mam coś do daje szansę się zalogować:

screenshot-20180502181452.png

Teraz już bułka z masłem, bo po co mi cały przycisk z napisami - można się domyśleć, że trzeba wcisnąć ten niebieski z prawej.

Brawo dla Microsoftu, za nieporadzenie sobie z zadaniem rozmieszczenia przycisków w oknie.

TR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 731
1

w jednej z bibliotek znalazłem taką klasę - FartTraceListener.java

niby żadne wtf, ale co się uśmiałem to moje

Koziołek
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Stacktrace
  • Postów: 6822
6

Wielkoskalowe systemy finansowe jak już wiecie rządzą się swoimi własnymi prawami. Jedno z nich brzmi

Jeżeli można coś napisać bardziej c****, to zostanie tak napisane.

Dziś przykład tego typu rozwiązania. Mamy sobie walidację biznesową danych wejściowych w SAG WebMethods. Kiedyś dawno temu było to napisane w SAGowym silniku reguł opartym o Blaze Advisor. Jak chcecie sobie poczytać czym są silniki reguł to tu na przykładzie Jboss Rules/Drools. Ad rem.
Blaze został przemigrowany na Javę i powstał taki o to potworek:

Kopiuj
boolean isValid = !Rule_XXX_Data.contains(dataSts);

if(!isValid){
    // upchanie warrninga do strumienia wyjściowego
}

Już na tym etapie zacząłem się zastanawiać dlaczego? Odpowiedź dał rzut okiem na kod definiujący rule_XXX_Data:

Kopiuj
public static List<String> Rule_XXX_Data = new ArrayList() {{ add("8"); }};

i jak tu nie kochać #germanskiprogramista ?

Azarien
  • Rejestracja: dni
  • Ostatnio: dni
6

Jakiś czas temu wklejałem tu obrazek przedstawiający windowsowe opcje do ustawiania DPI zepsute przy wysokim DPI.

W najnowszej wersji systemu (1803) to już nie jest jeden combobox, tylko całe osobne okienko.

dpi.png

Brawo. :D

wasiu
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Poznań
  • Postów: 1552
3

Przyznam, że nie spodziewałem się, że StackOverflowException w apce asp.net'owej wywali całego pool'a iis'a a nie tylko wątek requesta. Dzięki temu zero errorów w error logu aplikacji, a i brak wpisów w logach iis'a jakiż to request zapoczątkował dziwną rekurencję w EntityFramework.dll

Pierwszy raz od 13 lat musiałem memory dumpy dla .netu analizować by w ogóle dojść co się stało, a i te dumpy jakoś mało przyjazne .net'owym apkom.

Azarien
  • Rejestracja: dni
  • Ostatnio: dni
0

Przed chwilą dostałem taki mniej-więcej (piszę z pamięci) komunikat: Ze względów bezpieczeństwa system Windows nie może zsynchronizować czasu z powodu niezgodności daty.

Nie wiem gdzie to tacy geniusze są – w Microsofcie czy wśród adminów danego serwera NTP. Ale po kiego dziada mam najpierw ręcznie wpisywać datę (która zresztą się zgadzała) a nawet godzinę (która była rozjechana o te kilkanaście godzin)? Po to chyba jest synchronizacja, by nie musieć tego nigdy robić…

cerrato
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Poznań
  • Postów: 9012
3

Może nie do końca programistyczne (aczkolwiek - stworzone przez programistów), ale na pewno ciekawe :D
Bardzo szczegółowa informacja uzyskana od Gmaila.

P.S. Z tym uznaniem wiadomości za ważną gmail chybił - było to zapytanie od jakiejś obcej klientki z którą wcześniej nie mieliśmy do czynienia, prawdopodobnie rozesłane do 100 znalezionych w necie firm z branży ;)

Bez tytułu.jpg

Koziołek
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Stacktrace
  • Postów: 6822
0

Mamy sobie kod:

Kopiuj
Boolean unAssign = assignEvtReq.isUnAssign();
if (Boolean.TRUE.equals(unAssign)){

Hm...

// Edit: Jeszcze jedno złoto znalazłem:

Kopiuj
retDoc.getXXXX().setXXXX(Long.valueOf(0));

i takie coś w kilku miejscach.

BTW, to są piękne pytania na rozmowę kwalifikacyjną by sprawdzić czy Junior rozumie Boxing.

Haskell
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4700
8

Mamy sobie kursor z pętlą WHILE w środku. Zapytanie kręci się 90 minut... Klient w końcu zwrócił uwagę, że to trochę wolno :D:D:D

Kopiuj
DECLARE LF CURSOR FOR
   SELECT --jakiś select
OPEN LF
FETCH NEXT FROM LF INTO --jakies pola
WHILE @@FETCH_STATUS = 0
BEGIN
  WHILE costam
  BEGIN
    IF costam
      IF cosinnego
      ELSE
        IF cosjeszcze innego
  END
END

Zastąpiłem całość jednym selectem, teraz działa około 1,5 s.

Uwielbiam te sytuacje, gdy programiści oderwani od Javy czy innego COBOLa piszą coś w bazie danych o.0

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.