Programistyczne WTF jakie Was spotkały

0

te 2 linijki idealnie pokazują w jaki sposób używając TypeScripta można zaciemnić kod:

 forEach(cb: (value: V, index: [T, U], map: Map<[T, U], V>) => void, thisArg?: any): void {
    this.state.forEach((v, [l, r]) => cb.call(thisArg || this, v, [l, r], this))
  }

Co prawda cały plik zawiera dość prostą logikę i po nazwach metod można się skumać co, która co robi. Ale kaman, te dwie linijki to jakiś potworek. To tak jakby programować na wyrażeniach regularnych.

https://github.com/bcherny/tuple-map/blob/master/index.ts

12

To nie będzie WTF związany z samym kodem, ale i tak pełnoprawny WTF.

Pracujemy nad dość poważnym projektem (przynajmniej taki powinien być) od około 1,5 roku. Ostatnio przy testach releasowego kandydata, niedaleko samego release wypłynął crash, zaczęła się panika itp. Po sesji z debuggerem okazało się, że crash występuje na jakimś tam assercie. No i to jest pierwszy wtf, bo jak assert może być w ogóle w binarce releasowej. Parę korpo-maili później okazało się, że od początku projektu, czyli ponad 1,5 roku, buildy releasowe to są tak na prawdę buildy debugowe, tyle że bez symboli..

0

Consistency is the key
PHPExcel/Cell.php

	/**
	 *	String from columnindex
	 *
	 *	@param	int $pColumnIndex Column index (base 0 !!!)
	 *	@return	string
	 */
	public static function stringFromColumnIndex($pColumnIndex = 0) {}

	/**
	 *	Column index from string
	 *
	 *	@param	string $pString
	 *	@return	int Column index (base 1 !!!)
	 */
	public static function columnIndexFromString($pString = 'A') {}
0

Sytuacja z dzis. W miare swiezy Linux, potrzebuje wydrukowac dokument. Zestawiam drukarke, wysylam joba, biegne pietro nizej - pusta kartka. Powrot, reinstalacja drukarki, kolejny bieg po schodach. I tak kilka razy ze zmienianiem opcji, sterownikow etc. Ide do kolegi sprawdzic jak ma zestawione - tak jak u mnie. Sugestia zeby wydrukowac do pliku. I co? Wynikowy pdf jest pusty.

Z google docsow poszlo za 1-szym razem...

1

Łordzik 365 i ich własny szablon kalendarza (sic!)

screenshot-20170223095435.png

3

Napisałem testy do tego, commit, push, build wieloplatformowy na bamboo …
Wszystkie platformy się budują za wyjątkiem Windows, gdzie mam takie błędy:

UtilsTests.cpp(42): error C2220: warning treated as error - no 'object' file generated
\UtilsTests.cpp(42): warning C4146: unary minus operator applied to unsigned type, result still unsigned

Problem jest w takiej linijce (gtest):

	EXPECT_EQ(narrow_cast<int32_t>(-2147483648), -2147483648);

Czyli Visual Studio 2013 zauważył, że 2147483648 nie mieści się w int wiec zrobił z tego unsigned int a dopiero potem wziął pod uwagę minus.
Wstawiłem w to miejsce std::numeric_limits<int32_t>::min().

5

W sumie to nie programistyczne WTF, a WTF w obsłudze klienta w serwisie, ale...

Zepsuł mi się stary laptop XPS, dawno po gwarancji. Padł układ zasilający na płycie głównej. Ale że laptop nadal dobry do prostszych zadań i trochę szkoda oddawać na złom, to dałem do serwisu do jednego z pawilonów WGE przy GUSie. Naprawili, skasowali 300 zł, zadowolony wyszedłem. Powiedzieli z uśmiechem, że jakby coś jeszcze się działo, to oczywiście zapraszają, polecają się na przyszłość i takie tam uprzejmości.

Po ok. 4 miesiącach padł układ zasilający znowu - identyczne objawy jak poprzednio. Z fakturą udałem się do owego punktu licząc na naprawę w ramach gwarancji. Niestety usłyszałem, że

Nie mogę Panu uznać tego na gwarancji, bo my na takie rzeczy dajemy 3 miesiące gwarancji, a tylko na nowe układy np. karty graficzne dajemy 6 miesięcy. No, widzi Pan, a tu minęły 4 miesiące.

Spróbowałem jednak troszkę powalczyć i przekonać pana za ladą, że poprawnie zrobiona elektronika tak łatwo się nie psuje, żeby padać po 4 miesiącach w ten sam sposób, zwłaszcza że do pierwszej naprawy układ zasilania w tym laptopie działał przez ponad 7 lat, i że w ramach rękojmi odpowiadają przez rok za wykonaną usługę. Na to usłyszałem tekst:

