Programistyczne WTF jakie Was spotkały

Programistyczne WTF jakie Was spotkały
rnd
  • Rejestracja:prawie 17 lat
  • Ostatnio:ponad 13 lat
12

Dziś w pracy moim oczom ukazała się klasa na 30k linijek. W jednym pliku.
Jeszcze jestem w szoku :-D
A jakie Wy mieliście WTF?


#define TRUE FALSE
//Happy debugging suckers :D
edytowany 2x, ostatnio: Demonical Monk
MA
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad 15 lat
  • Postów:501
3

Ciekawe definicje TRUE i FALSE dla C (szkoda że się sypią przez priorytet operatorów):

Kopiuj
#define TRUE '/'/'/'
#define FALSE '-'-'-'

Kilka dni się zastanawiałem jak to działa.

vpiotr
Wytwór tzw. sprytnego programisty?
Azarien
wystarczy sobie dodać spacje wokół operatorów '/' / '/' '-' - '-' i działanie przestaje być tajemnicą.
cepa
  • Rejestracja:ponad 22 lata
  • Ostatnio:4 dni
0

ja tam <ort>zadko </ort>mam WTF bo jak siedze w robocie to ostatnia rzecza jaka mi sie wtedy chce jest patrzenie w kod :P

wasiu
  • Rejestracja:prawie 21 lat
  • Ostatnio:6 miesięcy
  • Lokalizacja:Poznań
  • Postów:1552
1

781 osobnych zapytan do bazy danych, by wyswietlic naglowek z informacjami klienta i 10 jego ostatnich zamowien... i sie zastanawiaja, czemu strona laduje sie pol minuty :|

Cos podobnego to pare milionow iteracji w petli w aplikacji na serwerze by przetworzyc dane z bazy danych (ktore wpierw pobierane byly prostym selectem) i wyswietlic... 10 wierszy (trwalo to do polgodziny). No ale coz zrobic, ze niektorzy tak programuja :|


Full Stack Developer .NET & Angular, Blazor
KR
krystiano_ronaldo
ktoś nie umie w hajbernety czy inne oeremy, klasyk
KE
cały cel zajęć został tutaj niewłaściwie wykorzystany
Koziołek
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Stacktrace
  • Postów:6821
2

Kod COBOL przeniesiony na Javę z zachowaniem sekcji, paragrafów i zdań. Oznaczało to m.n. operację otwórz-zapisz-zamknij na pliku dla każdego rekordu pobieranego z DB. Każdy rekord był pobierany w osobnym zapytaniu. Codziennie trzeba przetworzyć około 3 mln rekordów. W oryginalnym środowisku program działał około 20 minut. Po przeniesieniu na około stu krotnie mocniejszą maszynę program działał około 3 godzin.
Obecnie przepisuję go od nowa przy czym muszę zachować API. Zatem po przetworzeniu generuję grupy COBOLowo-LINCowe. hehehe


Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException
vpiotr
W COBOLu (iSeries) jest coś takiego jak "szybkie re-otwarcie" (nie pamiętam dokładnej nazwy). W COBOLu masz też np. bindowanie na twardo z SQL-em (np. z/OS). W Javie trzeba się trochę wysilić żeby nie mając tego móc równie szybko przetworzyć rekordy.
Koziołek
@vpiotr: OPEN "extended" chyba. Rzecz w tym, że JVM w swojej HotSpotowej implementacji nie używa bardziej zaawansowanych mechanizmów odczytu, by zachować kompatybilność zachowania pomiędzy różnymi systemami. Dlatego też trzeba się napocić, by otrzymać dobre wyniki. Po 8 latach od napisania tego postu już to wiem i bym pewno to jeszcze inaczej zaimplementował.
OT
  • Rejestracja:około 20 lat
  • Ostatnio:ponad 11 lat
0

COBOL? Współczuję

Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:9 minut
0

