Programistyczne WTF jakie Was spotkały

10

https://np.reddit.com/r/cscareerquestions/comments/6ez8ag/accidentally_destroyed_production_database_on/

Today was my first day on the job as a Junior Software Developer and was my first non-internship position after university. Unfortunately i screwed up badly.
I was basically given a document detailing how to setup my local development environment. Which involves run a small script to create my own personal DB instance from some test data. After running the command i was supposed to copy the database url/password/username outputted by the command and configure my dev environment to point to that database. Unfortunately instead of copying the values outputted by the tool, i instead for whatever reason used the values the document had.
Unfortunately apparently those values were actually for the production database (why they are documented in the dev setup guide i have no idea). Then from my understanding that the tests add fake data, and clear existing data between test runs which basically cleared all the data from the production database. Honestly i had no idea what i did and it wasn't about 30 or so minutes after did someone actually figure out/realize what i did.
While what i had done was sinking in. The CTO told me to leave and never come back. He also informed me that apparently legal would need to get involved due to severity of the data loss. I basically offered and pleaded to let me help in someway to redeem my self and i was told that i "completely fucked everything up".
So i left. I kept an eye on slack, and from what i can tell the backups were not restoring and it seemed like the entire dev team was on full on panic mode. I sent a slack message to our CTO explaining my screw up. Only to have my slack account immediately disabled not long after sending the message.
I haven't heard from HR, or anything and i am panicking to high heavens. I just moved across the country for this job, is there anything i can even remotely do to redeem my self in this situation? Can i possibly be sued for this? Should i contact HR directly? I am really confused, and terrified.
EDIT Just to make it even more embarrassing, i just realized that i took the laptop i was issued home with me (i have no idea why i did this at all).

11

Patologia w wykonaniu Adobe i wtyczki Flash Player.

Wchodzę na stronę producenta i pobieram instalator pluginu – plik o nazwie flashplayer26_ha_install.exe. Zmieniam jego nazwę na Adobe Flash Player 26.0.0.131.exe – bo tak chcę – i uruchamiam. Na ekranie wyświetla się okno błędu o poniższej treści:

Adobe Flash Player

Używasz starszej wersji instalatora programu FlashPlayer lub pliku o zmienionej nazwie. Kliknij przycisk Zakończ, aby pobrać najnowszą wersję.

Tak – jak zmieni się nazwę pliku instalatora to plugin nie zainstaluje się.

Mało tego – po wyjściu z instalatora (bez względu na to czy prawidłowo zainstalowano plugin czy wyskoczył błąd), instalka zostaje automatycznie usunięta z dysku. I otwarty zostaje Internet Explorer, bo odpalić URL w domyślnej przeglądarce nie umieją.

Żenada.

7

legacy system ktory od lat nie moze calkiem umrzec bo caly czas przynosi zyski :) codziennie pare wtfow, z dzisiaj:

  1. zeby miec jakikolwiek dostep w qa/uat trzeba miec zgode od kilku waznych osob, czemu? bo autentykacja i autoryzacja jest tylko jedna niezaleznie czy pracujesz z symulatorem czy prawdziwa gielda i musisz obiecac ze nie zepsujesz produkcji

  2. klient kupuje choc nie ma pieniedzy, jak to mozliwe? z grubsza

void increaseCreditLimit() {
   ...
   log.debug("client limit increased");
   ...
}
long getPrevTarget() {
    increaseCreditLimit();//checking the previous target happens only when we dont have enough cash
    return prevTarget;
}
4

Ktoś decyzyjny w projekcie wpadł na pomysł, że będziemy robić takie cuda ^^

screenshot-20170630192331.png

Oczywiście dwa powyższe powstały ~miesiąc temu, nie doczekaliśmy się nowych

2

Pewna firma chciała mieć stronę na swoim serwerze. Prosimy o dostęp do SSH. Odpowiedz.. co to jest SSH.
Edit: Pisaliśmy do ich "admina" w firmie.

