Programistyczne WTF jakie Was spotkały

Programistyczne WTF jakie Was spotkały
szopenfx
  • Rejestracja:ponad 20 lat
  • Ostatnio:4 miesiące
0

odpowiedź jest prosta i niektórym znana - to tylko dostaniesz co napiszesz sam'a.

Marooned
Administrator
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 10 godzin
  • Lokalizacja:Poznań
5

Serwer nieco przymula. top pokazuje, że mysqld jedzie >100% CPU, hmm..

mysql> show full processlist;

Kopiuj
executing | select count(*) as xxx from yyy where zzz UNION SELECT BENCHMARK( 10000000000000000000000000, MD5(0))

W końcu mam namacalny dowód na istnienie liczby gazylion ;]


JK
ja je*ie, co to dokładnie miało zwrócić?
Marooned
Jak admin sprawdzi kto to odpalił, to spróbujemy się dowiedzieć ;-)
Shalom
To jest klasyczny przykład na to, że nie trzeba komuś dawać wcale wielkich uprawnień do bazy danych, zwykła mozliwość robienia selectów wystarczy żeby zabić bazę (a jakby tam jeszcze order by jakieś duże dał, żeby jeszcze po dysku zaczeło mielić :D)
Koziołek
Zacząłem się śmiać jak to przeczytałem... nie wiem tylko czy to wina przykładu czy też piwa... W każdym razie jak znajdziecie winnego to pochwal się co mu zrobiliście.
Marooned
Obawiam się, że ujdzie mu to na sucho. Obstawiam jakiegoś Pakistańczyka, a z nimi lepiej nie zadzierać ;-)
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około godziny
  • Lokalizacja:Wrocław
4

Ostatnio było o Getinie, to teraz dla odmiany o mBanku.
W polu wpisywania kwoty nie można używać strzałek ani delete. Zajebiście ułatwia to edycję kwoty, dzisiaj prawie zapłaciłem 157 tys czynszu za mieszkanie. ;)


Po dopracowaniu rozwiązania każdy będzie mógł założyć własny drzewiasty wątek.
Zobacz pozostałe 5 komentarzy
somekind
@Marooned, chodzi Ci o te tabelki w stylu połowy lat 90tych?
MarekR22
ten nowy system w mBanku ma parę fajnych wodotrysków, ale wnerwia mnie, że jak szukam niektórych prostych opcji i muszę sobie googlem pomagać. Nie rozumiem, czy tam komuś w tej firmie nie zaświeciła się lampka, że coś jest nie tak, że jest aż tyle pytań dotyczących podstawowych funkcjonalności.
Koziołek
@MarekR22, za 100mln można mieć w dupie funkcjonalność :D
MarekR22
ale zwykle okazuje się, że szukam tych opcji, mimo że wszystko jest na swoim miejscu, po prostu mam przyzwyczajenia, które nie pozwalają dostrzec pewnych rzeczy.
Marooned
@somekind - to strona banku - ma być prosta i czytelna, a nie wyglądać jak popis designera.
KR
  • Rejestracja:prawie 14 lat
  • Ostatnio:ponad 2 lata
  • Postów:353
2
Kopiuj
...
catch(...) {
    error = true;
} finally {
    if(error) {
        sysout(...);
    }
}

Autentyczny kod spotkany na projekcie :D Chyba VW ;p Hindusi sa the best :)

KR
Na siłę można się doszukać sensu, jeśli wewnątrz try gdzieś jest jakieś inne if (spaprało_się) error = true; No, ale ja bym wtedy po prostu rzucił wyjątek, a nie przekazywał przez flagę...
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około godziny
  • Lokalizacja:Wrocław
3

Moim zdaniem taka obsługa wyjątków jest ciekawsza:

Kopiuj
public Exception LoadData(...)
{
    SqlException exception;
    try 
    {
        // cośtam z bazą i innymi pierdołami
    }
    catch (SqlException ex)
    {
        exception = ex;
    }
    return exception;
}

I nie, nie Hindusi, 100% Anglicy.


Po dopracowaniu rozwiązania każdy będzie mógł założyć własny drzewiasty wątek.
Zobacz pozostałe 15 komentarzy
somekind
@several, z tego co wiem, to tak. I w sumie trudna sprawa, nie mam pojęcia jak automatycznie testować desktopa. Ale zawsze chyba można napisać testy chociażby do procedury składowanych. @Shalom, pewno fajna rzecz, u nas testerzy też takie zabawki sobie piszą.
several
@somekind znam ten produkt jako tako i mogę potwierdzić że to jest trudna sprawa. Dlatego ręce mi opadły gdy się dowiedziałem, że zatrudniają do tego studentów.
Koziołek
Przecież do klikania desktopu jest multum narzędzi chociażby FEST > https://code.google.com/p/fest/. O narzędziach typu HP Test Studio nie wspominam, bo to komercyjne rozwiązanie...
several
API for functional testing of Swing user interfaces do WinForms'ów raczej się nie nada. Ja też wątpię, że będą to pisać całkowicie od zera, ale trudność w tym produkcie polega na tym, że poprawność działania części modułów można zweryfikować obserwując co aktualnie odgrywa się na telewizorze.
Koziołek
no to to HPowe narzędzie :)
0

