Programistyczne WTF jakie Was spotkały

2

Z dzisiaj, takie perełki na PR wrzuca brazylijski senior iOS'a który ma mnie wdrożyć w świat swifta / iOSa:

struct Sort {
    let key: SortKey
    let direction: SortDirection
    
    var isAscending: Bool {
        return direction == SortDirection.descending ? false : true
    }
}

Im dalej w las tym więcej drzew:

enum SortDirection: String, StringEnum {
    case descending
}

Kolejna perełka, komentarz który dodał:
//NAO COMPLETA AINDA

Hola kolego miałem się uczyć od Ciebie swifta a nie portugalskiego.

Na drugi dzień:
// TODO: transferir logica para HomeInteractor pois agora nao interessa mais se esta offline ou nao para exibir os cards

Inne wtf projektowe:

Dzisiaj mam spotkanie z osobą z USA, nie ogarniają jednej biblioteki i jest blocker jak cholera 
Dwa miesiące temu mówiłem że to nie działa / nie jest przetestowane i trzeba zapytać klienta czy jest ok
Jasne
Poszło na produkcje, szef jeszcze zamknął taska jako Fixed

oraz:

Wczoraj Testerki zrobily request zeby nadpisac cale srodowisko gdzie sa deeplinki
I poszlo xD zaden link do nie dziala a bez deeplinkow nie rozwiaze tematu z USA
Automatu na tworzenie deeplinkow na to nie ma, dziewczyny siedza i tworza nowe recznie, kazdy zajmuje kolo 3 minut a trzeba ich zrobic kilkaset...
2

Nie wiem czy to programistyczny WTF czy bardziej sknerowatość sprzedawcy:
koszyk.png

0

Tak z ciekawości spojrzałem na CI z JavaScript (nie moja bajka), a tu takie zagnieżdżone WTF:

getSomeObjects(stateParams) {
     // w starej wersji było tak: return (null != stateParams.filters) ? JSON.parse(decodeURIComponent(stateParams.filters)) : null;
     return (null != stateParams.filters) ? JSON.parse(decodeURIComponent(decodeURIComponent(stateParams.filters))) : null;
}

WTF 1: podwójne decodeURIComponent
WTF 2: połączenie JSon i decodeURIComponent

6

Czas na WTFka z C:

static void freeState(deviceState_t *state)
{
    freeDevicesTags(state->tagsList[0]);
    free(state);
    state->tagsANum = 0;
    state->tagsRNum = 0;
}
0

CORS w Ajax to jedna z największych pomyłek w informatyce zaraz po billion-dollar mistake by O'Hoare'.

2

Dziś dostałem ekstrakt/eksport danych z "flagowego produktu", zestaw plików CSV, w których separatorem jest , a wartości owinięte są ".

"val1","","val3","JSON...","valN" 

JSON ma:

{attr1:"val1",attr2:"val2",attr3:"",...}

Ktoś chyba nie przemyślał funkcjonalności importu takich danych :-)

8

Okazało się w pewnej aplikacji do robienia joinów w bazach danych został wykorzystany algorytm ....Dijkstry

Edit:
To była aplikacje webowa gdzie szuka się czegoś na podsawie jakiś danych wejściowych i robi się raport. Założmy że mamy start od tabelki A i chcemy wyciągnąć coś z tabeli F tez. Mamy po drodze albo tabele B i C lub D i E. Celem jest znalezienie lepszej drogi do tabeli F. Jest cały graf tabel. Kreatywnośc studentów jest wielka :D

6

Tym razem o obsłudze typów logicznych. I tak w każdej funkcji w tym module.

Boolean jakasFunkcja(Object obj) {
  // Jakiś kod

  if (obj instanceof Long) {
    Long lg = (Long) obj;
    if (lg < 1) {
      return new Boolean(true);
    } else {
      return null;
    }
  }
  
  // Jakiś kod
}

void jakasFunkcja2(Boolean bool) {
  if (bool == null) {
    // coś tam
  } else {
    // coś tam 2
  }
}
22

Opowiem o ciekawym WTF, ale nie pod kątem złego kodu, a buga jaki mi się kiedyś przytrafił. Z produkcji spłynął opis, że podczas skanowania jakiegoś tam vouchera płatniczego, maszyna im pika - i to jest ok, bo tak ma być, ale czasami pika im kilka razy w losowych odstępach czasu i ilością piknięć. Nie wierzyłem, więc mi testerzy nagrali nawet filmik.