To jest elektronika i to się może zepsuć. W ogóle mogło się zepsuć coś innego. Nawet nowy laptop z pudełka ma prawo nie działać. Dlatego tak naprawdę nie powinniśmy dawać żadnej gwarancji na te naprawy.

1

Przygotowujemy kolejny kurs. Tym razem JCF. Opieramy się na materiałach zrobionych przez kolegów z południa Europy. Goście są naprawdę dobrzy w tym co robią i raczej nie mam baboli w ich kodzie. Raczej...

public abstract class AbstractAccount{
	///.... duperele
   
	public static Account parse(Params params){
		switch(params.type){
			case "c": return parse(params);
			case "s": return parse(params);
		}
		return null;
	}
}

public class SavingAccount extends AbstractAccount{
	///.... duperele
   
	public static Account parse(Params params){
		return new SavingAccount(params.id, params.value) ;
	}
}

public class CreditAccount extends AbstractAccount{
	///.... duperele
   
	public static Account parse(Params params){
		return new CreditAccount(params.id, params.value) ;
	}
}

Jest prawie dobrze, bo mamy StackOverflowError. Ktoś zrobił rekursywne wywołanie na metodzie statycznej, która jest „nadpisywana” w podklasach. Oczywiście winnego nie ma, bo kod choć w repozytorium to jest wrzucany tam przez adminkę, która dostaje gotowe korpo paczki.

2

Quicksort w J:

quicksort=: (($:@(<#[), (=#[), $:@(>#[)) ({~ ?@#)) ^: (1<#)

źródło: https://en.wikipedia.org/wiki/J_(programming_language)

A teraz proszę zrefaktorować tak żeby sortowało jednocześnie po imieniu i wieku :)

0

WTF moje: Kalkulator w Windows 10 w trybie „programisty” dzieli całkowicie. A akurat nie o to chodziło.
Wynik całkowity (zły) trafił do kodu.

wniosek 1: patrzeć w jakim trybie jest Kalkulator.
wniosek 2: nie hardkodować magicznych wartości ;-)

12

Java bywa zaskakująca:

static long getHash(Object obj) {
    return obj != null? obj.hashCode() : null;
}

Skompiluje się, ale w runtimie rzuci NPE jak obj jest null. Gdzie WTF? Kompilator akceptuje bez szemrania fakt, że z metody zwracającej prymityw zwracamy null. Prymitywy w javie nie mogą być nullami.

7

U mnie dwie sytuacje:

  1. Mamy miec spotkanie, zarezerwowana salka, poprzednia grupa przeciaga, jak chcemy ich pogonic po raz kolejny zamykaja sie od srodka i w tym momencie psuje sie zamek w drzwiach tak ze nie da sie otworzyc i trzeba technika wezwac - insta karma :)
  2. Godzina debugowania z kolega dlaczego deployment z Jenkinsa nie przechodzi (blad o braku katalogu, deployment ogolnie mocno skomplikowany). Sprawdzamy co sie da, poprawiamy mnostwo rzeczy w konfiguracji, ciagle to samo. W akcie desperacji chcemy stworzyc katalog recznie i w tym momencie pojawia sie przyczyna - brak miejsca na dysku.