@Marooned
Ciekawe czy to był tylko DoS czy ktoś chciał po czasie wykonania wnioskować co się dzieje i jakieś blindSQLInjection.
Tak czy owak nice.

Marooned
Jeszcze nie wiem - jak coś nadającego się do napisania publicznie wyciągnę od admina, to wrzucę pod swoim postem - sam jestem ciekaw co to było.
DS
  • Rejestracja:ponad 12 lat
  • Ostatnio:prawie 11 lat
  • Postów:189
0

Potrzebuję wyciągnąć pewne dane z Bardzo Ważnej Rządowej Strony czy tam jakiejś agencji - nieważne, ważne, że w grę wchodzą publiczne pieniądze, więc portal kosztował zapewne chociaż te kilkaset tysięcy pln,a funkcjonalność... no cóż.

Można wyciągać rekordy pojedyńczo (zabezpieczone captcha), ale mi jest potrzebne kilka tysięcy, na szczęście jako że taki jest cel istnienia tej strony jest tam również opcja masowego eksportu (co ciekawe, tu captchy już nie ma), która jednak... nie działa. Napisałem maila w tej sprawie tydzień temu, do dzisiaj zero odzewu, jak nie działało, tak nie działa, a dane mi są potrzebne na ten tydzień.

Jako że szkoda mi trochę czasu na siedzenie i klikanie kilka godzin formularzy, postanowiłem sobie całość zautomatyzować, piszę właśnie scraper i doszedłem do tej ich captchy:

Kopiuj
<td style="padding:0;">
			<input type="text" size="10" name="token">
			<input value="90246" type="hidden" name="rand">
		</td>

Jak to zobaczyłem to przestało mnie dziwić, że coś tak skomplikowanego jak eksport do xls nie działa.

edytowany 1x, ostatnio: dsa
Koziołek
ale to wynika nie z głupoty ludzi, którzy to piszą lecz z kretynizmu samego procesu. Obecnie pałuje się już 5 miesięcy z projektem, który moglibyśmy zrobić w dwa. Jeden warunek - ktoś by nas posłuchał i by pozwolił zmienić kilka rzeczy na samym początku w architekturze.
Johnny_Bit
@Koziołek - a architekture robił architekt poważny czy jakiś rządowiec/marketingowiec co o wnętrznościach wie tyle że są? I pytanie: czy w projekcie wam cisną że to "powinno się dać tak jak jest, a odstępstw nie może być bo jesteśmy rozliczani za zgodność z głupotą a nie z funkcją"?
Koziołek
ale architekturę robi się często na zasadzie "widziałem takie coś u dostawcy na jakiejś imprezie". Odstępstw nie może być, bo wszystko łącznie z nazewnictwem pól jest zaszyte w EM i każda zmiana to kilka dni zabawy z podjęciem decyzji... no ale na szczęście byle do środy....
sprzedamsanki
  • Rejestracja:prawie 18 lat
  • Ostatnio:prawie 8 lat
  • Postów:278
4

Visual 2010, otwieranie Bardzo Dużej Solucji.

VS2010.png


The most exciting phrase to hear in science, the one that heralds new discoveries, is not 'Eureka!' (I found it!) but 'That's funny'
edytowany 1x, ostatnio: sprzedamsanki
Zobacz pozostały 1 komentarz
sprzedamsanki
Legalny, licencjonowany VS2010 Premium
Azarien
@hzmzp: zawsze jak zobaczysz soft to zakładasz że spiracony? poza tym takie pytania są po prostu niestosowne. pilnuj swojego.
hzmzp
@Azarien broń Boże spiracony, pytałem czy free czy trial, ale skoro płatny i takie niedopracowania to już przesada...
Azarien
nie wydaje mi się, żeby wersja darmowa miała specjalnie dodawane bugi, albo żeby w płatnej coś poprawiali a w darmowej nie...
hzmzp
oj nie takie cuda widziałem :D
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:20 minut
0

Jakiś średni projekt klienta SIPowego, repo git-a 2 miesiące temu zajmowało 700MB.
Parę dni temu robię fetch (przez VPN-a) i czekam... czekam... i nic.
Po zakończeniu fetch-a repozytorium ma 5.76 GB :| (ściągo się przez noc).


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
Zobacz pozostałe 23 komentarze
aurel
...a do czego służy commit pustego katalogu? :|
Shalom
To ze git nie commituje katalogów jest jeden z jego większych plusów. Ile razy svn mi się sypał ze względu na tree conflicts i jaja z katalogami bo w trakcie refaktoringu były jakieś rename ;]
somekind
O, i jeszcze moje ulubione: ''Command: Update<br /> Error: Previous operation has not finished; run 'cleanup' if it was interrupted<br /> Error: Please execute the 'Cleanup' command.<br /> Completed!:''
satirev
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 4 lata
4