Oczywiście u mnie nie do zrepdoukowania. Przekopałem cały kod związany z pikaniem, aż do samego spodu i nic nie było. W logach pusto więc nasrałem loggerów po całym kodzie gdzie tylko miałem przypuszczenie, że może mieć to coś wspólnego. Wysłałem im snapshota żeby sprawdzili jeszcze raz i wysłali logi. Oczywiście pusto! nic się nie zalogowało z moich linijek (poza jedną testową, którą umieściłem, dla pewności czy dobrze podmienili wersje).

Wiece co się okazało? Do płatności tymi voucherami potrzebny był certyfikat, który zahashowany czy tam encodowany wypisywał się w logach. Zdarzało się, że algorytm kodujący umieszczał tam znak 0x007, który odpowiedzialny jest za system beep! Nie mogłem tego zreprodukować bo odpalałem aplikacje z poziomu IDEE, a oni z jakiś launcherów w cmd. Wystarczyło zmienić poziom logowania i po sprawie. Spędziłem nad tym parę dni.

6

Niestety nie mogę pokazać kodu, ale…

Mamy kod w Pythonie, w którym jest setter. Jeszcze spoko, chociaż w Pythonie settery są zazwyczaj potrzebne jak krowie hulajnoga. Nazwa i zastosowanie klasy wskazuje na to, że to będzie prosty setter, w stylu def setAlthorion’sSanity(self, sanity): self._sanity = sanity. Ale nie… Ten przyjemniaczek to:

def setAlthorion’sSanity(self, sanity):
    self._sanity = self.getSomethingElse(sanity, 42)

Czyli tak — mamy settera, który przyjmuje jeden parametr, który się nazywa tak samo jak parametr wewnątrz klasy, ale nie ustawia go bezpośrednio, tylko woła gettera, który przyjmuje dwa parametry, Z CZEGO JEDEN KOMPLETNIE Z KOSMOSU…

A tenże getter, to też niezła sztuka — wywołany bez parametrów, normalnie gettuje co powinien. Ale jak nie, to… jeszcze w sumie nie wiem, co robi. W każdym razie, woła inne funkcje, zależy od stanu rozsianego po całym programie… W każdym razie jeszcze gagatka nie rozgryzłem, a i tak czuję, że coś mi to sanity na False próbuje ustawić…

6

title

1

Kończy mi się miejsce na Google, z czego 90% to Gmail. No to wbiłem has:attachment larger:20M i zrzucam na dysk usuwając maile.. Zonk!

Nietypowe wykorzystanie – konto tymczasowo zablokowane

Twoje konto zostało tymczasowo wyłączone przez Google w trosce o bezpieczeństwo naszych systemów. Dzieje się tak najczęściej po wykryciu zaskakująco dużej aktywności na koncie. W większości przypadków dostęp można odzyskać w ciągu godziny. W rzadkich przypadkach odzyskanie dostępu może zająć maksymalnie 24 godziny.
Oto kilka możliwych przyczyn wyłączenia konta:
1) Odbieranie, usuwanie lub pobieranie w krótkim czasie dużej ilości poczty przy użyciu protokołu POP lub IMAP.

No to może do końca roku się uda...

0

Po walce z trzema monitorami mam Minta zamiast Debiana.

Pierwszy WTF:

Z grubsza toto dziala ale trzeba wszystkie monitory wlaczyc przy starcie systemu bo inaczej sie synchronizacja rozjezdza, do tego nie moge miec zadnego z nich przelaczonego na stacjonarke.

Jak wylacze srodkowy monitor w czasie pracy to potem wszystko glupieje i trzeba rebootowac.

Drugi:

Dzisiaj chcialem dodac zegarek na pozostalych monitorach poza glownym. I znalezienie jak sie aplet nazywa bylo nietrywialne, probowalem wszelkie clock, time itp. A aplet jak sama nazwa wskazuje to "calendar" :)

1

