Programistyczne WTF jakie Was spotkały

Programistyczne WTF jakie Was spotkały
Marooned
Administrator
  • Rejestracja:ponad 22 lata
  • Ostatnio:dzień
  • Lokalizacja:Poznań
0
Kopiuj
  do if ($this->_getParam('foo') == 'bar') {
...
  } while (false);

WTF?!

opis: "umożliwia w ifie zrobienie break"
dla mnie to taka przypudrowana wersja GOTO


edytowany 1x, ostatnio: Marooned
no_solution_found
bo to jest przypudrowana wersja goto. Nie raz widziałem takie rozwiązania, jak ktoś bez goto poradzić sobie nie mógł :P
Marooned
Rzeczywiście, to samo. Ja bym tam dał po prostu wewnętrznego ifa i kolejne wcięcie. Robi to samo, a wygląda mniej zaskakująco.
MarekR22
zrobiłbym tak jak Marooned albo podzielił na funkcje i zamiast break użył return (zależnie od stopnia złożoności funkcji)
Wibowit
zamiast do if () { ... evil_break; ... } while (false); można zrobić function a() { ... evil_return ... } a(); i też będzie zakamuflowane goto. W Scali jest return, ale Scala spokojnie mogłaby sobie poradzić bez returnów - wynikiem funkcji jest i tak wartość ostatniego wyrażenia przed opuszczeniem funkcji. Zakładając brak return, break i continue od razu powinno być widać (tak mi się obecnie wydaje, ale nie zastanawiałem się długo) po wcięciach w kodzie jaka jest dokładnie struktura sterowania.
0

Metoda helpera operacji tekstowych z dosyć znanego frameworku:

Kopiuj
	public static function alternate()
	{
		static $i;

		if (func_num_args() === 0)
		{
			return '';
		}
		$args = func_get_args();
		return $args[$i++ % count($args)];
	}
Marooned
Administrator
  • Rejestracja:ponad 22 lata
  • Ostatnio:dzień
  • Lokalizacja:Poznań
0

Skorzystałem z WTF i wyszedł WTF:
http://screener.tk/f/o/f/RRU1n.jpg


msm
Wygląda na obrazek PNG... W formie tekstowej. (Na samym początku PNG IHDR dalej pewnie reszta).
Wibowit
Dokładnie tak jak pisze MSM.
Marooned
Tak, tak, to oczywiste, ale po prostu WTF inception - rekurencja ;-)
Azarien
najlepsze jest: "Bad WTF response"
TH
  • Rejestracja:prawie 13 lat
  • Ostatnio:około 7 lat
  • Postów:27
0

Rok temu w Gimnazjum jeszcze będąc na kółku informatycznym gdzie uczyłem się c++ pisałem chyba w Dev Cpp albo w Xcode (Mieliśmy też maki ) jakąś klasę , jakież było moje zdziwienie kiedy na 100 linijek kodu kompilator wywalił mi około 4000 błędów .

BS
  • Rejestracja:ponad 15 lat
  • Ostatnio:około 12 lat
1

Chyba najpotężniejszy WTF jaki mnie spotkał w JavaScripcie. Przy okazji smutne jest to, że wiele -- zbyt wiele... -- osób piszących w JavaScripcie może nie zobaczyć w tym natychmiast WTF-a.

Fragment dużego, potężnego, komercyjnego, drogiego frameworka od bardzo znanej firmy, której nazwy (ani nazwy produktu) miłosiernie nie wymienię. Firma ta ma na pewno również i dobrych programistów, ale mimo setek tysięcy linii kodu w JS, zdaje się im brakować dobrych JS-owców.

Kopiuj
namespace = {
    createFileUploadField: function(elem, allowFlash){
        return this.createFileUploadField(elem, allowFlash, false);
    },
   
    createFileUploadField: function(elem, allowFlash, enableFiltering){
      // logika dla wywołania z trzema argumentami
    }
};
namespace.makeFileUploadField(domEl, true);

Programista, prawdopodobnie Javowiec (nie żebym śmiał się z javowców -- po prostu back-end tego systemu jest napisany w Javie) najwyraźniej myślał, że JavaScript wspiera przeładowanie funkcji. Niestety, nie wspiera, a przynajmniej nie w ten sposób. W powyższym kodzie, druga deklaracja metody NADPISUJE tę pierwszą. Pierwsza przestaje istnieć.

Co więcej, gdyby używali trybu Strict, to parser natychmiast by im to zgłosił jako błąd. Niestety, nie używają.