4

Przygotowuję migrację z Mongo do Postgresa aplikacji medycznej jaką robimy w firmie (+ przepisanie całości z Ruby do Elixira). Kwiatki jak na razie (w razie potrzeby rozszerzę listę):

  • Mamy sobie pole no_of_children, naturalnym byłoby, że będzie to liczba, otóż nie. Jest to string opisujący słownie liczbę dzieci lub other czy tam more. Klient wymyślił, na szczęście w nowej wersji przepchnąłem liczbę, a FE bawi się by to wyświetlić odpowiednio (jak można się domyślić more to jest 10 i nie ma innej opcji).
  • Grupa krwi w nowej wersji to struktura Postgresowa zawierająca enum A/B/AB/0 oraz czynnik Rh (aka za mało dla szpitala, ale klient chce, to ma), która jest tworzona z "bardziej naturalnej" składni [AB0O]+(\+|-), jednak w starej aplikacji (przypominam w Mongo, więc zdecydowanie łatwiej budować typy złożone) jest (znów) string: B_plus.
0

WTF w Ubuntu jest takie, że odkąd pamiętam, gdy tylko zainstalujesz świeży system, to od razu wita Cię (tuż po zalogowaniu) komunikatami o błędach w systemie. Najskuteczniejsze rozwiązanie, które znalazłem to

sudo apt-get purge apport -y
5

Lokalny serwis informacyjny mający ponad 300tys wyświetleń dziennie. Serwis ten przeszedł przez n-dziesiąt programistów. Ostatnio odkryliśmy jakiś stary link, który nie wymagał żadnej autoryzacji. Po wejściu na niego odpalało się zapytanie do bazy. Zapytanie wykonuje się ponad 4 godziny, blokując przy tym dostęp do bazy. Cały serwis leży.
Odkryliśmy to przypadkiem, kiedy kilka razy serwis się tak zablokował w nocy. Przeglądając core serwisu znalazło się jeszcze kilka podobnych kwiatków.
Uroki szefostwa, które uważa, że jak coś działa to po co zmieniać. Core serwisu ma blisko 17 lat.

9