Bądź mną. Nowy lapek. Domyślnie oczywiście z windowsem. Filthy Casual.
Reinstall na ubuntu z budgie, bo taki ładny. Procesor grzeje się niesamowicie - 80* na idlu, nie wiadomo czemu. Może kwestia teog, że to community edition ubuntu jakiś, spróbujmy z oficjalnym.
Reinstall na ubuntu normalnego. Grzeje się w dalszym ciągu. Próbuję konfigurować chłodzenie. Żaden z dostępnych programów ootb nie działa. Próbuję pisać własny config do kontrolera wiatraczka - kontroler nie obsługiwany przez kernel - nawet go nie widzi, ale ubuntu to przecież starocie, nie tracę nadziei - reinstall na Manjaro Rolling Release z najnowszym możliwym jądrem. To samo.
Poddaj się po kilkunastu h batalii. Windows my old friend.
Po kilku miesiącach powrót - nowy kernel, który podobno wspiera. Goodbye Microsoft, now Linus is my friend again.
Reinstall na manjaro. Żaden domyślny program do kontroli nie działa. Spróbuj znowu napisać własny config. Nie działa config rekomendowany przez program, ale coś już przynajmniej wykrywa! Kilka h później - udało się.
Pojawia się problem - touchpad nie działa. Znany mi od zawsze mankament - szybka instalacja jednej paczki i gotowe.
Pojawia się problem - część obrazów Dockera przestała mi się budować, bo tak i koniec. Wpadam w rozpacz.
Okazuje się, że to wina nowego kernela i prawdopodobnie czeka mnie downgrade tegożże, czyli grzanie się laptopa, czyli powrót do Windowsa.
Próbuję tego uniknąć za wszelką cenę.
Jednak udało się znaleźć rozwiązanie - echo N | sudo tee /sys/module/overlay/parameters/metacopy w konsoli i działa. To takie oczywiste, prawda?

I love Linux either way.

10

Takie tam z dzisiaj:

ZonedDateTime now = ZonedDateTime.now(ZoneId.of("UTC")); // 2018-12-31T08:46:01.307Z[UTC]
String formatted = now.format(DateTimeFormatter.ofPattern("YYYY/MM/dd"));// 2019/12/31

Więc sformatowanie daty 2018-12-31 daje nam... 2019-12-31!
Java cannot into dates...
Wyjaśnienie: https://stackoverflow.com/questions/8686331/y-returns-2012-while-y-returns-2011-in-simpledateformat

5

W sumie to "problem" istnieje od jakiegoś czasu i po części sam przyłożyłem doń palec przeczuwając, do czego to może doprowadzić i nie odkręcając tego, ale dzisiaj jakoś rzuciło mi się w oczy to...

let data = response.data.data.data.data;

Skąd się to wzięło?

W skutek różnych takich zaszłości, naleciałości, połowicznie wykonanych poprawek, UI Driven Developmentu, sporej dysproporcji w liczbie devów robiących frontend i backend (odpowiednio 4 do 1, a później przez dłuższy czas 5 do 2 - w tej dwójce stażysta programista czyli ja) i godzenia tych poprawek z nowymi ficzerami "udało" nam się dobrnąć do takiej sytuacji:

  • JSON z danymi zwracanymi przez API owiniętymi we wprowadzony jakiś czas temu uwspólniony format znajduje jest w polu data odpowiedzi
  • ten nasz uwspólniony format w zależności od rezultatu trzyma informacje od błędzie (jako error) lub dane (jako data). Mógł to być jakiś payload, no ale ktoś stwierdził, że jak to są dane to powinno być data no i zostało.
  • Stare wrappery na dane, które miały "ułatwić" pracę na froncie (kilka rodzajów w zależności od tego, co im tam było wygodniej otrzymać) też mają pole data, gdzie trzymają jakieś dane w konkretnym formacie. Stare wrappery zostały, bo i po co robić większe zmiany na froncie (wywalanie ich obsługi + dodanie nowej z obsługą błędów) jeśli można było zrobić mniejsze (owinięcie obsługi starych w nowe z obsługą błędów).
  • jakoś tak wyszło, że któreś DTO z jakiegoś powodu również dostało pole data w którym coś siedzi...

Trzeba się przyczaić, aż ktoś znowu będzie wytrzeszczał oczy na ten łańcuszek i pogadać o refaktoringu ¯\_(ツ)_/¯

1

Jak prawie polozyc sobie system? (Mint) wystarczy sprobowac skopiowac katalog z nie do konca sprawnego pendriva. Co wyczerpalo mi miejsce na dysku. Ciekawi mnie czy ma to jakis potencjal odnosnie buga/security buga.

ja@szarik:/var/log$ ls -alh | grep G
total 26G
-rw-r-----   1 syslog            adm              13G Jan  9 15:01 kern.log
-rw-r-----   1 syslog            adm              13G Jan  9 15:08 syslog

a wszystko to takie wpisy: 