manfredek:
ujmij to w nawiasy i bedzie dzialac.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
KamilAdam
Groovy: ujmij to w wąsate nawiasy i będzie działać
MA
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad 15 lat
  • Postów:501
0
donkey7 napisał(a)

manfredek:
ujmij to w nawiasy i bedzie dzialac.
Oj wiem, ale nie o to chodzi, tylko o to, że te definicje dziwnie wyglądają

sprzedamsanki
  • Rejestracja:prawie 18 lat
  • Ostatnio:prawie 8 lat
  • Postów:278
0

Manfredek:
Tak z ciekawości, jak to działa, bo jakoś nie potrafię do tego dojść :O


The most exciting phrase to hear in science, the one that heralds new discoveries, is not 'Eureka!' (I found it!) but 'That's funny'
johny_bravo
  • Rejestracja:około 19 lat
  • Ostatnio:około 13 lat
0

Ciekawie wygladajacy define to np. taki ;)

Kopiuj
#define class class __decl(dllexport)

You need to learn how to walk
before you can run
KR
krystiano_ronaldo
klasa sama w sobie, co tu tumaczyć
MA
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad 15 lat
  • Postów:501
0
sprzedamsanki napisał(a)

Manfredek:
Tak z ciekawości, jak to działa, bo jakoś nie potrafię do tego dojść :O
TRUE to dzielenie kodu ASCII / przez ten kod ASCII, FALSE to odejmowanie kodu ASCII znaku - od tego kodu. Czyli 1 i 0. Aha - pisz manfredek (lub, lepiej, manfred).

@up: Zdaje się że nie można zrobić makra o nazwie słowa kluczowego.

johny_bravo
  • Rejestracja:około 19 lat
  • Ostatnio:około 13 lat
0

@up: mozna, mozna, choc moze nie wszystkie kompilatory puszczaja. Ale w visualu dziala.


You need to learn how to walk
before you can run
0
manfredek napisał(a)

@up: Zdaje się że nie można zrobić makra o nazwie słowa kluczowego.

Ty chyba sobie jaja robisz - rozwijanie makr robi preprocesor, na tym etapie kompilacji słowa kluczowe języka nie istnieją.

quetzalcoatl
  • Rejestracja:około 18 lat
  • Ostatnio:ponad 6 lat
0

no to pojechałem z nieobecnością.. chwila przerwy i prawie rok przeleciał
0
manfredek napisał(a)

Ciekawe definicje TRUE i FALSE dla C (szkoda że się sypią przez priorytet operatorów):

Kopiuj
#define TRUE '/'/'/'
#define FALSE '-'-'-'

Kilka dni się zastanawiałem jak to działa.

Ale Ty to niby w pracy widziałeś? :) To jest popularna sztuczka na zawodach typu 'napisz kod, który sprawi kompilatorowi (preprockowi i reszcie) najwięcej trudności' czytaj - parser będzie miał kłopoty z odszyfrowaniem intencji. Jeśli ktoś używa tego w kodzie produkcyjnym, to chyba musi znaleźć sobie inną formę pracy ;)

Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:9 minut
0
auto(ka)r napisał(a)

parser będzie miał kłopoty z odszyfrowaniem intencji.

a co w tym jest trudnego? zapis w kodach ascii:
#define TRUE 47 / 47
#define FALSE 45 - 45


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
rnd
  • Rejestracja:prawie 17 lat
  • Ostatnio:ponad 13 lat
1

Dzisiaj doznałem jeszcze większego WTF niż poprzednio. Kod który miał przetwarzać elementy z listy a następnie je usuwać:

Kopiuj
int size = list.size();
for(int i = 0; i < size; i++) {
  Response r = null;
  try {
    r = list.get(i);
  } catch(OutOfBoundException e) {
     break;
  }
  doSth(r);
  list.remove(r);
}

Bug powodował losowe timeouty po stronie klienta. Ja w tym kodzie widze conajmnie 4 zjeby, może ktoś znajdzie więcej :D


