Programistyczne WTF jakie Was spotkały

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:

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

0
float x =  (float)Math.Sqrt(Math.Abs(Math.Pow(x1 -x2, 2) / Math.Pow(d, 2)))
 ¯\_(ツ)_/¯
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.

4

Padlam...

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;
	}
}
2
if (angles[0] != angles[0] || angles[1] != angles[1])
{
	return angles;
}
 
return angles;
2

Nauka programowania może być ciężka

Zrzut ekranu 2018-03-21 o 11.55.07.png

3

What...?

Iterator<MyItem> myItems = something.getMyItems().iterator();
IntStream.range(0, something.getMyItems().size())
		.forEach(idx -> {
			MyItem myItem = myItems.next();
			// do stuff with myItem and idx...
	   })
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.

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:

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

    last commit
6
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

4

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

if ($act_number)
{
    $act_number = $act_number;
}
else
{
    throw new Exception("Документ еще не подготовлен.");
}
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.

5

Czysty kod ...


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


0

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

@Test
public void testNotNull() {
    boolean x = getSomething();
    Assert.notNull(x);
}
11

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

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

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

0
let array = [ 1 , 2 , 3 ] ;
array.pagination = 'dowolny string'

JS <3

5

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

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...):

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...

2

Aha. FULL

java.png

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):

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

        } catch (Exception e) {
            throw e;
        }

czyli ewidentnie rzucamy tam jakiegoś Exceptiona.

Co ciekawe jeśli zmienimy ten kod na:

        } 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 ;)

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ć...

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());
        }
    }
}
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.

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.

1

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

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

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:

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:

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

i jak tu nie kochać #germanskiprogramista ?

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

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.

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ć…

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

0

Mamy sobie kod:

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

Hm...

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

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.

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

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

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