Co śmieszno-tragiczne, ponieważ w swoim kodzie twórcy frameworka często korzystają z niesławnego operatora porównania z koercją typów (==) zamiast bezpiecznego operatora identyczności (===), lub używają po prostu testów if (enableFiltering), a brakujące argumenty są w JavaScripcie ustawiane na undefined, które ma wartość fałszywą, to faktycznie -- z ich punktu widzenia -- wszystko będzie najczęściej działało. Bo chcieli domyślnie mieć w tej zmiennej false, a otrzymują undefined, które też jest wartością fałszywą. Akurat `undefined != false', ale w teście z if-em już nie zobaczą tej różnicy.

Czyli: popełnili rażący błąd, ale ze względu na ogólną, niezbyt wysoką jakość kodu, inny fail może ten fail zrównoważyć. I oni myślą, że to działa. Minus i minus daje plus.

Zobacz pozostałe 3 komentarze
BS
Takich kwiatków nie jest tak wiele, jakbym chciał. Format zapisu literałów obiektowych jest w JS-ie super, to jedna z mocniejszych stron języka. Widać to po tym, jak dobrze przyjął się JSON, który jest niemal dokładnym podzbiorem owego formatu. Inna sprawa, że głupotą jest zakładanie, że w języku bez klas zapis ten działa jak... definicja klasy. Głupotą, lub przykrą koniecznością (czy aby na pewno?) jest w ogóle używanie JS-a tak, jakby był dużo gorszą wersją Javy (zresztą, Java jest dużo gorszą wersją JavaScriptu -- zależność chyba oczywista).
Koziołek
yyy... ostatniego zdania nie kumam. JS powstał w połowie lat 90. Java powstała na początku lat 90tych. Kto od kogo zżynał? Szczególnie biorąc pod uwagę, że JS od początku miało nazwę LiveScript, a JavaScript to wynik porozumienia biznesowego pomiędzy Sunem, a twórcami języka. Sun sponsorował badania w zamian za prawa do znaku towarowego JS.
BS
Nie chodzi o zżynanie. To są różne języki, mimo że JS próbuje czasem udawać Javę, co wychodzi mu tylko na złe, bo robi to żałośnie i maskuje swoje mocne strony. Chodzi o to, że widzę często kod Javowców (C-sharpowców etc.), którzy próbują pisać w JS jak w "swoim" języku, a potem narzekają, że JS jest cienki. Bo w tym akurat na pewno jest cienki! Żeby pisać w JS-ie wygodnie, trzeba go poznać i pisać po JS-owemu, a nie Javowemu. I odwrotnie: jakby JS-owiec wziął się za Javę i próbował pisać w niej jak w JS-ie, to by była tragedia. Taka sama tragedia jest w odwrotnej sytuacji.
hauleth
Dla tego nie używam JS'a tylko CoffeeScript.
BS
@winerfresh: "dlatego"? Czyli żeby pisać jak w Javie (bo o tym wspominaliśmy)? Szkoda, bo CS jest wciąż bardzo marną Javą. Kontroli typów Ci nie daje. Kontroli dostępu do pól też nie ułatwia, w szczególności nic nie robi z protected, a czy private da się tam zrobić używając semantyki class? Zdaje mi się, że konsekwentnie przeceniasz możliwości CoffeeScriptu. CS pomaga na stosunkowo niskim poziomie i w zasadzie nie wpływa na architekturę aplikacji. Nie powiedziałbym, że wprowadza jakieś wielkie rzeczy/paradygmaty do języka.
Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:około 6 godzin
1

Javowcy są po prostu przyzwyczajeni do kontroli typów przez kompilator (po co programista ma sobie tym zawracać non-stop głowę?), a nie do takich WTF-ów jak porównywanie wartości o zupełnie innych typach.


"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.
BS
  • Rejestracja:ponad 15 lat
  • Ostatnio:około 12 lat
0

@Wibowit:
Ci najwyraźniej nie są, bo używają operatora z koercją typów (==) zamiast operatora ściśle uwzględniającego typy (===). Tych fanów JS-a zgubiła raczej to, że myśleli, iż przeładowanie funkcji robi się tu podobnie jak w Javie.

Po zobaczeniu tego kodu, który jest już którymś kolejnym, zapowiedziałem zemstę na Javowcach. I na c-sharpowcach. I reszcie ferajny, co pisze w obcym dla siebie, zupełnie innym języku tak, jak w tym swoim, i najwyraźniej nie widzi w tym problemu. A jeśli już, to w owym nowym, dziwnym dla nich języku, a nie w swojej niekompetencji w tymże.

Będę pisał kod w Javie tak, jakbym wciąż pisał w JavaScripcie, se-se-se! Do tworzenia obiektów będę używał TYLKO refleksji. Jak mi się zachce, to na siłę zaimplementuję sobie dziedziczenie prototypowe, bo to klasyczne jest jakieś dziwne i wprowadza niepotrzebne byty zwane "klasami" (prościej jest, gdy obiekty dziedziczą po obiektach!). Aha: moje obiekty to będą po prostu HashMapy, bo "u mnie tak to się robi i po co mam się uczyć czego innego". Będę se tam ładował własności dowolnych typów i będę narzekał na kompilator, że próbuje mnie przed tym bronić... znaczy się: że utrudnia mi życie. Bo chce, żebym na siłę sobie zawracał głowę jakimiś tam typami.

I będzie to tak samo fajne i inteligentne, jak pisanie w JS-ie tak, jak w Javie ;) ;) ;)

edytowany 1x, ostatnio: bswierczynski
Wibowit
Prościej to jest sobie strzelić w stopę :P tak jak sobie strzelili programiści w twoim kodzie powyżej.
Azarien
problem z JS jest taki, że zrobili „przeładowanie funkcji” które chodzi jak kaczka, pływa jak kaczka, i kwacze jak kaczka - a nie zauważyli jeszcze, że sra jak hipopotam.
Wibowit
bingo! sztandarowy przykład, że duck typing jest evil :]
BS
@Azarien: piękne porównanie. Dodaję do słowniczka.
02
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 8 lat
  • Postów:1176
0

Dziś spędziłem godzinę na debugowanie błędu, którego nie było.

Sarrus
Ciesz się, że tylko godzinę ;)
0
0x200x20 napisał(a):

Dziś spędziłem godzinę na debugowanie błędu, którego nie było.

skad ja to znam ;)

somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:3 dni
  • Lokalizacja:Wrocław
0
0x200x20 napisał(a):

Dziś spędziłem godzinę na debugowanie błędu, którego nie było.

Sytuacja w poprzedniej robocie, jakieś niecałe 2 lata temu - zrobiłem stronę (jakieś 5 podstron) dla naszego głównego i prestiżowego klienta. PM (nasz) zgłasza mi buga, że na jednej z podstron tekst jest przesunięty w lewo w stosunku do innych. Ja patrzę - faktycznie tak się dzieje. Walczę z CSSami godzinę i nie daję sobie rady, idę do mądrzejszego kumpla. Walczymy obaj kolejną godzinę, ale on też nie ma pojęcia o co chodzi.
Wreszcie przychodzi do pracy drugi kolega, nasz firmowy master od CSS, pokazujemy mu, a on mówi: "No, ale przecież tu jest więcej tekstu, więc pojawia się pionowy scrollbar."
PM są głupi. ;P

edytowany 1x, ostatnio: somekind
Wibowit
Nie głupszy od ciebie jak widać :]
somekind
Oj tam, oj tam.
N4
ale pionowy scrollbar jest trudny do zauważenia, więc się nie dziwię.
Demonical Monk
  • Rejestracja:około 17 lat
  • Ostatnio:10 miesięcy
0

Rozjechana jak zawsze strona pomocy Google Adsense:

Kopiuj
<meta name="description" content="
.Table {
border:1px solid #CCCCCC;
padding:0;
margin:20px;
width:90%;
}
.Table th {
padding:10px;
text-align:left;
font-weight:bold;
background-color:#CCCCCC;
font-size:110%;
}
.Table tr:nth" />

Win.


Women were the reason I became a monk - and, ah, the reason I switched back...
szopenfx
  • Rejestracja:ponad 20 lat
  • Ostatnio:4 miesiące
0

no może nie programistyczne WTF, ale aż przetarłem oczy jak próbowałem znaleźć coś o wtyczce "tilt" do FF - przez przypadek znalazłem Easter Egg'a :P

Wibowit
do a barrel roll - nie wiem czy tylko w chrome działa
Sarrus
Stare i już nie działa, ale może ktoś nie widział: http://deser.pl/deser/1,83453,4907366.html.
hauleth
Wpisz "zerg rush"
KR
  • Rejestracja:prawie 16 lat
  • Ostatnio:5 miesięcy
  • Postów:2514
1

formularz z ochroną przed botami zakładającymi konta (usunąłem nieistotne fragmenty):

Kopiuj
<form action="login.html">
		<input type="text" name="username">
		<input type="password" name="password">

                teraz mistrzostwo:
		<input name="logincode" type="text"/>
		<img src="code.html?num=VHPJ" />
</form>

kod oczywiście generowany dynamicznie, ale chyba nie trzeba mówić co trzeba przepisać z obrazka :P


░█░█░█░█░█░█░█░█░█░█░█░
Demonical Monk
Klasyczny przypadek nubka, który nie kuma sposobu działania zabezpieczenia i celu jego implementacji, ale próbuje wepchać swoją radosną twórczość.
unikalna_nazwa
najlepsze w tym jest to że to zabezpieczenie w praktyce i tak prawdopodobnie będzie skuteczniejsze niż wszystkie gotowe bo wymaga dostosowania bota ;)
MarekR22
tyle, że jeśli serwis nabierze wartości i ktoś postanowi dostosować bota, to zajmie mu to 15 minut, zamiast paru miesięcy.
unikalna_nazwa
nikt nie marnuje paru miesięcy na dostosowanie bota; są firmy które zatrudniają ludzi do ręcznego przepisywania captchy
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:3 dni
  • Lokalizacja:Wrocław
1

M jak Microsoft to głąby, odcinek 152900.

Robię raport w Reporting Services, ogólnie to fajne i wygodne narzędzie, ale...
Wpisałem do DataSetu takie zapytanie:

Kopiuj
 
SELECT cośtam
FROM Tabela1 Tabela2 Tabela3 (joiny, szczegóły nieistotne)
WHERE Tabela1.UserId = @userId AND DATEPART(year, Tabela3.Date) = @year

Klikam Ok i... wyskoczył jakiś dziwny komunikat o niezdefiniowanych parametrach zapytania, a samo zapytanie się nie zapisało.

Myślę, że coś skopałem, więc piszę zapytanie w managerze bazy, odpalam - działa, więc kopiuję do RS, wklejam, Ok - i znowu dupa.
Próbuję jeszcze raz, klikam Ok - i zanim zamknąłem komunikat zauważyłem, że treść zapytania nie jest taka, jak wpisałem!
A mianowicie:

Kopiuj
 
SELECT cośtam
FROM Tabela1 Tabela2 Tabela3 (joiny, szczegóły nieistotne)
WHERE Tabela1.UserId = @userId AND DATEPART(Tabela2.Year, Tabela3.Date) = @year

Tak, Tabela2 ma kolumnę Year, i designer zamienił argument year funkcji datepart na nazwę tej kolumny. :|
Ich własny designer od ich własnych raportów w ich własnym dialekcie SQL nie ogarnia podstawowej składni ich funkcji. WTF?

0

@Override
public String getUsername() {
return email;
}

Caly kod jest pelen takich nazewniczych baboli. Np. DbAuthenticationProvider uzywa LDAPa jako zrodla danych o userach, a bazy dopierdo jako fallback, itp. itd. Rzygac mi sie chce jak widze takie cos. Najlepsze ze glowny architekt / programista na stole ma Clean Code Wuja Boba.

Koziołek
aż boję się zapytać co robi aplikacja...
Sarrus
Projektantowi pewnie chodzi o to, żeby tylko on tak na prawdę wiedział jak działa aplikacja ;P
CI
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 10 lat
0
mućka napisał(a):

@Override
public String getUsername() {
return email;
}

:)

mućka napisał(a):

Najlepsze ze glowny architekt / programista na stole ma Clean Code Wuja Boba.

Może stara się chłonąć wiedzę na odległość.


Wibowit
może to klon polaczka17?
wasiu
  • Rejestracja:prawie 21 lat
  • Ostatnio:6 miesięcy
  • Lokalizacja:Poznań
  • Postów:1552
1

Dzisiaj mialem ciekawy WTF. C#, lapany Exception, a nastepnie sprawdzany jego typ - po msg'u (porownywanie string'ow) i obsluga konkretnego przypadku.

Rozwalilo mnie to, bo string do porownania byl po angielsku... a na tym konkretnym systemie rzucilo message'a po polsku i szlag trafil cala obsluge bledu :P


Full Stack Developer .NET & Angular, Blazor
edytowany 1x, ostatnio: wasiu
RE
stringly typed code!
Sarrus
Obsługa błędu powinna być po typie wyjątku, a nie po message...
Wibowit
a jeśli wszystkie wyjątki mają typ DupaException, bo komuś nie chciało się robić podklas Exceptionów?
dzek69
Moderator
  • Rejestracja:ponad 18 lat
  • Ostatnio:dzień
  • Lokalizacja:Rzeszów
0

Może to nie jest WTF, bardziej atak złości, że COŚ jest nie tak, ale muszę się tym podzielić (tekst jest długi, ale to dobrze oddaje to, co przeżyłem).

Jest sobie stronka hostująca pliki. Bardzo mi się spodobała (dobre warunki, transfery itp), na tyle, że zachciało mi się mieć tam backupy i masę innych rzeczy. Niestety - webinterfejs mają strasznie dupny i korzystanie z tego jest katorgą. No to zachciało mi się napisać sobie do tego pseudo-API. Jako, że najlepiej znam PHP, w dodatku mogę to łatwo postawić na każdej maszynie - właśnie w tym to sobie napisałem. Po stronie serwera stronki stoi sobie ASP.NET. [I jeszcze dopisek - nie udostępniają żadnego API].

Jej autorzy od początku raczyli mnie cudami - zapisywanie zmiennych w różnych żądaniach ajax raz używając CamelCase, raz wszystko małymi, raz CamelCase tylko pierwsza literka małą. W jednym zapytaniu jedna zmienna w ogóle była z literówką. Zwrotka - czasem JSON ze statusem, komunikatami, kodem HTML, czasem tylko HTML. No masakra.
W końcu doszło do momentu napisania wysyłki plików. Przeparsowałem sobie formularzyk, wybrałem wszystkie ukryte zmienne, poskładałem to do kupy i robię pierwszą próbę wysłania pliku: Informacja, że wysyłanie nie jest aktualnie dostępne. I tu się zaczyna moja w sumie 5. godzinna zabawa.

Na początku pomyślałem, że to może "pominięte" zmienne z pustymi inputami typu file, które służyły jako szablon do kopiowania ich, żeby umożliwić wysyłanie większej ilości plików naraz. Nie pomyślałem w sumie, żeby spróbować je usunąć z przeglądarki i zobaczyć czy ruszy - zacząłem się zastanawiać jak do cholery wysłać żądanie imitujące pustego inputa z typem file przy pomocy PHP i cURLa - do teraz nie wiem. Wszelkie próby kończyły się tym, że żądanie w ogóle się nie wysyłało nie wyrzucając przy tym żadnego błędu. Z głupia spróbowałem w przeglądarce zatem "odkryć" ukryte pola, wrzucić pliki i zobaczyć, czy się wyśle. Wysłało się (o dziwo plik wrzucony tam także, ale to mniejsza). Potem nadeszły myśli, że serwer sprawdza kolejność zmiennych - poprzestawiałem (bo mój parser trochę inaczej je pozbierał). Wciąż nic. Teraz już było bardzo źle. Już straciłem na to dużo czasu i traciłem dalej kombinując, szukając sposobów i nic. Żeby jeszcze serwer zwracał o co mu chodzi to by było dobrze, ale nie. Zacząłem analizować działanie multipart/form-data i stwierdziłem, że przeglądarki wysyłają inputy po kolei jak w HTML są - plik + jego opis, plik + opis, a cURL może np. przerzuca pliki na sam koniec i dupa, po zabawie (ew. zostanie pisanie zapytań przez fopen i ręczna implementacja dobrodziejstw cURL). Głupie mi się to wydało, w końcu jakaś przeglądarka też mogłaby tak robić i co?.. Nie bardzo było mi to jak sprawdzić z kolei (zainstalowałem jakiś sniffer requestów http, ale nie działał tylko przy tym jednym requeście). Poddałem się. Chwila przerwy, myślenie, czy pisać do supportu - tylko tutaj mogę dostać bana (choć w regulaminie nie ma wzmianki o pisaniu botów do wspomagania uploadu i zarządzania kontem), albo zostać olany (i ew. oznaczony w bazie jako "niebezpieczny"), a z szansą 1% - otrzymać pomoc. Postanowiłem, że nie, że zrobię, bo całość piszę już trzeci dzień i szkoda się poddać. Zastanowiłem się nad trzema magicznymi polami: __EVENTTARGET, __EVENTARGUMENT, __VIEWSTATE. Teoretycznie na pierwszy rzut oka nic ciekawego się z nimi nie dzieje. Tj. EVENTTARGET na początku jest pusty, a jak przeglądarka wysyła żądanie zawiera nazwę buttona, ale stwierdziłem, że podstawię i będzie ok, no bo musi być ok. Ale poczytałem trochę do czego to służy, potem przyszła kolej na __VIEWSTATE - tutaj tekst był dłuższy, sprawdziłem sobie co zawiera, nawet zdekodowałem. W kodzie javascript nie znalazłem jednak wzmianki o tym polu. Dodatkowo pole tak jak zostało odebrane w HTMLu, tak samo było potem wysyłane. Tak samo sobie sprawdziłem action w formie - sprawdziłem gdzie przeglądarka wysłała żądanie w narzędziach deweloperskich i porównałem to sobie z tym co wyskoczyło jak zrobiłem echo na sparsowanym URLu. Identyczne.

Aż w końcu zdecydowałem się po raz kolejny zajrzeć w kod HTML formularza (pokaż źródło) i znowu oglądać to __VIEWSTATE i inne poukrywane zmienne. I rzucił mi się w oczy atrybut action formy. Aż zapomniałem jak się oddycha, a przed oczami widziałem już tylko &amp;, &amp;, &amp;, &amp;, &amp;... No więc nie zrobiłem url_decode pobierając wartość action, a wyświetlając to za pomocą echo przeglądarka przerabiała te ampy oczywiście. Tak samo Dragonfly/Firebug wyświetlając wartości atrybutów - dekoduje już wszelkie encje.

Podsumowanie i tl;dr:
Zmarnowane 5 godzin z powodu braku dekodowania encji w adresie URL.


Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:około 6 godzin
0

Szczypta WTF-ów z firmy gdzie obecnie pracuję:

  • hasła w bazie są niesolone, ba są nawet niehaszowane. Są szyfrowane, a składowana procedura deszyfrująca znajduje się w tej samej bazie.
  • warstwa utrwalania niepoprawnie korzysta z Hibernata - zamiast pozwolić Hibernatowi zarządzać budowaniem grafów obiektów, mapowanie obiektów jest 1:1 i w encjach Javowych w miejscu gdzie powinna być referencja (jak przy relacjach jeden-do-wielu czy wiele-do-wielu) jest postawiony stringowy id i trzeba sobie obiekt samemu dociągnąć (albo cały graf jeśli cały graf jest potrzebny),
  • żeby dodać metodę do webservicu trzeba napisać 3 klasy mające w sobie praktycznie to samo (1 hibernate, 1 webservice, 1 transportowa), 2 metody do przepychania danych, 1 mapowanie hibernata, 1 zestaw poleceń sql do tworzenia schematu w bazie i triggerów,
  • szef myśli że jest zajebisty, liczy się dla niego tylko tzw "komercyjne doświadczenie", tyle że akurat jemu pasowałoby płacić, żeby nie pisał kodu, niż odwrotnie,

"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.
Spine
w jakiej firmie pracujesz :D ?
Wibowit
heh, może akurat tu nie napiszę, bo jeszcze to znajdą i co wtedy? :-}
vpiotr
Plus bycia anonimowym
Marooned
Pytanie o nazwę firmy pod takim postem było infantylne.
Spine
@Marooned - ja bym to nazwał pytaniem tendencyjnym, albo nawet "retorycznym" - nie spodziewałem się odpowiedzi, bo Wibowit to raczej mądry człowiek i nie zdradzi nazwy firmy. Zwłaszcza, że w wielu firmach podpisuje się papierek o poufności :D
Johnny_Bit
  • Rejestracja:około 22 lata
  • Ostatnio:ponad 8 lat
  • Lokalizacja:Kielce
0

W firmie z którą miałem (a może i będę miał) przyjemność współpracy był sobie jeden pracownik, Tadzio. Tadzio był geniuszem uwielbianym przez przełożonych, a konkretniej rzecz biorąc był synem siostry prezesa. Tadzio był CTO. Tadzio lubił dużo pisac i programować. Tadzio dużo komentował kod który pisał.

A teraz powód wtf, czyli poprawianie po Tadziu (idealnie oddaje kod. W całości problemu chodzi o serwis w php napisany przez Tadzia i jego team - nie chodzi na jednym z hostingów):

Kopiuj
//To pisał Tadziu! Działa dobrze, nie psuć!
procedure TadziuShow($tresc){
echo $tresc;//Tu wypisuje treść, by Tadziu!
}
//To pisał Tadziu! Dizała!
procedure TadziuGet($tresc){
$tresc = $_GET[tresc]; //Tu pobiera tresc, działa, sprawdziłem - Tadziu
return $_GET['tresc'];//Tu zwraca tresc (hehe) działa, bo to Tadziu pisał!
}

Ciekawostka - takie coś to kilkadziesiąt plików. Jedyne co zmieniłem to imie bohatera... Poniżej główna przyczyna "nie chodzenia" na jednym hostingu:

Kopiuj
//Tadziu Sessions
<?php
session_start();//start sesji - powinno działać, ja tego nie pisałem to nie wiem - Tadziu

HAKGER - 50% Complete
edytowany 1x, ostatnio: Johnny_Bit
vpiotr
Amatorka połączona z zasiedzeniem - widziałem już coś takiego w pewnej firmie...
Marooned
Serio zmieniłeś tylko imię, komentarze są dokładnie takie jak przedstawiłeś? O mamo...
Johnny_Bit
@Marooned : 78 plików php, w każdym przynajmniej 100 linijek kodu, do tego tak przy przejrzeniu części plików 80% linijek ma styl komentarza włąśnie "działa bo sprawdziłem/napisałem to ja Tadziu" a to co nie działa to przedstawione powyżej - nie ja pisałem to nie wiem... Podobno inni w firmie są normalni, a to ze korzystają z "frameworka tadzia" to pic na wodę i tylko pokazują że mają w strukturze katalog z frameworkiem...
vpiotr
Tadziu powinien dostać medal za propagowanie humorystycznej strony programowania. Tylko w sumie nie wiem co przeważa - śmiech czy smutek - pewnie zależy ile się z tym frameworkiem ma do czynienia.
OT
  • Rejestracja:około 20 lat
  • Ostatnio:ponad 11 lat
0

Programiści .net i javy dziwią się że w C++ (natywnym) operacja 2/0 nie generuje wyjątku. To wft czy nie?

Zobacz pozostałe 3 komentarze
msm
Co za historie opowiadasz że nie powoduje błędu skoro powoduje...? Chyba że chodzi o 2/0.0 - w .Net i Javie też można.
OT
Chodzi o RZUCENIE WYJĄTKIEM a nie o to czy spowoduje błąd. Liczby int, nie double.
msm
Ok, pisałem zanim odpowiedziałeś vpiotrowi. Cóż, takie zachowanie to jest wtf... :>
OT
Wysokopoziomowcy... czy wszyscy są tacy?
msm
Niski poziom też trochę znam więc rozumiem skąd takie rozwiązanie... Ale skaza na moim umyśle od pisania w .NET jest najwyraźniej zbyt wielka :>.
0

Jak C++ ma rzucać wyjątkiem skoro chodzi o rzeczy obsługiwane w C poprzez sygnały? Przecież tak samo nieprawidłowe odwołania do pamięci kończą się SIGSEGV zamiast jakiegoś NullPointerException. Kłania się kompatybilność wsteczna i rozdzielenie problemów niskopoziomowych od wysokopoziomowych, tutaj nie ma WTF.

RE
są mechanizmy, które pozwalają na rzucenie wyjątku w takich sytuacjach
Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:około 6 godzin
0

rozdzielenie problemów niskopoziomowych od wysokopoziomowych

Czyli co, olewamy bezpieczeństwo i poprawność, a potem robimy globalnego handlera na sygnały, który będzie wywalał użytkownikowi na ryj, że "coś tam" się zesrało?

A porównywanie zakresów to też operacja niskopoziomowa?

http://en.wikipedia.org/wiki/X86_instruction_listings#Added_with_80186.2F80188 napisał(a)

BOUND Check array index against bounds raises software interrupt 5 if test fails

To jest taki WTF, że absolutnie nikt obecnie tej instrukcji nie używa.


"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.
edytowany 2x, ostatnio: Wibowit
Endrju
  • Rejestracja:około 22 lata
  • Ostatnio:ponad rok
0
Wibowit napisał(a):

rozdzielenie problemów niskopoziomowych od wysokopoziomowych

Czyli co, olewamy bezpieczeństwo i poprawność, a potem robimy globalnego handlera na sygnały, który będzie wywalał użytkownikowi na ryj, że "coś tam" się zesrało?

Nie. Jak chcesz mieć wyjątek, bezpieczeństwo i poprawność to sam to sobie zapewnij. Dodaj if, dodaj throw.


"(...) otherwise, the behavior is undefined".
edytowany 2x, ostatnio: Endrju
0

Jakoś programiści C potrafią sobie radzić bez "coś tam się zesrało". Poza tym to m. in. kwestia kompatybilności wstecznej z C. Co do bound to nikt tego nie używa z innej przyczyny, to instrukcja dla trybu 16-bit, indeks tablicy nie może przekroczyć 65535.

0

Wait, bound jednak obsługuje i 32-bit. Co nie zmienia faktu, że używanie przerwań w miejscu, gdzie wystarczy prosty if jest skrajnie niewydajne.

KR
Używanie przerwań w miejscu, gdzie prosty if wystarczy, jest czasami znacznie lepsze i wydajniejsze - patrz sprawdzanie, czy wskaźnik jest nullem. Podejrzewam, że nie używa się tej instrukcji bo jest skaszaniona podobnie jak np. enter i leave. Enter i leave na większości procków działają wolniej niż zrobione ręcznie.
Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:około 6 godzin
0

No, jak ktoś jest cierpliwy to nawet i w Brainfucku program napisze.

Potrafią sobie radzić? Na studiach w zasadzie jedynymi przedmiotami, które opierały się o C/ C++/ Pascala to różne semestry ASD. No i tam było od groma sygnałów (przy sprawdzaniu), które są mega topornym rozwiązaniem.

Dodaj if, dodaj throw.

No, w takim programie na ASD to chyba musiałbym wpisywać to throw co dwie linijki.

Co do bound to nikt tego nie używa z innej przyczyny, to instrukcja dla trybu 16-bit, indeks tablicy nie może przekroczyć 65535.

BOUND ma przecież wersję 32-bitową, a być może także i 64-bitową.

http://www.posix.nl/linuxassembly/nasmdochtml/nasmdoca.html napisał(a)

BOUND expects its second operand to point to an area of memory containing two signed values of the same size as its first operand (i.e. two words for the 16-bit form; two doublewords for the 32-bit form).

kwestia kompatybilności wstecznej z C

To jest moim zdaniem jedyny powód, żeby zostawić taką idiotyczną semantykę w C++.

Wait, bound jednak obsługuje i 32-bit. Co nie zmienia faktu, że używanie przerwań w miejscu, gdzie wystarczy prosty if jest skrajnie niewydajne.

BOUND służy do sprawdzania indeksów i generuje wyjątek, jak można się domyślić, tylko w sytuacji wyjątkowej. A więc generalnie przerwanie powinno być wywoływane sporadycznie. Mimo to i tak się tego badziewia nie używa, bo generuje przerwanie zamiast po prostu np ustawić jakąś flagę.

W procku 386 dodano instrukcję BSR, która liczy część całkowitą logarytmu o podstawie 2. Jakoś tutaj nie zrobiono już WTFa i nie inicjuje ona przerwania czy innego badziewia w przypadku liczenia logarytmu z zera, a zachowuje się lekko mniej WTFowo.

BSF searches for a set bit in its source (second) operand, starting from the bottom, and if it finds one, stores the index in its destination (first) operand. If no set bit is found, the contents of the destination operand are undefined.

BSR performs the same function, but searches from the top instead, so it finds the most significant set bit.

Gdyby to jakąś flagę ustawiało to już byłoby super.


"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.
edytowany 2x, ostatnio: Wibowit
vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
1
edytowany 1x, ostatnio: vpiotr
aurel
Cytując mojego mężczyznę: "C jest jak Minecraft. Chcesz czegoś użyć? To najpierw to sobie zrób!"
msm
Programiści C to samo mówią o asemblerze :>.
msm
Administrator
  • Rejestracja:prawie 16 lat
  • Ostatnio:4 miesiące
1

Kłania się kompatybilność wsteczna i rozdzielenie problemów niskopoziomowych od wysokopoziomowych, tutaj nie ma WTF.

Kompatybilność wsteczna to właśnie źródło połowy WTFów w C++ (reszta to osobista inwencja twórców)...

somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:3 dni
  • Lokalizacja:Wrocław
0
othello napisał(a):

Programiści .net i javy dziwią się że w C++ (natywnym) operacja 2/0 nie generuje wyjątku. To wft czy nie?

Jestem programistą .NET i jakoś mnie to nie dziwi. WTF?

OT
Aha, a ja usłyszałem "coś mi ściemniasz, kiedyś w mfc programowałem i tam były wyjątki, przecież w c++ są wyjątki, pamiętam że w mfc były tak jak w C#, w c++ 2/0 na pewno rzuca wyjątkiem bo tam tak samo wyjątki działają jak w C#, a w C to nie wiem bo ja tylko w C++ pisałem". To ten sam człowiek, co kiedyś w .net odszyfrowywał md5 (też tu o tym pisałem).
somekind
Po prostu nie gadaj z nim więcej. :D
OT
Teraz już nie reaguję na żadne rewelacje, które słyszę, po prostu puszczam mimo uszu i nie polemizuję, szkoda nerwów. Wszystko co nie dotyczy .net, a wychodzi od niego to podobne herezje :]
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)