ja@szarik:/var/log$ tail -n 10 syslog
Jan  9 15:01:22 szarik kernel: [15687.107271] FAT-fs (sdc1): error, fat_bmap_cluster: request beyond EOF (i_pos 10826514)
Jan  9 15:01:22 szarik kernel: [15687.107273] FAT-fs (sdc1): error, fat_bmap_cluster: request beyond EOF (i_pos 10826514)
Jan  9 15:01:22 szarik kernel: [15687.107276] FAT-fs (sdc1): error, fat_bmap_cluster: request beyond EOF (i_pos 10826514)
20

screenshot-20190112135603.png
W sumie racja, zapomniałem

4

wklejam 15 linijek z logów podczas rebase w bitbucket, SEND a tu coś takiego:
screenshot-20190117114333.png

z tego co pamiętam normalny skype nie ma takich ograniczeń.
A jak już jest takie głupie ograniczenie, to niech UI pokazuje interaktywnie jaki jest ten limit, żebym nie musiał zgadywać.

6

rest endpoin,t kod z koncowki 2018, normalny jsonowy content, payload w kontrolerze lapany w strumien -> pozniej w stringa -> pozniej w json buildera -> do obiektu. -> job secured

3

Informacja z wczoraj:

https://youtrack.jetbrains.com/issue/KT-28061

fun foo(x: Any?): String {
    x?.equals(return "")
    // No error about missing return
}

Due to the compiler bug in diagnostic about "missing return", this code compiles fine. On runtime, if x == null, default value is returned (null for reference types).
Looks like it hasn't ever been reported (probably due to the highly weird code).

//Edit: Dla osób które nie programują w kotlinie: fun foo(x: Any?): String oznacza że wartość którą zwracamy nie może być nullem.

2

screenshot-20190130173721.png
https://stackoverflow.com/q/54444956/1387438

4 lata doświadczenia i zadawać takie pytanie na SO.

Żeby było jasne pierwotnie nie było nic o interview

2

Dane kupione przez klienta warte kupe kasy (praktycznie jedyny dostawca na rynku):

  • Dostaliśmy od dostawcy listę wszystkich możliwych kategorii - UPS, jednej się zapomniało. Szkoda, że kilku godzinny batch poszedł się walić i trzeba było od nowa to puszczać. No ale ok, zdarza się...
  • 700k elementowa lista miała 4 wyjątki - UPS, poprawicie sobie w kodzie co nie?
  • Pierwsza paczka zawierała za mało danych, druga paczka miała zawierać kompletną listę danych - UPS, okazało się że paczka zawierająca mniejszą ilość danych zawiera dane, których częściowo nie ma w drugiej paczce
  • Dokumentacja mówi, że lista zawiera unikalne ID jeśli kiedyś będziemy aktualizować dane - UPS unikalne ID powtarzają się na liście dla kompletnie różnych od siebie elementów
  • Jak wyglądało ID? Losowe znaki + cyfra np. OEUANA-0912368912 - UPS kilkaset ID wyglądających tak: OEUANA-null
  • Część wyników miała nazwę zawierającą informacje o zbanowaniu ze względu na zbyt dużą ilość requestów wysyłanych crawlerem przez dostawcę
  • Dane posiadały lokalizację pewnych miejsc, np. na środku oceanu
  • CSV w polu listy CSV [magic]. Czasem przecinkiem, czasem pipem ogólnie dało się coś z tym zrobić. ALE byłoby ok gdyby nie było kilkuset elementów elementów, których pola (CSV w CSV) oddzielili SPACJAMI
6

Może nie do końca programistyczne, ale na pewno zawinione przez programistów.

Kupiłem drukarkę etykiet Brother QL-820NWB. Ma kilka możliwości podłączenia - przez LAN, USB, WiFi, Blutut, z czego ja potrzebuję jedynie LAN.

Drukarka posiada ekranik i menu z konfiguracją. Można tam wiele rzeczy zmienić, m.in. ustawienia WiFi czy Bt.** ALE NIE MA opcji zmiany adresu IP...**

Zaglądam do instrukcji i czytam, że żeby zmienić LAN IP trzeba "zainstalować sterownik drukarki oraz narzędzia do konfiguracji ustawień drukarki"... LITOŚCI.

Na szczęście sprawdziłem sobie w logach DHCP jaki IP został przydzielony (dobre chociaż to, że dynamiczne pobieranie działało bez dodatkowej magii, nie wpadli na równie genialny pomysł blokady LAN do czasu włączenia tego w ustawieniach), a potem przez WWW wbiłem na urządzenie i sobie zmieniłem adres na taki, jaki chciałem. Ale i tak niesmak pozostał. Coś, co mogłem zrobić w dosłownie minutę i przy użyciu kilku kliknięć zajęło mi z 15 minut i chwilę kombinowania...