#define TRUE FALSE
//Happy debugging suckers :D
adf88
  • Rejestracja:ponad 21 lat
  • Ostatnio:prawie 12 lat
0

@up: hehe niezłe. Najlepsza zjeba to dodanie "try..catch break" :D :D :D, przypomina wbijanie młotkiem przedmiotu do za małego pojemnika.
W ogóle genialne, mistrzostwo.

auto(ka)r napisał(a)

Ale Ty to niby w pracy widziałeś? :) To jest popularna sztuczka na zawodach typu 'napisz kod, który sprawi kompilatorowi (preprockowi i reszcie) najwięcej trudności' czytaj - parser będzie miał kłopoty z odszyfrowaniem intencji. Jeśli ktoś używa tego w kodzie produkcyjnym, to chyba musi znaleźć sobie inną formę pracy ;)
Nie. W tym konkursie chodzi o to aby człowiek miał trudności, a nie parser. Kod będzie poprawny składniowo - parser przeprasuje, nie będzie poprawny to nie przeprasuje. Parser nie bada intencji, czasy inteligentnych kompilatorów dopiero nadejdą.

1
Kopiuj
public void dodajKlucze()
    {
        if (listaKluczy == null)
            listaKluczy = new Hashtable<String, String>();
        listaKluczy.put("main", "main");
        listaKluczy.put("integer", "integer");
        listaKluczy.put("float", "float");
        listaKluczy.put("boolean", "boolean");
        listaKluczy.put("string", "string");
        listaKluczy.put("if", "if");
        listaKluczy.put("do", "do");
        listaKluczy.put("block", "block");
        listaKluczy.put("print", "print");
        listaKluczy.put("read", "read");
        listaKluczy.put("var", "var");
        listaKluczy.put("true", "true");
        listaKluczy.put("false", "false");
    }
    public void dodajInneOp()
    {
        if (listaInneOp == null)
            listaInneOp = new Hashtable<String, String>();
        listaInneOp.put("(", "(");
        listaInneOp.put(")", ")");
        listaInneOp.put("{", "{");
        listaInneOp.put("}", "}");
        listaInneOp.put(";", ";");
        listaInneOp.put(":", ":");
        listaInneOp.put(",", ",");
        listaInneOp.put("=", "=");
    }
    public void dodajOperatory()
    {
        if (listaRELOP == null)
            listaRELOP = new Hashtable<String, String>();
        listaRELOP.put(">", ">");
        listaRELOP.put("<", "<");
        listaRELOP.put(">=", ">=");
        listaRELOP.put("<=", "<=");
        listaRELOP.put("==", "==");
        listaRELOP.put("!=", "!=");
        if (listaADDOP == null)
            listaADDOP = new Hashtable<String, String>();
        listaADDOP.put("+", "+");
        listaADDOP.put("-", "-");
        listaADDOP.put("or", "or");
        if (listaMULTOP == null)
            listaMULTOP = new Hashtable<String, String>();
        listaMULTOP.put("*", "*");
        listaMULTOP.put("/", "/");
        listaMULTOP.put("and", "and");
    }
Manna5
Nazwy po polsku!?
adf88
  • Rejestracja:ponad 21 lat
  • Ostatnio:prawie 12 lat
0

Pewien nauczyciel programowania z "prof." przed nazwiskiem takie cuś w C naskrobał jako program wzorcowy do naśladowania.

Kopiuj
char *dspIP( int ip1, int ip2, int ip3, int ip4 )  /* display IP addresss */
{
   static char i_IP[50];

	sprintf( i_IP, "%u.%u.%u.%u", 
		ip1 < 0 ? (unsigned) ip1 + 256 : ip1,
		ip2 < 0 ? (unsigned) ip2 + 256 : ip2,
		ip3 < 0 ? (unsigned) ip3 + 256 : ip3,
		ip4 < 0 ? (unsigned) ip4 + 256 : ip4 );

	return i_IP;
}

// jedyne użycie dspIP:

printf("[-] My host id: 0%X, as an IP address: %s\n", v_hid, 
       dspIP( v_ip1, v_ip2, v_ip3, v_ip4 ) );
//...
  printf("    - IP address:    %s\n", dspIP(sock->sa_data[2], sock->sa_data[3], 
                                            sock->sa_data[4], sock->sa_data[5] ) );

Ten fragment nie jest wielkim WTF, ale cały kod wyglądający w ten sposób już tak.
http://pastebin.4programmers.net/257 Gdzie jest main() ? :>

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
1

rozbił sobie na 3 linijki :P

Kopiuj
main( argc,argv )
int argc;
char **argv;

:D


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
msm
Administrator
  • Rejestracja:prawie 16 lat
  • Ostatnio:4 miesiące
0

Ja osobiście doznałem szoku (szukałem wtedy tutoriala do directX - a) kiedy zobaczyłem spory kod (linijek nie podam bo...) napisany cały prawie że w JeDnEj LiniI 0.o. A właściwie to (kompilator przecież nie da rady ^^) z "enterami" wstawionymi w zupełnie losowych miejscach, bez żadnej konwencji, byle gdzie, no po prostu WTF. Uwierzcie, gdybyście mieli go poprawić, albo znaleźć brakujący nawias...

...Dlatego właśnie należy programy pisać czytelnie :)

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
1

@msm ale jaki w tym problem widzisz? Chocby Code::Blocks i magiczne "source code formatter" które przeformatuje ci cały kod tak jak ci się podoba + bracket matching i po problemie ;)


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
KR
Moderator
  • Rejestracja:prawie 21 lat
  • Ostatnio:2 miesiące
  • Postów:2964
3
Shalom napisał(a)

rozbił sobie na 3 linijki :P

Kopiuj
main( argc,argv )
int argc;
char **argv;

:D

Tu nie ma nic śmiesznego ani WTF. Normalny kod, prawidłowy zapis.
Ech, niektórzy młodzi programiści zapomnieli, że przed standaryzacją ANSI/ISO C miało inną składnię.
To jest po prostu bardzo stary kod i tyle.

hauleth
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:4 dni
0

gcc już tego nie przełknie :)


msm
Administrator
  • Rejestracja:prawie 16 lat
  • Ostatnio:4 miesiące
0

Jaki widzę problem? Mówiłem że szukałem tutoriala, a to coś było jako txt nas stronie internetowej. Ktoś kto to tam wrzucił powinien... <westchnięcie cierpiącego na brak weny autora> zresztą nieważne.
Edit: Po prostu zawsze miałem wrażenie że tutoriale powinny być czytelne :]
Edit 2: Tak w ogóle Shalom ciekawy obrazek, ciekawy jestem tylko czy wiesz skąd on pochodzi ^^

hauleth
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:4 dni
0

to jest Mangekyō Sharingan Kakashiego.


Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
1

widze że więcej fanów Naruto! ;)


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
Koziołek
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Stacktrace
  • Postów:6821
0

Dobra teraz dwa WTF z dzisiaj.

Słowo wstępu;
Generalnie to co pokażę to kod, który został przemigrowany automatycznie z COBOLa i LINCa na JEE. W tych językach taka konstrukcja ma sens, ale w Javie nie za koniecznie:

Kopiuj
while (errcd.fetchFrom()) {
	if (true) {
		break;
	}
}
Kopiuj
if (1 == 1) {
	return (0);
}
return 0;

Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException
edytowany 1x, ostatnio: Koziołek
0

Najpierw:

Kopiuj
Map map = new HashMap();
// teraz inicjalizacja mapy, wywolania put(key, value), wlozone 10 elementow
// i na koniec kwiatek
map.put("size", new Integer(10));

I pozniej w jakiejs klasie utility:

Kopiuj
public static int getSize(Map map) {
   return ((Integer) map.get("size")).intValue();
}

Kod pisany z pamieci, nie przeklejony, ale wygladalo to mniej wiecej wlasnie tak. :-O

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)