Kolejny raz się uśmiechnąłem przy rozwiązaniach przyjaciół z zagranicy (:

Na początku wspomne, że nie robiliśmy żadnych operacji wrażliwych na wielkość inta.

Jest sobie w jakimś magicznym headerze taka linia:
typedef INT32 int32_t;

I przykazanie numer jeden, że mamy używać tego i tylko tego wszędzie. Żadne int, int32_t. Tylko INT32.

Koledzy zapytali autorów z zagranicy, po co takie coś skoro możemy używać normalnego int32_t albo nawet int.
Otrzymali w odpowiedzi mniej więcej coś takiego:

Bo jak kiedyś będziemy chcieli zamienić, żeby było używane tylko np. szesnastobitowy int be znaku, zrobimy to tylko w tej jednej linijce:
typedef INT32 uint16_t;

8

Może nie dokończa wtf związane z programowaniem, ale z project managementem.

No więc razem z kilkoma znajomymi robimy mały project open source i chcieliśmy użyc jakiegoś toola do zarządzania projektem i najlepiej zintegrować go z bitbucketem. Wybór padł na Wrike (nie polecam), znalazłem na necie, że można go zintegrować za pomocą zapier-a (to taki serwis, który robi integracje na zasadzie nowy issue w bitbucket to nowy task w zapier itp. z synchronizacją co 5 min).

Wszystko fajnie tylko nie do końca to przemyślałem i zrobiłem integracje w dwie strony, nowy issue w bitbucket to nowy task w wrike, a nowy task w Wrike to nowy issue w bitbucket.. Z dwóch zadań rosło wykładniczo do ponad 200 do godziny 20:00.

Na Wrike usunąć zadania to nie problem, ale obawiam się, że usuwanie issues na bitbucket to już całkiem inna bajka.

0
5.5 % 1
0

Co tu sie...

0

ale o co Ci chodzi? Nie wiesz jak modulo działa? przecież modulo zwraca liczbę CAŁKOWITĄ z zakresu 0 - n-1, jeśli n=1 to zakres jest 0 - 0

btw oczywiście czytałeś http://php.net/manual/en/language.operators.arithmetic.php

1
abrakadaber napisał(a):

ale o co Ci chodzi? Nie wiesz jak modulo działa? przecież modulo zwraca liczbę CAŁKOWITĄ z zakresu 0 - n-1, jeśli n=1 to zakres jest 0 - 0

btw oczywiście czytałeś http://php.net/manual/en/language.operators.arithmetic.php

W Javie jakoś działa normalnie:

% is also defined to work with float and double operands, though that use is quite rare.
The result of a floating-point remainder operation as computed by the % operator is not the same as that produced by the remainder operation defined by the IEEE 754 floating point standard. The IEEE (Institute of Electrical & Electronics Engineers) 754 remainder operation computes the remainder from a rounding division, not a truncating division. % on floating-point operations behaves analogously to the integer remainder operator; this may be compared with the C library function fmod. The IEEE 754 remainder operation may be computed by the library routine Math. IEEEremainder. (Note the violation of the naming conventions.)

3

Jak ktoś myśli że zna słabo angielski to niech sobie puści darmowe próbki tego kursu:
https://www.udemy.com/explore-java-io/

7

Wszedłem na stream, na kom, żeby zobaczyć jak z dźwiękiem itp i odkliknąłem łapkę, która nie była kliknięta ^^

screenshot-20170727222858.png

2

Serwer, komunikacja przez websocket, za pomocą JSON-a. Nic nadzwyczajnego.
Dodoaje do kodu "komendę" zgodnie z dokumentacją:

{
    "name" : "jakasNazwa"
    "transId" : "13"
     "params" : {
          …
     }
}

WTF 1 serwer nie odpowiada.
No to podmieniam "jakasNazwa" na coś losowego, serwer nie odpowiada, a pewien zgłosić błąd (inne komendy działają, więc to nie problem z połączniem). Każdy inny normalny serwer w momencie gdy otrzyma nieznaną wartość dla "name", odpowie właściwym błędem, ale u nich cisza.

Kolejny email developerów usługi, odpowiedź zmieniliśmy nazwę na "jakasInnaNazwa". Poprawiam, testuje, nadal nic.

Piszę więc, że nadal nie działa, że musieli źle udokumentować coś, albo wystawili stary serwer do testów (wersja z dokumentacji się zgadza).
Odpowiadają mi, że jest "handshakeRequest", który odpowiada "handshakeResponse" z listą wszystkich dostępnych komend.
Patrzę w logi apki, WTF 2
no faktycznie jest "handshakeRequest" oraz odpowiedź "handshakeResponse", ale wygląda tak:

{
  "name" : "handshakeResponse",
  "params" : {
     "admissionPasscodeNeeded" : false,
     "admissionPermissionNeeded" : false,
     "commands" : [
        {
           "version" : "version 1.0"
        },
        {
           "version" : "version 1.0"
        },
        {
           "version" : "version 1.0"
        },
        {
           "version" : "version 1.0"
        },
        {
           "version" : "version 1.0"
        },
        {
           "version" : "version 1.0"
        },
        … … // jeszcze tego dużo
     ],
     "externalAdmissionNeeded" : false,
     "participantId" : "adalsdlkjl2",
     "responseCode" : "success",
     "transId" : "1",
     "version" : "1.0"
  }
}

Wartość tych danych w "commands" zerowa, a miało być tak pięknie.

11

Ostatnio musiałem pogrzebać w legacy code w Delphi (i Codegear/Delphi 7). Większość kodu ma ponad 25 lat. System niemały, a autor był zapalonym miłośnikiem wskażników. Najgorzej było przebrnąc przez mega zagnieżdżone pętle na tablicah wskaźników. A wskażnik z tablicy wskazywał inny wskaźnik. Festiwal pointerów... No nic, czyta się to beznadziejnie i jako gwóźdź do trumny zajeb... nazwy metod. Moim WTF faworytem zastała zagnieżdżona wskaźnikowa masakra o nazwie: FOGNOAAI. Myślę kur.. co to? A że to nie VS tylko archaiczne IDE to szukaj pan. I w końcu jest.
FOGNOAAI - to FindOrGetNewObjectAndAddIt napisał w komentarzu :D. że też sam na to nie wpadłem :D

9

czytajac powyzsze przypomnial mi sie jeden z pierwszych projektow w ktorym bylam, 'tech lead' odrzucal na review kazdy kod w ktorym byla zmienna lub pole bez prefixu z pierwszych liter slow nazwy klasy.
to nie zart, o ile jeszcze kazdy wegierski faszysta dalby like za int iTest czy DateTime dtTest to przy BrakSrodkowDoPrzelewuOkAnulujDialog bsdpoadTest ciezki oddech gwarantowany ;)