screenshot-20190205114954.png

EDIT
Podczas próby wydruku wyskoczył błąd dot. nieprawidłowego typu zainstalowanej rolki, po czym coś wcisnąłem, etykietka się wysunęła na ok. 2cm (pusta, żadnego nadruku), ekran zgasł i drukarka nie żyje... Fajny początek, nie ma co...
.
.
.
EDIT 2
Nie wiadomo o co drukarce chodziło, ale po kilku minutach bez pradu, po ponownym podpięciu zasilacza się uruchomiła... Ale żeby nie było za łatwo - pół godziny starałem się coś wydrukować. Mamy kilka takich drukarek (poprzednich modeli - ten jest na podmiankę innej, która się popsuła), więc wiem jak się z tym ustrojstwem obchodzić. Mimo tego przez pół godziny nie byłem w stanie niczego wydrukować - cały czas ten sam komunikat o błędnym typie wsadzonej rolki (na szczęście tym razem nie zakończony zgonem urządzenia). Ponieważ, jak napisałem przed chwilą, mam kilka takich w firmie, wsadziłem inną rolkę i druk poszedł od ręki. Czyli na oryginalnej taśmie dostarczonej razem z drukarką nie chciało się drukować, ale po wsadzeniu zamiennika z allegro (w cenie 1/3 oryginału) wszystko jest OK... Naprawdę, ręce opadają.

0
user@pc:~/Documents/workspace/project/frontend/src/main/webpack$ npm i vue-base64-file-upload
npm ERR! Error while executing:
npm ERR! /usr/bin/git ls-remote -h -t https://github.com/robson3999/vue-base64-file-upload.git
npm ERR! 
npm ERR! remote: Invalid username or password.
npm ERR! fatal: Authentication failed for 'https://github.com/robson3999/vue-base64-file-upload.git/'
npm ERR! 
npm ERR! exited with error code: 128

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/user/.npm/_logs/2019-02-07T12_46_40_230Z-debug.log

Jakiś pajac znowu repo rozpadł... Najgorsze że nie ogarniam jak to działa...

5

Trochę WTF, a trochę chcę się pożalić. Otóż jestem po kolokwium z podstaw programowania. Myślałem, że dostanę 100% z zamkniętymi oczami. Niestety nie. W zadaniu chodziło o to, że mając kod (naszpikowany minami i pułapkami, który swoją drogą został chyba napisany przez pijanego juniora) trzeba powiedzieć, co zostanie wypisane na ekranie. Zgubiła mnie ta linijka:

System.out.println('\n' + fun(8, 3));

// ...
static int fun(int x, int y) {
    if (x < 3)
        return 0;
    System.out.println(fun(x - y, y - 1));
    return y;
}

Jak myślicie, co wypisze powyższy kod? Myślałem, że:

0
1
2

3

Niestety nie, bo Profesor oczekiwał, że każdy ze studentów zna tablicę ASCII na pamięć. '\n', to 10, a 10 + 3, to 13 :) Dobrze, że jestem bogatszy o tę wiedzę, przyda mi się w pon w pracy :D

0

Gdzie jak gdzie, ale w standardowej libce C++ (libstdc++) nie spodziewałem się mieszania tabów ze spacjami :)
screenshot-20190211224513.png

Przykład: https://github.com/gcc-mirror/gcc/blob/a4c655fb498c86c00d6ce4c1ce859f8bf1d39c2b/libstdc%2B%2B-v3/include/std/variant#L388
W takim projekcie nie mieć podpiętego clang-formata, to dla mnie mały WTF

1

LinkedIn jak zawsze w formie. Przyzwyczaiłem się do niedziałających przycisków na panelu nawigacji, ale to coś nowego.

screenshot-20190216230416.png

5

Przez błąd w systemie jeden z użytkowników miał kilkaset kont w systemie. Na szczęście po kilku godzinach udało się rozwiązać problem, a jedna z zaangażowanych osób ogłosiła: "Cały proces przebiegł poprawnie". Niestety jako nieoczekiwany skutek uboczny użytkownik otrzymał około 1000 identycznych wiadomości, po dwie na każde zlikwidowane konto :D

1

Zachcialo mi sie zupdatowac Jave do 11. Momentalnie czesc softu przestala dzialac. Przy czym jmeter robi to w fajnym stylu (na szczescie wystarczy jednego exita w launcherze zakomentowac.

Druga fajna rzecz to ze java 11 przy java -version wyswietla sie jako Java 10 :)

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