7
  1. Jest sobie projekt ktory jest RelayService.
  2. Trzeba zaktualizowac WSDL w tym RelayService a pozniej w projekcie Server
    WTF1
  3. na swoim kompie nie moge nawet edytowac sciezek do WSDLow czy cokolwiek zrobic z referencjami bo pokazuje mi dziwny blad z VS
  4. znajomy ktory upgradowal visual studio z 2012 do 2015 moze edytowac sciezki i aktualizowac referencje pod jednym wzlgedem. Gdy zmieni framework z 4.6 na 4.0
    4.76) Okazuje sie, ze nowym VS brakuje jakis tooli to edycji tego, wiec tylko jak zupgradedowales VS z 2012 do 2015 bedziesz mogl cos zmieniac
  5. Ok, solucja serwerowa mozna aktualizowac, ale najpierw trzeba podejsc do RelayService
  6. Gdzie jest kod? Ano nie ma
  7. Okazalo sie, ze ktos usunal kod w 2014 roku bo byl nie uzywany (a jego wersja byla na produkcji)
  8. Jako, ze uzywany byl TFS to cos tam udalo sie odzyskac z usunietego repo
  9. Ale autor tego RelayService byl bardzo niepocieszony tym, ze ktos mu usunal projekt, bo jak synchronizowal to ze swoja maszyna to zaczelo mu usuwac pliki
    WTF2
  10. Stwierdzil, ze zdekompiluje DLLki ktore sa na produkcji i bedzie na takim kodzie dzialal
  11. poprawial jakies bledy i pozniej juz nic na tym nie robil (to bylo gdzies w 2014 roku)
  12. Idziemy do autora po kod
  13. Dostajemy ogolnie 4 wersje wszystkie w zip przesylane przez skype
  14. zdekompilowany projekt ma roznice z tym co jest na produkcji
  15. Nikt nic nie wie, wiec stwierdzilismy ze przepiszemy projekt, autor mowi, ze powinno nam to zajac maksymalnie pol dnia moze dzien
  16. Drugi tydzien, nadal rzuca randomowe bledy i nadal tylko jedna osoba moze na tym pracowac
  17. Zmiana dotyczy zmiany z prostego typu na complex type (ze stringa na obiekt ktory posiada dwa stringi)
    WTF3
  18. dostarczone WSDL sa popsute
    WTF4
  19. Zeby to dzialalo, i w ogole sprawdzic co to robi trzeba zmieniac generowany kod
  20. Im dalej w las tym dziwniejsze bledy
12

Pominę całą historie. Coś naprawiłem, znalazłem nowego crasha z cudzego kodu.
Prosty problem z niewłaściwym zarządzaniem pamięci na granicy C i C++ (wskaźnik C przekazywany do lambda C++, a zwolnienie zasobu następuje przed wykonaniem lambdy). Nie mój kod nie moja odpowiedzialność, więc wysyłam maila do innego teamu z innej firmy (Rosja), ale dostałem taką odpowiedź, że mi szczena opadła:

W trybie RELEASE się crash się nie reprodukuje, więc nie ma potrzeby tego naprawiać

14

Co może robić metoda która nazywa się isSMTP?

Tak! Zgadliście! Ustawia protokół na smtp.

screenshot-20170321142423.png

PS: Biblioteka "PhpMailer", gdyby kogoś to interesowało.

1

screenshot-20170323175751.png

0
      public bool theSame(object obj)
      {
         bool ok = obj != null && obj is TagsList;
         if (ok)
         {
            TagsList list = obj as TagsList;

            // The same category
            if (ok)
               ok = list.CategoryName == this.CategoryName;

            // The same list
            if (ok)
               ok = list.ListName == this.ListName;

            // The same definition of list
            if (ok)
            {
               ok = list.ListDefinition.Length == this.ListDefinition.Length;

               if (ok)
               {
                  ok = EqualsCollections(list.ListDefinition, this.ListDefinition);
               }
            }

            // The same definition of category
            if (ok)
            {
               ok = list.CategoryGuid == this.CategoryGuid;
            }

            if (ok)
            {
               ok = list.ListSortOrder.Count == this.ListSortOrder.Count;
               for (int i = 0; i < list.ListSortOrder.Count && ok; i++)
               {
                  ok = list.ListSortOrder[i] == this.ListSortOrder[i];
               }
            }
         }
         return ok;
      }
6
float Foo::getWidth()
{
    float value =  0.0;
    float &width=value;
    getBar()->getWidth(width);
    return value;
}

Kolega znalazł taką perełkę. To jest tak głupie, że aż parsknąłem zamiast się zdziwić

0
      public Dictionary<int, string> ListSortOrder()
24

Może mało programistyczne - stracić pół godziny na szukanie błędu w kodzie do obsługi dat tylko dlatego, że w czeskim języku maj to květen...

15

Nie tyle programistyczne co tłumaczeniowe:

uu.png

W oryginale jest “Remove” i “Delete”. Też głupio.

2

https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247%28v=vs.85%29.aspx#naming_conventions

Do not use the following reserved names for the name of a file:
CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, and LPT9. Also avoid these names followed immediately by an extension; for example, NUL.txt is not recommended.

i powstały z tego problem: https://www.reddit.com/r/rust/comments/68hemz/i_think_a_crate_called_nul_is_causing_errors_for/

Nie ma to jak zrobić system operacyjny bardzo mocno powiązany z jednym systemem plików oraz system plików bardzo mocno powiązany z tymże systemem operacyjnym, po czym zrobić obie te rzeczy tak, by miały rozjeżdżające się cechy (system plików pozwala na większą swobodę w nazewnictwie niż OS; pamiętam jak kiedyś radośnie zrobiłem na pendrive’ie folder Magic: The Gathering i, jako że byłem bez dostępu do Linuksa przez jakiś czas, to musiałem formatować, bo Windows od tego dostawał głupawki)…