0

O co tu chodzi?

var d = new Date('2017-07-07 00:00:00')
var d1 = new Date('2017-07-07')

d
// Fri Jul 07 2017 00:00:00 GMT+0200 (Środkowoeuropejski czas letni)
d1
// Fri Jul 07 2017 02:00:00 GMT+0200 (Środkowoeuropejski czas letni)

2017-08-01_2137.png

4

Outlook vs emotikony

IMG_02082017_173630_0.png

0

Może Atlassian to celowo zrobił, ale spotykam się z tym pierwszy raz.

Confluence dzielnie mnie poinformował o timeoucie przy szukaniu:
screenshot-20170814113515.png

8

WTF z powodu własnej głupoty
Implementując upload plików w mojej aplikacji skorzystałem ze Springowego przewodnika:
https://spring.io/guides/gs/uploading-files/

Aby spersonalizować folder w którym mają zapisywac się pliki, zaczerpnąłem stąd:
https://github.com/spring-guides/gs-uploading-files/blob/master/initial/src/main/java/hello/storage/StorageProperties.java
przykładowe ustawienia.

Zmieniłem wartość location z "upload-dir" na "C:\moja-sciezka", dodałem funkcjonalnosc do aplikacji i zadowolony uruchomiłem aplikacje aby zobaczyć czy wszystko działa.

No i tu następuje WTF - po uruchomieniu aplikacji usunęły mi się wszystkie(!) pliki z nowej lokalizacji(łącznie z aplikacją)

Powód: kopiując kod przeoczyłem że podczas inicjalizacji aplikacji usuwamy i tworzymy od nowa folder.

@Bean
    CommandLineRunner init(StorageService storageService) {
        return (args) -> {
            storageService.deleteAll();
            storageService.init();
        };
    }

A w storageService następuje coś takiego:

 @Override
    public void deleteAll() {
        FileSystemUtils.deleteRecursively(rootLocation.toFile());
    }

Strach pomyśleć co by się stało gdybym chciał sobie te pliki zapisać na C: ;) Zapamiętać na przyszłość - nie przeklejać bezmyślnie kodu nawet z oficjalnej strony Springa

0

Programowanie z uzyciem palcow. Dziwi mnie ze majac alexy i inne glosniki nie mowimy po prostu co ma sie zaprogramowac tylko uzywacie do tego rak. Ale to pewnei jest jakis rok 2020 wiec jeszcze za murzynami :D

9

@stas i nel pacz:

1

Szukasz buga i widzisz coś takiego:

if ($data['available'] != '@') {
    $order->serviceman_id = $data['available'];
}