Ciąg dalszy mojego posta w tym temacie z przed paru miechów. Kilka nowych wtf z roboty.

Kopiuj
 
Foo* foo = new Foo;
if (foo == NULL) {
  // ...
}
Kopiuj
while (m_isSthDone) {
  // ...
  if (!WriteReply(foo)) {
    break;
  }
  break;
}
Kopiuj
 doSth();
 usleep(1000); // wait for a while
 usleep(500); //  to be sure wait just a little bit more

Sporo programistów jest zdania, że tak zaimplementowany singleton jest thread safe:

Kopiuj
static T* Instance() 
{
  if (!m_pInstance) 
  {
    m_pInstance = new T;
  }   
  return m_pInstance;
}
Kopiuj
void Foo::bar(A* ptr)
{
  if (m_isB)
  {
     ((B*)ptr)->sth();
     if (((B*)ptr)->sth2()) 
     {
        ((B*)ptr)->sth3();
     }
  }
}
Kopiuj
bool Foo::bar()
{
  if (!m_sth->init())
  {
     goto error;
  }
  // ...
error:
  return false;
  return true;
}
Kopiuj
for (std::vector<T>::iterator it = sth.begin(); it != sth.end(); it++)
{
   sth.erase(it);
}
Kopiuj
bool Foo::bar()
{
#if 0
  // ...
#endif
  return true;
}
// ...
while (it != sth.end())
{
   if (it->bar())
   {
     // ...
   }
   it++;
}
msm
Foo* foo = new Foo; if (foo == NULL) { } Jak bardzo starożytny to kod? Bo w epoce kamienia to był poprawny sposób radzenia sobie z błędną alokacją (dzisiaj od tego jest std::bad_alloc) (ewentualnie ktoś kto to pisał mógł pochodzić z epoki kamienia). A goto error; i tak nie przebije goto fail; :P
satirev
Zależy od modułów, tym niemniej najstarsze wersje tego kodu pochodzą z ok 2008 roku. Jeśli chodzi o new to brakuje std::nothrow (ewidentnie jakiś javowiec/c#-wiec to pisał)
msm
Miałem na myśli że kiedyś niektóre kompilatory niezgodnie ze standardem (albo w pierwszych wersjach standardu było inaczej, nie jestem pewien) nie rzucały wyjątku - przykładowo VC6 was non-compliant by default in this regard. VC6's new returned 0 (or NULL). No ale skoro 2008 rok to na pewno nie to.
MarekR22
Przykładowo w Qt domyślnie wyjątki są wyłączone, więc pierwszy przykład nie jest aż tak błędny. To zusleep to już jest naprawdę zabawne.
1

Nie pytajcie gdzie to było.

void get_tomorrow_date( struct timeval *date )
{
sleep( 86400 ); // 60 * 60 * 24
gettimeofday( date, 0 );
}

Zobacz pozostały 1 komentarz
Olamagato
Widocznie autor nie miał pojęcia co to takiego zwijanie stałych... Ale odczekiwanie doby po to, żeby uzyskać jutrzejszą datę to jednak jest niezły fail :)
Azarien
ale ten kod nawet nie zwraca tego co obiecuje: jutrzejsza data jutro już nie jest jutrzejszą.
Wibowit
przy zmianie czasu między zimowym a letnim ten kod może dać zły wynik :P
Sarrus
A ja zapytam gdzie to było? Jeszcze nigdy nie widziałem potrzeby usypiania programu na dobę
dzek69
@Sarrus: złośliwi by powiedzieli, że ze źródeł androida :P
msm
Administrator
  • Rejestracja:prawie 16 lat
  • Ostatnio:4 miesiące
8

(uwaga, dość długie wtf fabularne)

No więc grepuje sobie spokojnie access log na 4p (bo okazało się że link wyświetlany każdemu anonimowemu prowadzi do 404, zapewne od co najmniej kilku miesięcy...).
Niby wszystko fajnie, tylko kodowanie trochę dziwne, i nie mogę za bardzo jakiegoś znanego mi kodowania dopasować:

Kopiuj
$ xxd -g 1 < fragment.txt
0000000: 2f 43 5f 69 5f 43 2b 2b 2f 31 36 35 34 39 34 2d  /C_i_C++/165494-
0000010: 57 65 6b 74 6f 72 5f 6f 62 69 65 6b 74 c3 83 c6  Wektor_obiekt...
0000020: 92 c3 82 c2 b3 77 5f 69 5f 73 70 72 79 74 6e 65  .....w_i_sprytne
0000030: 5f 77 73 6b 61 c3 83 e2 80 a6 c3 82 c2 ba 6e 69  _wska.........ni
0000040: 6b 69 20 22 2d 22 0a 20 20 20 31 20 2f 43 5f 69  ki "-".   1 /C_i
0000050: 5f 43 2b 2b 2f 31 36 35 34 39 34 2d 57 65 6b 74  _C++/165494-Wekt
0000060: 6f 72 5f 6f 62 69 65 6b 74 c3 83 c6 92 c3 86 e2  or_obiekt.......
0000070: 80 99 c3 83 e2 80 9a c3 82 c2 b3 77 5f 69 5f 73  ...........w_i_s
0000080: 70 72 79 74 6e 65 5f 77 73 6b 61 c3 83 c6 92 c3  prytne_wska.....
0000090: a2 e2 82 ac c2 a6 c3 83 e2 80 9a c3 82 c2 ba 6e  ...............n
00000a0: 69 6b 69 20 22 2d 22 0a 20 20 20 31 20 2f 43 5f  iki "-".   1 /C_
00000b0: 69 5f 43 2b 2b 2f 31 36 35 34 39 34 2d 57 65 6b  i_C++/165494-Wek
00000c0: 74 6f 72 5f 6f 62 69 65 6b 74 c3 83 c6 92 c3 86  tor_obiekt......
00000d0: e2 80 99 c3 83 e2 80 a0 c3 a2 e2 82 ac e2 84 a2  ................
00000e0: c3 83 c6 92 c3 a2 e2 82 ac c5 a1 c3 83 e2 80 9a  ................
00000f0: c3 82 c2 b3 77 5f 69 5f 73 70 72 79 74 6e 65 5f  ....w_i_sprytne_
0000100: 77 73 6b 61 c3 83 c6 92 c3 86 e2 80 99 c3 83 c2  wska............
0000110: a2 c3 a2 e2 80 9a c2 ac c3 82 c2 a6 c3 83 c6 92  ................
0000120: c3 a2 e2 82 ac c5 a1 c3 83 e2 80 9a c3 82 c2 ba  ................
0000130: 6e 69 6b 69 20 22 2d 22                          niki "-""

Co to za kodowanie w którym ó jest enkodowane jako C383C692C382C2B3 (pokazywane jako ó)?

Na pewno wygląda to na utf-8 i jest poprawną sekwencją utf8, więc logiczne byłoby dekodować jako utf-8, ale co dalej? Przeprowadziłem test:

Kopiuj
>>> for codec in codecs:
...     try:
...         result = "C383C692C382C2B3".decode("hex").decode("utf-8").encode(codec)
...         print codec, result
...     except:
...         pass
...
cp850  ǟ▒▒
cp858  ǟ▒▒
cp1252  ó
cp1254  ó
gb18030  ▒01060006
utf_32  ▒▒  ▒   ▒  ▒   ▒
utf_32_be     ▒  ▒   ▒   ▒
utf_32_le  ▒   ▒  ▒   ▒
utf_16  ▒▒▒ ▒▒ ▒
utf_16_be   ▒▒ ▒ ▒
utf_16_le  ▒ ▒▒ ▒
utf_7  +AMMBkgDCALM-
utf_8  ó
utf_8_sig  ó

Wszystko unicodowe można od razu odrzucić (skoro dekodujemy z unicode to po co do niego wracać), zostajemy z kilkoma opcjami z których prawidłowa okazuje się: cp1252 (o tym zaraz):

Kopiuj
>>> print ("C383C692C382C2B3"
...         .decode('hex')
...         .decode('utf8')
...         .encode('cp1252')
...         .encode('hex'))
c383c2b3

To co otrzymamy w ten sposób okazuje się... Znowu poprawnym utf-8. Więc dlaczego by nie powtórzyć cyklu?:

Kopiuj
>>> print ("C383C692C382C2B3"
...         .decode('hex')
...         .decode('utf8')
...         .encode('cp1252')
...         .decode('utf8')
...         .encode('cp1252'))
ó

Ok, czyli mamy nasze ó - zostało zapisane w utf-8, odczytane w cp1252 i znowu zapisane w utf-8...

Ale to jeszcze nic, bo kiedy spojrzeć dalej do pliku to drugie 'ó' zostało zakodowane jako C383C692C386E28099C383E2809AC382C2B3.
Jak mozna by się spodziewać, analogicznie do poprzedniego uzyskujemy

Kopiuj
>>> print ("C383C692C386E28099C383E2809AC382C2B3"
...         .decode('hex')
...         .decode('utf8')
...         .encode('cp1252')
...         .decode('utf8')
...         .encode('cp1252')
...         .decode('utf8')
...         .encode('cp1252'))
ó

Niestety, to nie koniec. W pliku jest jeszcze trzecie 'ó', kodowane jako C383C692C386E28099C383E280A0C3A2E282ACE284A2C383C692C3A2E282ACC5A1C383E2809AC382C2B3:

Kopiuj
>>> print ("C383C692C386E28099C383E280A0C3A2E282ACE284A2C383C692C3A2E282ACC5A1C383E2809AC382C2B3"
...         .decode('hex')
...         .decode('utf8')
...         .encode('cp1252')
...         .decode('utf8')
...         .encode('cp1252')
...         .decode('utf8')
...         .encode('cp1252')
...         .decode('utf8')
...         .encode('cp1252'))
ó

:|.

Obecny rekord wielkości (124 bajty) trzyma jedno z 'ę', kodowane 5 razy:

Kopiuj
>>> print ("C383C692C386E28099C383E280A0C3A2E282ACE284A2C383C692C382C2A2C383C2A2C3A2E282ACC5A1C382C2ACC383E280A6C382C2BEC383C692C386E28099C383E2809 AC382C2A2C383C692C382C2A2C383C2A2C3A2E282ACC5A1C382C2ACC383E280A6C382C2BEC383C692C3A2E282ACC5A1C383E2809AC382C2A2"
...         .decode('hex')
...         .decode('utf8')
...         .encode('cp1252')
...         .decode('utf8')
...         .encode('cp1252')
...         .decode('utf8')
...         .encode('cp1252')
...         .decode('utf-8')
...         .encode('cp1252')
...         .decode('utf-8')
...         .encode('cp1252'))
ę

Ale jako że zobaczyłem jakieś 0.0001 logów to nie dam głowy że gdzieś w nie czai się kilobajtowe 'ń' czy coś podobnego.

Przeraża mnie trochę ten plik :(

PS. wpisy nie podane chronologicznie tylko po posortowaniu, pewnie pochodzą z bardzo różnych okresów w historii 4p ;)

edytowany 5x, ostatnio: msm
Azarien
miało być „zaraz” o tym dlaczego akurat cp1252, a nie było.
msm
Dlatego cp1252 bo prowadzi do poprawnego wyniku :P. A z rzeczy bardziej konstruktywnych o których nie wspomniałem, cp1252 (nazwane latin1) - to domyślne kodowanie w mysql, jestem pewien że dlatego.
Azarien
ale cp1252 nie ma polskich liter (z wyjątkiem ó)
msm
Ogólnie to co się tam działo wiele wspólnego z kodowaniem nie ma. Tekst serwer zapisywał w utf-8, po czym był odczytany jako cp1252 (czyli każdy bajt utf-8 jako znak cp1252) i znowu zapisany w utf-8. W skrajnych przypadkach powtarzane kilka razy.
ShookTea
  • Rejestracja:około 12 lat
  • Ostatnio:prawie 6 lat
  • Lokalizacja:Wrocław
  • Postów:629
0

Niby nic wielkiego, ale dziwnie to wygląda.

Kopiuj
if (a == 0) {
 //kod
}
else {
 if (a == 1) {
  //kod
 }
 else {
  if (a == 2) {
   //kod
  }
  else {
   //itd.
  }
 }
}

Zobacz pozostałe 3 komentarze
n0name_l
Albo o tablicy...
ShookTea
Tego nie załapałem.
n0name_l
Bo nie mam pojecia co jest w // kod, a func moze dowolny kod trzymac.
AB
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 10 lat
  • Postów:464
2
Sarrus
Hmmm przy okazji zastanawiam się jak programują francuzi, ze swoim nastawieniem do angielskiego. Pewnie mają własne kompilatory z przetłumaczoną składnią :D
KR
hehe, ale w sumie leader/follower faktycznie lepiej oddaje istotę rzeczy niż master/slave :P
0
Marooned
Administrator
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 10 godzin
  • Lokalizacja:Poznań
2

Mozilla.....
właśnie dostałem maila

Marooned,
please post your results
thanks

to komentarz do buga https://bugzilla.mozilla.org/show_bug.cgi?id=491283
a bug w Firefox 11 z 2012


hzmzp
Kolejny archeolog się znalazł xD
KR
mnie się niedawno zdarzyło, że ktoś dopisał komentarz do buga, który zgłosiłem chyba w 2007 lub 2008 r.; kliknąłem w link i.. o zgrozo... okazało się, że bug jest nadal otwarty :D
Marooned
Tego w końcu zamknęli ;)
szalonyfacet
  • Rejestracja:ponad 12 lat
  • Ostatnio:9 miesięcy
  • Lokalizacja:Dąbrowa Górnicza
4

Myslalem, ze nigdy nie przyjdzie mi tu opublikowac postu, ale na nieszczescie sie mylilem:

Kiedys modne bylo robienie obrazkow w ASCII, to jest stopien wyzej, bo robi sie obrazki z wartosci w bazie danych :):)

906c1bf7f0.png

Wiecej nie zmiescilo sie na ekranie, z lewej idzie do jeden plus dane kazdego produktu.

Dzis zaczalem migarcje tego czegos z classic asp do c# .net i nawet jakos uzywanie emotek ( :) i :D ) w tym poscie mnie zlosci :(

DODANO NIEDLUGO POZNIEJ :D:D:D