1
var finalPrice = pricingProduct.is_FINALPRICE != null ? (decimal?)pricingProduct.is_FINALPRICE.Value : null;

Z nullable do nullable...

5

Podstron ma wyświetlić dużo zdjęć, które mają być pojawiać się podczas scrolowania. Typowy ajax co nie? Nie koniecznie, "można" też załadować wszystkie zdjęcia od razu, i podczas scrolowania zmienić display: none na display: inline. Później człowiek się zastanawia, czemu strona wczytuje się pół minuty.

3
2017-05-23 09:48:37:014 [main] =========Logging Levels Applied============
objc[6119]: Class _NSZombie_CFCalendar is implemented in both ?? and ??. One of the two will be used. Which one is undefined.
0

Gdzieś w serwisie do logowania, podczas logowania:

$this->session->set("user", $user); // ten, który się właśnie zalogoował, np. name = admin

UsersController::editAction

$this->view->setVar("user", $user); // ten, którego akutalnie edytujemy, np. name = desu

users/edit.volt

<!-- admin - ten z sesji. Nasz user przypisany w controllerze przepadł bez śladu. -->
{{ user.name }} 

@Edit
Udało mi się ustalić o co tu kur.. chodzi. Renderowanie widoku wygląda tak:

/**
 * Export the variables the current symbol table
 */
if typeof params == "array"	{
    for key, value in params {
        let {key} = value;
    }
}

require compiledTemplatePath;

Wszystko pięknie, co nie? W momencie require powinienem już mieć dostep do mojej zmiennej $user. Okazuje się, że problem jest wcześniej.

Kod odpowiedzialny za kompilowanie .volt => .php z jakieś powodu generował coś takiego:

<!-- teraz odpala się jego ekscelencja magiczny getter, który - po przejściu przez skomplikowany algorytm decyzyjny - zwraca mi usera z kontenera (okazało się, że tam też jest) -->
<?= $this->user->name; ?>

zamiast czegoś takiego

<!-- teraz jest czytana zmienna przypisana w tej śmiesznej pętli u góry, czyli prawidłowo -->
<?= $user->name; ?>

Oto winowajca:

/**
 * Services registered in the dependency injector container are available always
 */
let dependencyInjector = this->_dependencyInjector;

if typeof dependencyInjector == "object" && dependencyInjector->has(variable) {
    let exprCode .= "$this->" . variable;
} else {
    let exprCode .= "$" . variable;
}

Są zmienne równe i równiejsze, w tym wypadku te w kontenerze mają pierwszeństwo, nadpisując te wysłane z kontrolera.
#phalcon

9

jak to w miejscu gdzie dużo programistów - dużo ludzi, dużo teamów, dużo projektów.

Jeden ze znajomych sporo się dopytywał o wyrażenia regularne. Ogólnie narzekał na projekt, ale nasza uwagę zwrócił fakt, że o te wyrażenia regularne pyta się zbyt "regularnie" i to coraz trudniejsze.
Projekt w javie...normalne, że się coś szuka raz na jakiś czas, ale on rozkminiał non stop.

W końcu zamiast odpowiadać zapytaliśmy po co mu to:

  1. Projekt korzystał z frameworka, który generował kod (u niego w javie, ale była możliwość więcej języków)
  2. Projekt miał nieco zbyt mały "expression power"
  3. Problem - framework usuwał katalog src i w jego miejscu generował nowe pliki źródłowe (to było by design).
  4. Żeby coś zmienić trzeba było po wygenerowaniu projektu zaaplikować zmiany wyrażeniami regularnymi.
  5. Na początku to może jakoś działało...
  6. ...ale w tym momencie to wygląda tak że jest generowany kod, potem wyrażenia regularne i na to nakładane kolejne wyrażenia regularne i kolejne
  7. takie inkrementalne modyfikowanie...kodu źródłowego wyrażeniami regularnymi

Słyszeliśmy, że ten projekt i framework są do bani, coś nam wspominali, że u nich coś tam generują, ale nikt nawet nie wpadł by na pomysł, który opisałem. Jak zaczęliśmy się z tego śmiać ( a w zasadzie to płakać ze śmiechu, no i może z żalu, że można coś takiego w ogóle zrobić) to sporo osób przychodziło patrzeć na monitor czy to nie ściema. Tam było kilkadziesiąt skryptów do "aplikowania" wspomnianych zmian.

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