if ($data['area'] != '@') {
    $order->serviceman_id = $data['area'];
}

if ($data['matching'] != '@') {
    $order->serviceman_id = $data['matching'];
}

if ($data['available'] === '@' && $data['area'] === '@' && $data['matching'] === '@') {
  // ....
}

i już wiesz, że masz przejeb...

2

Dzisiaj znalazłem taki kod:

$orderBlockStart = (int)$orderStart->format('H') * 4 + (int)($orderStart->format('i') / 15); // o co chodzi z tą 4 i 15?
$orderStart->modify('+' . ($order['length'] * 60) . ' minutes');
if ($orderStart->format('His') === '000000') $orderStart->modify('-1 minute');
$orderBlockEnd = (int)$orderStart->format('H') * 4 + (int)($orderStart->format('i') / 15) - 1;
$orderRange = range($orderBlockStart, $orderBlockEnd);
$availRange = [];
foreach ($available as $one) {
    if ($one->date === $orderStart->format('Y-m-d')) {
        $hmStart = explode(':', $one->time_start);
        $hmEnd = explode(':', $one->time_end);
        $availabilityStart = (int)$hmStart[0] * 4 + (int)($hmStart[1] / 15);
        $availabilityEnd = (int)$hmEnd[0] * 4 + (int)($hmEnd[1] / 15) - 1;
        $availRange = array_merge($availRange, range($availabilityStart, $availabilityEnd));
    }
}
$intersectRanges = array_intersect($orderRange, $availRange);
if (count($orderRange) != count($intersectRanges)) {
    return false;
}

W tym fragmencie chodzi o sprawdzenie, czy czas zamówienia nakłada się na czas dostępności osoby, które to zamówienie wykona.

Rozumiem działanie tego kodu, tzn.: konwertuje on godziny i minuty na liczby z przedziału 4 <= n < 100 i później używając funkcji tablicowych wszystko sobie wylicza, ale nie rozumiem, czemu ktoś to tak zrobił. To jest jakiś znany algorytm, którego nie znam?

5

To: https://bugs.openjdk.java.net/browse/JDK-8148463 bo spotkało mnie dziś w produkcyjnym kodzie.
W skrócie: zwijanie streama do mapy w Javie przez standardowe Collectors.toMap() wali NPE jeśli wartość (!) jest nullem, mimo, że oczywiście posiadanie w mapie pary klucz -> null jest dopuszczalną sytuacją.

4

Ja wczoraj albo przedwczoraj spotkałem się z metodą valid która zwracała false jeśli string pasowal do regexa i odwrotnie, zwracała true jeśli nie pasował :D

1

Dwa wtf:

  1. Metoda areStringEquals, zrzucala stringi do lowercase'a i potem porownywala. (Co najgorsze bylo to w firmowym pseudojezyku, wiec nie dalo sie normalnie zdebugowac).
  2. Walczylem wczoraj z instalacja WiFi na Dell E6430. Wiadomo sterowniki wlasnosciowe, wiec jak zawsze podpiecie przez Ethernet na poczatku i ZONK siec nie dziala. Po dwoch godzinach kombinowania, sprawdzania roznych kabli, przelaczania z powrotem na Windowsa (gdzie tez nie dzialalo, caly czas pokazywalo ze kabla nie ma) okazalo sie ze niektore Latitude gdy sa do stacji podlaczone i maja cos w porcie USB (myszka) kolo gniazda Ethernet, to siec nie dziala :O Post ktory mnie naprowadzil -> http://en.community.dell.com/support-forums/network-internet-wireless/f/3324/t/19647700
13

Właśnie zadzwonił klient, że mu nie działa nowa funkcjonalność w aplikacji. Spytaliśmy go czy ma aktualną wersję przeglądarki stwierdził że tak, ma aktualną wersje. Po kilku minutach rozmowy okazało się, że zatrzymał się w rozwoju i stanął na Win XP i Operze 36.

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