Ten sam projekt, ale inna tabela ;(

392381f506.png

edytowany 2x, ostatnio: szalonyfacet
somekind
Genialne nazwy kolumn i projekt bazy. :D
szalonyfacet
czekam tylko az koles, ktory to zrobil otwarcie przyzna ze tym sposobem zapewnil sobie prace do emerytury...
fourfour
hehe.. nazwy kolumn przypominają mi jeden "zintegrowany system informatyczny", ale nie widziałem tam tylu nulli.. albo już nie pamiętam :)
0

porównania w stylu

Kopiuj
String.Compare(x, y) == 0

zamiast zwykłego

Kopiuj
x == y

w setkach miejsc w całej aplikacji :O

aha, aplikacja jednojęzyczna, a porównywane w ten sposób stringi to na przykład nazwy atrybutów w xmlu
ktoś był nadgorliwy?

Zobacz pozostały 1 komentarz
several
Jak dla mnie to nie żadne WTF.
somekind
@Shalom, to zależy od języka, w C# porównywana jest zawartość.
Marooned
&lt;code=csharp&gt; w poście
Azarien
to jest z jakiegoś powodu kontrowersyjny ficzer, brak jest konsensusu: C - referencje (char*), C++ - zawartość (string), Delphi/Pascal - zawartość, Java - referencje, C# - zawartość; jeśli ktoś jest nowy w danym języku, to zrozumiałe że woli „dla pewności” zastosować jakieś Compare, nawet jeśli łatwo jest sprawdzić działanie ==...
somekind
No czyli Java kontynuje czterdziestoletnią tradycję, a inne języki zachowują się normalnie. :P
bogdans
Moderator
  • Rejestracja:ponad 16 lat
  • Ostatnio:prawie 5 lat
7

Wiele lat temu zetknąłem się z programem magazynowym (Clipper, baza DBF), w którym nie było usuwania (anulowania) dokumentów, a dodatkowo był wymóg by data kolejnego wprowadzanego dokumentu była większa lub równa niż data poprzedniego dokumentu. Mój kontakt polegał na babraniu się w bebachach programu po tym jak magazynier (sprzedawca) podając datę dokumentu pomylił 3 lutego z 2 marca i zablokował możliwość wprowadzania dokumentów lutowych.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
PI
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 6 lat
  • Postów:61
0

WTF z cyklu forumowego

W index.php pewnego darmowego skryptu for jest fragment:

Kopiuj
 Dir.select<new.Selector>
// Tu 10cio linijkowy komentarz

class P();cfuck
{
..
}
satirev
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 4 lata
1

Tym razem zasłyszane "mądrości" od programistów C++:
Mądrość I - Każdy obiekt unii trzymany jest w L1.
Mądrość II - Po co używać std::set, jeśli istnieje coś takiego jak std::vector.
Mądrość III - Pomiędzy semaforem, a mutexem nie ma żadnej różnicy.
Mądrość IV - Pisanie funkcji w taki sposób

Kopiuj
template <typename T> 
bool foo(std::shared_ptr<T> ptr)
{
   if (!ptr)
     return false;
   
   //...
   return true;
}

zamiast w ten sposób

Kopiuj
template <typename T> 
bool foo(std::shared_ptr<T> ptr)
{
   if (ptr)
   {
      //...
      return true;
   }
   return false;
}

powoduje dodanie kilku instrukcji procesora więcej, ergo binarka nam puchnie.
Mądrość V - Najlepszym sposobem na race condition jest sleep z parametrem sprawdzonym empirycznie.
Mądrość VI - Można (a czasami nawet trzeba) rzucać wyjątki z destruktora.

Wibowit
L1? Chodzi o pamięć podręczną? To jest zalecenie czy gwarancja?
satirev
Wibowit, tak chodzi o pamięć podręczną. I nie jest to gwaranacja, czy zalecenie ale czysta głupota ;)
hzmzp
III ...nie no nie ma różnicy xD niby to samo robią :D IV dało by się jeszcze ze 2 ify dopisać :D V Taaa widziałem synchronizacje wątków sleepami, VI mądrości to w javie dajesz w bloki chronione każdą instrukcję, która potencjalnie z jakiegoś paranoicznego punktu widzenia może wysrać excepta
Wibowit
W Javie destruktorów się praktycznie nie pisze. Zresztą stricte destruktorów nie ma - jest metoda finalize() która jest wykonywana z opóźnieniem lub wcale.
vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
1

W ramach szukania klasycznego artykułu o programowaniu "How to shoot yourself in the foot" znalazłem dość ciekawą stronę podsumowującą cytat z Lema

Nie wiedziałem, że na świecie jest tylu idiotów, dopóki nie poznałem internetu.
-- Stanisław Lem

http://tinyurl.com/5838n3

Zobacz pozostałe 2 komentarze
vpiotr
Zgadza się, nie jest pewne, ale przyjęte. Cały internet przypiął mu już ten cytat i ciężko będzie udowodnić coś przeciwnego. Kolejny idiotyzm...
Marooned
Tak samo jak cały internet przyjął, że problem z cytatami w internecie jest taki, że ludzie w nie wierzą powiedziała Maria Skłodowska-Curie :P
vpiotr
A tak w ogóle Curie była kobietą! :P
ShookTea
  • Rejestracja:około 12 lat
  • Ostatnio:prawie 6 lat
  • Lokalizacja:Wrocław
  • Postów:629
0

Tak to jest, gdy się nie zna IDE... lub gdy autorzy IDE zamykają funkcje programu w "innych" nazwach.

Z wyjątkiem małych przerw w Eclipsie, większość kodu piszę w NetBeans. I do każdej zmiennej piszę settery/gettery. Ręcznie - bo przejrzałem pobieżnie menu refaktoryzacji i nie znalazłem niczego z "get" bądź "set" w nazwie. Przed chwilą odkryłem "Encapsulate Fields".


Zobacz pozostałe 41 komentarzy
spartanPAGE
Tutaj już czepiając się samego nazewnictwa - rule._aligment z zewnątrz wygląda dość... źle
n0name_l
Tak, nazewnictwo moglobyc zdecydowanie lepsze. :D
somekind
@winerfresh, modele to jakieś 50% wszystkich klas, więc ja nie wiem, czy to taki wyjątek. :) W encjach niby też nie powinno się robić geterów i seterów do każdej zmiennej, ale z drugiej strony trzeba brać pod uwagę ograniczenia ORMa. A pola publiczne to akurat zło, wszakże upubliczniać trzeba interfejsy, a nie implementacje.
ShookTea
Boże drogi, 40 powiadomień, tl;dr.
vpiotr
@n0name_l: rozumiem, że chcesz pokazać jak można obejść gettera, ale dla mnie taki kod trąci "docentem". Normalne, zrównoważone, wysokopoziomowe OOP to klasy z atrybutami (read-only lub getter/setter) i metodami. Interfejsy (brak atrybutów) i encje / struktury (tylko atrybuty) to techniczne wyjątki od reguły.
ShookTea
  • Rejestracja:około 12 lat
  • Ostatnio:prawie 6 lat
  • Lokalizacja:Wrocław
  • Postów:629
0

Tknęło mnie przerażenie.

Wystarczyło zastosować skrót myślowy - napisałem "do każdej zmiennej", bo było szybciej, ale mija się to z prawdą, chodziło bardziej o "do każdej zmiennej, jeśli jest to konieczne" - i już burza o tym, czy settery/gettery powinny być stosowane, czy nie. I był już taki temat, nie powtarzajcie się :)


Zobacz pozostały 1 komentarz
aurel
To jest WTF na temat programistów jako takich ;)
ShookTea
Martwię się tylko, czy powinienem być z tego dumny, czy raczej "osunąć się w cień"
somekind
Osunąć to się można raczej w przepaść.
vpiotr
No i potem wychodzi takie "będziesz żył w celi bracie". Gettery/settery do każdego pola, interfejs + proxy do każdej klasy... Bo ktoś nie doczytał wpisu (albo go nie napisał dokładnie).
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 godziny
2

Pewien płatny polski serwis nadaje hasła typu 123456 (ciekawe czy u wszystkich takie samo?) i nie widzę nigdzie opcji do zmiany.
Nazwy nie podam, bo jeszcze mi się ktoś włamie :D

szalonyfacet
nie wierze, podaj nazwe :D:D:D zaerejstruje sie i sprawdze :D:D:D
MI
MarekR22
pewnie jeszcze, gdzieś jest dostępna lista userów :). Ja bym to zgłosił do niebezpiecznik.pl, niech się tym zajmą.
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około godziny
  • Lokalizacja:Wrocław
1

Z cyklu najbardziej gówniany system kontroli wersji w akcji:
QPDyv7N.png


Po dopracowaniu rozwiązania każdy będzie mógł założyć własny drzewiasty wątek.
edytowany 1x, ostatnio: somekind
Zobacz pozostałe 21 komentarzy
Marooned
Generalnie tak, ale do tej pory w każdej firmie był wykorzystywany jako "podglądacz" do svn. Changesety, diffy, blame, szukanie, porównania.. sprawdza się bardzo dobrze.
somekind
Ok, rozumiem. Niestety sam tego nie zainstaluję, a w firmie z SVN trzeba korzystać, więc muszę korzystać z Tortoise, w którym jedno okienko ciągnie za sobą następne, i zanim otworzę wszystkie, które mi są potrzebne, to zapominam już, co chciałem zobaczyć. ;)
Marooned
Przykład: http://trac.edgewall.org/timeline | http://trac.edgewall.org/changeset/12947 | http://trac.edgewall.org/browser/branches/1.0-stable/tracopt/versioncontrol/svn/svn_fs.py?annotate=blame (tu mają jakąś inną wersję - w tych, co ja używałem kliknięcie rewizji w lewej kolumnie otwierało popupa z info o changesecie) | etc - czysto, szybko i zgrabnie
Sarrus
@Marooned jak duży jest zespół? Ja pracowałem przy pewnego rodzaju platformie i używany był do rozdzielania zadań na około 20 do 30 osób (podział na zespoły oczywiście był). W tym momencie trac przestawał dawać radę wg mnie. Co do podglądu kodu, to inne narzędzia też są równie dobre.
Marooned
Teraz mam mały, parę osób. Ale poprzedni (Wikia), to było kilkadziesiąt osób. Ale co to miałoby zmienić? Do traca zagląda się w konkretnym celu, nikt na nim nie siedzi non stop. Nie używaliśmy go jako trackera (choć też jest spoko, ale FogBugz bije go na głowę), tylko do podglądania zmian i diffów gdy była taka potrzeba. To zespół może i mieć 500 osób.
Koziołek
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Stacktrace
  • Postów:6821
0

Pewien projekt OS, którego kod przyszło mi dzisiaj przeglądać... bo test się zepsuł i trzeba spradzićz czy to nie nich

Kopiuj
try {
			Class<?> c = Class.forName("org.ujmp.core.io.ImportMatrix" + format.name());
			Method m = c.getMethod("fromFile", new Class<?>[] { File.class, Object[].class });
			Matrix matrix = (Matrix) m.invoke(null, file, parameters);
			return matrix;
		} catch (ClassNotFoundException e) {
			throw new MatrixException("format not supported: " + format, e);
		} catch (NoSuchMethodException e) {
			throw new MatrixException("format not supported: " + format, e);
		} catch (IllegalAccessException e) {
			throw new MatrixException("format not supported: " + format, e);
		} catch (InvocationTargetException e) {
			throw new MatrixException("could not import", e);
		}

a by nie było zmienna format to zwykły enum


Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException
edytowany 1x, ostatnio: Koziołek
Shalom
I jak byś to proponował przepisać? Mapa format->matrix? Przenieść tą logikę do enuma? Szczególnie że ja rozumiem że te klasy są dostępne dopiero w runtime z jakiegoś powodu skoro ktoś się tu refleksją bawi.
Koziołek
Klasy są dostępne out-of-box z paczki. Zamiast przenosić logike do enuma wykorzystałbym zwykłą EnumMapę względnie jak już bardzo by mnie to bolało, że trzeba ręcznie wpisywać klasy to połączył bym to ze zwyklym ServiceLookupem > Własne usługi w JSE i jakims prostym factory w tym miejscu
Shalom
Jeśli te klasy są dostepne na etapie kompilacji to faktycznie ktoś lekko popłynął :D
Koziołek
Nawet jak by nie byly to wtedy service loader i interfejs rozwsiązuje problem.
1

http://pastebin.com/ZgR1JXCg

podobno kod gry terraria (czyli dość popularnej)

Semen Korczaszko
No i już nie potrzeba obfuskacji...
Marooned
Moduł predykcji skoków mocno się spoci
spartanPAGE
To jest kod po dekompilacji; Na bank używali czegoś do obfuskacji, szczególnie, że ta sama grupa tworzy teraz prężnie rozwijający się projekt (w C++ i SDLu, tak swoją drogą), tj. starbound
Asmal
To wygląda jak niektóre moje programy :D Chociaż do takiej liczby linii nie doszedłem jeszcze XD
1
asdfvcxz napisał(a):

http://pastebin.com/ZgR1JXCg

podobno kod gry terraria (czyli dość popularnej)

kod pochodzi z dekompilatora - w rzeczywistości oczywiście nie ma tylu wcięć i kod jest pewnie trochę ładniejszy; pewnie coś w stylu:

Kopiuj
if (this.buffType[k] == BUFF_LAVA_IMMUNITY)
{
        this.lavaImmune = true;
        this.fireWalk = true;
}
else if (this.buffType[k] == BUFF_LIFE_REGEN)
        this.lifeRegen += 2;
else if (this.buffType[k] == BUFF_SPEED)
        this.moveSpeed += 0.25f;
else if (this.buffType[k] == BUFF_GILLS)
        this.gills = true;
else if (this.buffType[k] == BUFF_DEFENSE)
        this.statDefense += 8;
...

autor sam przyznaje że nie umiał zbytnio programować gdy się za nią zabierał a gra powstała z pasji

several
Jak dla mnie szacun dla gościa ;) Nie znając rzemiosła na wyższym poziomie stworzył coś co się nawet sprzedało i jest rozpoznawalne. My mu wytykamy brzydki/źle napisany kod siedząc schowani za biurkami, będąc anonimowi w korpo czekając na wypłatę. Nie żebym zachęcał do brzydkiego pisania, ale zawsze będę popierał pasjonatów, którzy potrafią dostarczyć produkt.
several
Oh stop it you...
2

Podczas próby kupienia biletu na pociąg pojawia się error: error.BNDS.D-BOOKING.TODO_ERROR

Nie to nie jest strona polskiego PKP.

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)