Programistyczne WTF jakie Was spotkały

Programistyczne WTF jakie Was spotkały
vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
7

Książka-WTF: "Perl One-Liners": https://www.nostarch.com/perloneliners

W darmowym dodatku jest np. sprawdzenie czy liczba jest pierwsza:

Kopiuj
perl -lne '(1x$_) !~ /^1?$|^(11+?)\1+$/ && print "$_ is prime"'
katelx
w tym wypadku warto by bylo przywrocic sredniowieczny zwyczaj palenia ksiazek :) ja rozumiem ze ciekawostki itp ale niektorzy biora to na serio i potem znajdujesz takie cos na produkcji i nie wiesz czy sie smiac czy plakac :(
vpiotr
@katelx: kiedyś ktoś napisał taki esej/poradnik "How to write unmaintable code". Był dla mnie całkiem zabawny dopóki nie trafiłem do miejsca gdzie go się literalnie wdraża punkt po punkcie...
katelx
@vpiotr takie to sprytne napisac kod w ktorym sama sie gubie... job saving policy :)
RE
Moderator
  • Rejestracja:około 18 lat
  • Ostatnio:11 miesięcy
9

Przeglądam wczoraj poprawki w STL w Visual Studio.
Jedna z nich:
* rename("test.txt", "test.txt") is required to be a no-op, but we were deleting the file

Zobacz pozostałe 9 komentarzy
Azarien
aa, ja sprawdzałem to rename() z <cstdio>. z <filesystem> rzeczywiście kasuje, ale nigdy tego nagłówka jeszcze chyba nie użyłem.
RE
ja też nie, ale to chyba kopia tej biblioteki z boosta (i razem z nią biblioteka system, czyli error_code - nadchodzi dualizm, albo wyjątki albo no_except i error_code&)
Azarien
sprawdziłem boosta i też pliku nie kasuje. zwykły fail ze strony MS.
RE
no kopia w sensie API, implementacje każdy robi swoją. no fail, przecież piszę od początku, że to błąd w STL, a nie booście
Azarien
to jest dobre: time_get::do_get_year() thought that the world will end in 2035
bolson
  • Rejestracja:około 15 lat
  • Ostatnio:2 dni
  • Lokalizacja:Zielona Góra/Poznań
7

Może nie taki WTF, ale wywołało uśmiech.. Przeglądając repo pewnego paskudnego kodu klienta ;)

user image

pylaochos
Przez ciebie się obsmarkałem :<
4

Co do poprzednika:
"Nowa praca nowe WTFy"

Bez tytułu.png

Zobacz pozostałe 20 komentarzy
niezdecydowany
niezdecydowany
"to co wy robicie to zacieranie ewolucji kodu, toku myślenia programisty (squash)"shsehsjhdzhsezse hehehe
Sarrus
Tok myślenia programisty bywa bardzo poplątany więc lepiej robić na tym squash. Commit co kilka linijek w projekcie rozwijanym latami? Dużo tych commitów by było. Nasza historia jest w porządku. A odnośnie rebase, to też nie rozumiem problemu. Wchodzi commit w momencie zaakceptowania. Niektóre feature'ry leżą miesiącami (!) zanim zostaną wprowadzone. Merge w takim wypadku nie ma sensu, bo drzewo wyglądało by strasznie, a informacja, że został rozpoczęty przed feature'em takim, a takim jest nikomu nie potrzebna.
Azarien
drzewo nie ma wyglądać ładnie, tylko reprezentować postęp prac. informacja, że został rozpoczęty przed feature'em takim, a takim - to jest właśnie bardziej potrzebne niż ładniutkie drzewko które do niczego nie służy.
Sarrus
Historia zmian wprowadzanych do kodu nie musi odzwierciedlać postępu prac. Od tego są aplikacje do zarządzania projektem.
somekind
Mój lokalny branch dla danego feature to mój brudnopis, w którym mogę sobie śmiecić, testować różne podejścia, pisać masę kodu, który ostatecznie może okazać się zbędny, albo wymagający refaktoryzacji. Naturalnym zachowaniem jest wówczas squash tego wszystkiego. W głównym repozytorium ma być historia projektu, a nie śmietnik z każdym pierdnięciem programisty.
LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:8 minut
  • Postów:8399
3

Zakończenie długiej funkcji (około 150 linijek, czym kilkadziesiat to komentarze, reszta to różne pętle oraz ify kończące się returnami).

Kopiuj
    // should be unreachable.
    throw new Error('wtf?')
}

Co zresztą nie dziwi, skoro funkcja wyglądała tak mniej więcej (trzykropki to ucięte przeze mnie fragmenty):

Kopiuj
Minimatch.prototype.matchOne = function (file, pattern, partial) {

    for (var fi = 0,
                 ....
        if (p === false) return false

        if (p === GLOBSTAR) {
            (...)
            if (pr === pl) {
                (...)
                return true
            }
            (...)
            while (fr < fl) {
                if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {
                    (...)
                    return true
                } else {
                    if (swallowee === '.' || swallowee === '..' ||
                        ....
                        break
                    }
                }
            }

            if (partial) {
                (...)
                if (fr === fl) return true
            }
            return false
        }
        (...)
        if (!hit) return false
    }

// jeszcze kilkadziesiat linijek podobnego pisania


https://github.com/isaacs/minimatch/blob/master/minimatch.js


vpiotr
Granica oddzieląca kod kompletnego amatora od zasiedziałego "seniora" który dba o posadę jest bardzo cieńka.
LukeJL
to akurat kod biblioteki open source, wiec nie wiem czy ktos tam dba o posade czy napisal dla przyjemnosci
LukeJL
sama biblioteka sprawdza czy nazwa pliku zgadza sie z podanym wzorcem (mozliwe wildcardy etc.) i jako tako dziala. Ale patrzac w jej kod, wole juz nie wnikac w to JAK dziala.
vpiotr
stąd już tylko krok do kwiatków w rodzaju "if (!p !== false)"
saviolaa
  • Rejestracja:ponad 9 lat
  • Ostatnio:3 miesiące
5

Mam nadzieję że na WTF to się nadaje ;)
aplikacja pisana w C++ i rozwijana od +- 8 lat

wtf.jpg

  • wtf.jpg (249 KB) - ściągnięć: 173
Zobacz pozostałe 6 komentarzy
Azarien
czy w tym kodzie jest choć jedno delete? ;-)
saviolaa
i tak przerwałem wczytywanie bazy żeby tylko sprawdzić wyniki fastmm, było by pewnie o wiele więcej tego :D wyszukiwałem po słowie delete to niby było troche, ale o wiele za mało i teraz musze szukać gdzie brakuje :(
Azarien
@saviolaa: może zamiast wyszukiwać gdzie brakuje, szukaj po new i przerabiaj na smartpointery albo nawet zmienne na stosie.
flowCRANE
W głowie się to nie mieści... Może ktoś czekał, aż C++ dorobi się GC i zmartwienia znikną? O.o
n0name_l
@furious programming Jako ciekawostka, do C++ jest GC, link: http://www.hboehm.info/gc/. Jako ciekawostka bo nigdy się nie bawiłem, ale być może to nawet działa.
Nomysz
  • Rejestracja:prawie 10 lat
  • Ostatnio:ponad 6 lat
  • Postów:60
0

Bardzo podstawowy problem z C++, kod nie wymaga komentarza. Rozwiązanie studenta informatyki powyżej 1-wszego roku :

Kopiuj
    cout << "Chce policzyc potege liczby 2 o wykladniku: ";
    cin >> potega;
    cout << endl;
    for (int i=0; i=potega; i++)
    {
        wynik[i] = 2^i;
        cout << "Dwa do potegi " << i << " wynosi: " << wynik[i] << endl;
    }
Zobacz pozostałe 2 komentarze
Sarrus
Skompiluje się. Wynikiem wyrażenia i=potega jest potega i jest to true dla potega != 0.
MA
dla potega != 0
Nomysz
Całkiem nieźle, jak na studenta już 3-ciego ;)
caer
Makes perfect sense /s
hauleth
W takich momentach cieszę się, że już nie muszę się bawić z C++ :)
CL
  • Rejestracja:około 10 lat
  • Ostatnio:ponad 9 lat
  • Postów:12
1

W nowej pracy zajmuje się testami jednostkowymi do gotowego już kodu.

wtf.png

Jak myślicie ile testów jednostkowych było trzeba napisać by przetestować każdy scenariusz z tej metody kontrolera? :|

  • wtf.png (1 KB) - ściągnięć: 335
LD
Sarrus
Co to konkurs jakiś? :P
somekind
To jak napisałeś już te testy, to teraz refaktoryzuj.
flowCRANE
Wyświetla Wam się ten obrazek? Bo mi jakoś nie chce;
Trebuh
@furious programming Działa jak należy (w nowej karcie również).
n0name_l
@cleanthinks W sensie zamiast to przepisać (wyrzucić logikę z kontrolera, dodać sensowne klasy, zastosować SRP, etc.) i później z łatwością napisać testy, najpierw męczyłeś się z napisaniem testow? Sprytne podejście. :-D
CL
Moje uprawnienia kończą się na napisaniu testów do istniejącego kodu. Wiecie student na pierwszych praktykach w JanuszSoftcie ma się uczyć od "doświadczonych" kolegów tworzących takie potworki bez znajomości wzorców ;|
somekind
To akurat nie jest złe podejście, ja bym się bał sprzątać kod nie mając wcześniej testów.
several
  • Rejestracja:ponad 15 lat
  • Ostatnio:2 minuty
5

@cleanthinks 120 wierszy? Co Ty wiesz o życiu...

dcba7a4bff.png


edytowany 1x, ostatnio: several
szopenfx
chyba ni chu hu bo nie jaże c+plask ale jak jest do d**y to propsy dla delphiarzy ;)
msm
Nie ma mnie już w pracy, też poszukałbym ciekawszych fragmentów.
Demonical Monk
  • Rejestracja:około 17 lat
  • Ostatnio:10 miesięcy
5

Sytuacja:

Serwis oparty o Wordpress (ktoś kto wymyślił ten szajs powinien zostać zgładzony).

Problem:

Jeżeli wejdziemy na jedną z podstron, przeglądarka nieustannie przeładowuje stronę po załadowaniu wszystkiego. Dotyczy to tylko jednej podstrony, które nie jest jakaś szczególna.

Debugowanie part 1:

Zainstalowany jest sam-ads-manager, taki żałosny plugin do żałosnego Wordpressa. Z tego co kojarzę autor tego cuda swego czasu zrobił w pluginie SQL injection by design, bo fajne zastosowanie, cool i dżezi. Przejdźmy do konkretów. Problem jest z tym kodem:

Kopiuj
// $ head sam-layout.min.js
(function($) {
  $(document).ready(function() {
    var hits = [], doStats = ('string' == typeof samAjax.doStats) ? Number(samAjax.doStats) : samAjax.doStats;
    if(samAjax.mailer) { $.post(samAjax.ajaxurl, {action: 'sam_maintenance'}); }

Po wykonaniu ostatniej linijki z załączonej wklejki strona zaczyna się reloadować. Nie ma przecież podpiętego żadnego callbacka, niczego. Wykomentowałem tę linijkę, działa.

Debugowanie part 2:

No ale czemu działa? Wkleiłem do REPLa JS:

Kopiuj
$.post(samAjax.ajaxurl, {action: 'sam_maintenance'});

Odświeżyło się. Wkleiłem to:

Kopiuj
$.get('.');

Też się odświeżyło. Debugger JS nic nie łapie, tak po prostu kończy się wykonywanie komendy z REPLa, jQuery obsługuje callbacki (których nie ma, więc nic się nie dzieje). Bum - skrypt się skończył, reload z kosmosu.

Debugowanie part 3:

Okazuje się, że ta podstrona była kiedyś landing page zachęcającym do czegoś tam. Miałeś zapisać się do newslettera, wtedy dopiero treść podstrony była pokazywana. Patrzcie jak oni to realizowali:

Kopiuj
jQuery("#form-newsletter").ajaxComplete(function() {
   expiry = new Date();
   expiry.setTime(expiry.getTime()+(10*60*1000));
   document.cookie = "has_newsletter=yes; expires=" + expiry.toGMTString();
   location.reload();
});

Czyli tak:

  1. Backend był zainteresowany wyłącznie tym, czy masz ciasteczko "has_newsletter = yes". Masz? To dostajesz dostęp do contentu. Jeszcze żeby chociaż było ustawiane po stronie serwera...
  2. Event jQuery ajaxComplete jest zdarzeniem GLOBALNYM i ma w dupie ten selector #form-newsletter. Zresztą jak by to miało działać? Ukończenie żądania AJAX w obrębie elementu DOM? Programista jest kolejną ofiarą dopalaczy?
  3. Ten kod JS zawierający location.reload podpinał się wyłącznie na podstronie downloadu, bo wordpress ma "dynamiczne" składanie JSów, tylko zazwyczaj wszystko jest minifikowane, oczywiście w jakiś żałosny sposób, więc oryginalnych JSów musisz zwykle szukać w repo u producenta, które nie zawsze istnieje.
  4. Co zabawne, ten element #form-newsletter już nawet nie istnieje, bo podstrona została przerobiona, został tylko ten JS schowany gdzieś tam.

"Programista" który to robił wziął za to kilkanaście tysięcy. Podobne akty partactwa w tym projekcie debuguję od jakiegoś roku.

Szkoda słów.


Women were the reason I became a monk - and, ah, the reason I switched back...
edytowany 3x, ostatnio: Demonical Monk
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:około godziny
1

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
Demonical Monk
  • Rejestracja:około 17 lat
  • Ostatnio:10 miesięcy
7

Debugowanie Wordpressa part 324832498324892349832. Zrobiłem update, po jakimś czasie informacja o tym, że NIC w panelu admina nie działa.

(1) Próbuję coś zrobić - zapisano pomyślnie, nie zmieniło się.
(2) Model woła $wpdb->update, wywołanie kończy się powodzeniem i tyle, system rzuca że zapisano pomyślnie.
(3) Wywołanie $wpdb->update zwraca false, $wpdb->last_error jest ustawione na '', czyli jest błąd, domyśl się jaki.
(4) Szybkie spojrzenie do repozytorium, tak, jakiś mistrz coś zmieniał w wpdb: https://github.com/WordPress/WordPress/commit/6759a210caa0d85fc8513c4c77e188a58371b92b
(5) Wszystko w systemie leci jako UTF-8, w bazie danych mamy ustawiony wszędzie latin2. WTF?????????????

Powód faila #1: autor tych tabel i zapytań przechowuje UTF-8 w kolumnach latin2, gratuluję.
Powód faila #2: core team Wordpressa wreszcie zaczął walidować takie przypadki.

WTFem nie jest dla mnie sam fakt przechowywania latin2 w UTF-8, każdy się może pomylić. Ale że jakaś funkcja zwraca WP_Error (zwraca, nie rzuca), potem inna funkcja na podstawie tego zwraca false, żeby jeszcze kolejna funkcja zwróciła userowi false bez informowania o czymkolwiek? Kto to projektował?????????????????????

Nienawidzę Wordpressa.


Women were the reason I became a monk - and, ah, the reason I switched back...
OK
  • Rejestracja:około 14 lat
  • Ostatnio:ponad 4 lata
  • Postów:50
0

Nie wiem czy się nadaje, ale spróbuję. Wchodzę na filmweb na stronę jakiegoś filmu ocenionego przeze mnie. Wszystkie gwiazdki mieszczą się w jednej linii. przybliżam ekran (ctrl + scroll up). Nagle jedna przechodzi do następnej linii. Przybliżam znowu. Znowu mieszczą się w jednej. Przybliżam jeszcze 2 razy. Znowu to samo. nie do wyjaśnienia dla mnie (<muzyka z="z" archiwum-x="archiwum-x">)

http://imgur.com/Fr7pTix,H24rGN2,6bJ0cUm#0

A to tylko jeden z wielu błędów na bugwebie...

dzek69
To raczej spodziewane (!= pożądane) zachowanie, można by się było postarać, żeby się tak nie działo, ale jak skalowaniem wprowadzasz ułamkowe wartości to się gubi.
Demonical Monk
  • Rejestracja:około 17 lat
  • Ostatnio:10 miesięcy
8

Wstaję rano i nagle popsuty ficzer zaczął działać.

what.png

(zamazałem znaki szczególne projektu, bo to closed source stuff)


Women were the reason I became a monk - and, ah, the reason I switched back...
edytowany 1x, ostatnio: Demonical Monk
abrakadaber
abrakadaber
znaczy, że ten komment to był opis błędu??? I nikt nie wiedział dlaczego????????? (pytajniki specjalnie)
Koziołek
Może jakaś zaszłość, że w środy miałeś coś ekstra i trzeba było koniecznie włączyć....
Demonical Monk
@abrakadaber: dzisiaj to znalazłem ;) ta klasa ma parę tysięcy linijek i jest copy pastnięta do 8 innych klas
Tumeg
no, niezły wtf - mysql
Demonical Monk
  • Rejestracja:około 17 lat
  • Ostatnio:10 miesięcy
5

Klasa generująca paginator:

Kopiuj
	public function Make($smartRange = false) {
		if ($this->actualPage <= 0) 
			$this->actualPage = $this->GetProbablyActualPage();

		$this->totalPages = (int) ceil($this->totalRecords / $this->RecordsPerPage);
		if ($this->actualPage > $this->totalPages)
			$this->actualPage = $this->totalPages;

		$this->totalNavPages = (int) ceil($this->totalPages / $this->pagesPerNav);
		$this->actualNavPages = (int) ceil($this->actualPage / $this->pagesPerNav);
		$this->indexRecordStart = ($this->actualPage - 1) * $this->RecordsPerPage;
		if ($this->indexRecordStart < 0)
			$this->indexRecordStart = 0;
		$this->indexRecordEnd = $this->indexRecordStart + $this->RecordsPerPage - 1;
		if ($this->indexRecordEnd + 1  > $this->totalRecords)
			$this->indexRecordEnd = $this->totalRecords - 1;
		if ($this->indexRecordEnd < 0)
			$this->indexRecordEnd = 0;

		if (!$smartRange){	
			$this->indexPageStart = ($this->actualNavPages - 1) * $this->pagesPerNav + 1;
			$this->indexPageEnd = $this->actualNavPages * $this->pagesPerNav;
			if ($this->totalPages < $this->indexPageEnd)
				$this->indexPageEnd = $this->totalPages;
		} else {
			$halfPagesOnNav = (int) ($this->pagesPerNav / 2);
			$this->indexPageStart = $this->actualPage - $halfPagesOnNav;
			$rest = 0;
			if ($this->indexPageStart < 1) {
				$rest = abs($this->indexPageStart) + 1;
				$this->indexPageStart = 1;
			}
			$this->indexPageEnd = $this->actualPage + $halfPagesOnNav + $rest;
			if ($this->indexPageEnd > $this->totalPages){
				$this->indexPageStart -= ($this->indexPageEnd - $this->totalPages);
				if ($this->indexPageStart < 1) $this->indexPageStart = 1;
				$this->indexPageEnd = $this->totalPages;
			}
		}

I tak przez 1k linijek. W TODO jest wywalenie tego i zastąpienie czymś 30-50 LOC, jakby płacili nam określoną stawkę za linijkę to po każdym commicie byłby ujemny rachunek...


Women were the reason I became a monk - and, ah, the reason I switched back...
Zobacz pozostałe 6 komentarzy
niezdecydowany
niezdecydowany
co to .. jak to .. kto to... czemu o0
niezdecydowany
niezdecydowany
od dzisiaj przestaje narzekać na swoje formatki :D
Demonical Monk
Ale to nawet fajne było, przez pierwsze pół roku łataliśmy luki bezpieczeństwa (przynajmniej te w miarę możliwe do wykrycia), w wigilię siedziałem całą noc z sqlmapem i wyglądało to jak wykonywanie odwiertów w asfalcie co dwa metry, żeby przekonać się, że dwa metry dalej też jest popękany. Zdobyliśmy sporo doświadczenia z zakresu cudotwórstwa - metodyka: połataj na szybko tak, żeby było w miarę bezpiecznie, względnie utrzymywalne i cała procedura nie zajęła sto lat. Za jakiś czas chyba opublikuję repo z toolkitem który powstał do tego celu, trochę tego jest.
niezdecydowany
niezdecydowany
historie zmagań z tym tworem wyglądają mi na materiał na #mikroblogi :D
Demonical Monk
Napiszę kiedyś zbiorowy artykuł o tym co przeżyliśmy pracując przy tym systemie i co z tego wyszło koniec końców. Finansowo nie narzekam. To jedyna pozytywna rzecz w tym projekcie.
0
Kopiuj
 
def max_payment = payment.getDepozyt_price() + payment.getOdsetek_price()

                if(paymentList.size() == 1){
                    payment.full_to_widtraw += price
                }else{
                    def asdf
                    if(payment.full_to_widtraw == 0){
                        asdf = price - payment.full_to_widtraw
                        price = price - max_payment
                        payment.full_to_widtraw = max_payment
                    }else {
                        asdf = max_payment - payment.full_to_widtraw
                        price = price - asdf;
                        payment.full_to_widtraw += asdf
                    }
                }
Zobacz pozostałe 2 komentarze
niezdecydowany
niezdecydowany
zresztą te nazwy bym jeszcze przeżył, ale kurna... powtarzanie i to takie ohydne w tym if-elsie
Koziołek
co ci się powtarza?
niezdecydowany
niezdecydowany
noo.. to co jest w if'ie i else'ie - przecież to powinny być osobne metody, Sandi Metz raczej op@!#lia by autora.
Koziołek
A w ten sposób.
Koziołek
za późno już jest.
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około godziny
  • Lokalizacja:Laska, z Polski
  • Postów:10047
7
Kopiuj
int countLengthOfWord(string name)
{
    int length = name.length();
    return length;
}
Zobacz pozostałe 29 komentarzy
dzek69
@Afish - czyli gdyby funkcja nie była aliasem to by miała sens, ale to w zasadzie rozwinięcie tego, co zaznaczone było wyżej. @n0name_l: osobiście rzadko mam styczność z językami kompilowanymi, w sumie słuszna uwaga, ale wciąż istnieją inne wady (obcy widząc kod używający aliasu musi sprawdzić, co on robi, zamiast od razu widzieć to w czytelnej formie), no i to jednak zła praktyka. Mamy programować używając złych praktyk, bo "kompilator naprawi"? ;)
n0name_l
Ale ja nie mówię, że to powyżej jest ok. Mówie tylko, że stwierdzenie, że będzie wolniej jest błędne.
AF
@twonek Nie żadne YAGNI, tylko umiejętność przewidywania. Jak mam silne przeczucie, że to się niedługo zmieni, to lepiej od razu się ubezpieczyć, niż potem poprawiać w wielu miejscach, w których ma być użyty dokładnie ten sam kawałek logiki (co jest poniekąd podobne do zasady, że każda informacja powinna mieć w systemie dokładnie jedną reprezentację). @dzek69 Teraz jest aliasem, ale za tydzień już może nie być.
Koziołek
to miało by sens chyba tylko gdyby było sprawdzanie czy argument nie jest null i zwracanie np. -1/rzucanie czymś ludzkim, a nie NPE.
Sarrus
A czy ktoś zauważył, że to wcale nie liczy długości słowa, a na parametrze przyjmuje name? Kolejna sprawa to kto pisze takie nazwy funkcji, jak wystarczyło by wordLength - krótsze jakby. To będzie więcej niż jeden WTF ;)
katelx
  • Rejestracja:prawie 10 lat
  • Ostatnio:4 miesiące
  • Lokalizacja:Hong Kong
3

kawalka kodu nie bedzie, a jedynie opis tego co zaobserwowalam. ciekawa jestem czy ktos z was sie z tym spotkal, jak dla mnie niezly wtf
zdarzylo mi sie to 2 razy jak robilam zakupy w ikei, maja tam przy kasie cos w rodzaju peceta + aplikacje napisana w winformsach do skomponowania faktury z rzeczy zakupionych przez klienta i przy dodaniu kazdej pozycji musza na 2 dialogach z trescia 'unhandled exception (...)' nacisnac OK. z tego co zauwazylam traktuja to jak normalny element procedury tworzenia rachunku... :)

Zobacz pozostałe 10 komentarzy
niezdecydowany
niezdecydowany
@Shalom w okolicy nie ma lepszych pracodawców - a nie specjalnie widzi mi się wyjazd do innego miasta(te zakichane studia muszę kiedyś skończyć) - bo jestem cebulakiem-wieśniakiem i nie lubię zmian :D
Shalom
@msm lepiej tak jak @deus przeglądać internet hexedytorem ;)
niezdecydowany
niezdecydowany
@Shalom hexedytorem ? i cały urok fejsa i przeglądania porąbanych zdjęć znika :/
Shalom
Bo musisz dekodować w locie w głowie :P
niezdecydowany
niezdecydowany
ludzie bez wyższego nie umieją robić taki rzeczy :/ zostaje mi fajerfoks
Demonical Monk
  • Rejestracja:około 17 lat
  • Ostatnio:10 miesięcy
0

https://e-nadawca.poczta-polska.pl/download/en_opis_webapi.pdf

Wiedzieliście w ogóle do tej pory że da się zarejestrować przesyłkę pocztową i przyjść na pocztę z zarejestrowaną? :O

Ale nie zbaczam z tematu, obejrzyjcie PDF.


Women were the reason I became a monk - and, ah, the reason I switched back...
edytowany 2x, ostatnio: Demonical Monk
no_solution_found
ich dokumentacja oraz API jest czymś przy czym płakałem jak pracowałem. Naprawili już testowy walidator plików XML? Ja miałem taką sytuację, że napisałem eksport przesyłek do XML wg ich dokumentacji, wrzucam do testowego walidatora i nie działa. A powinno. Po konsutltacją z kimś od nich powiedziali, abym przetestował "na produkcji". Tam też nie działało (ale mniej). Okazało się, że musiałem jeszcze coś zmienić, gdyż... dokumentacja nie była aktualna :) i że "wkrótce" to naprawią.
Koziołek
Dawno już... nawet są popisane integracje do najpopularniejszych sklepów.
no_solution_found
mówisz o walidatorze dostępnym tutaj? https://e-nadawca.poczta-polska.pl/ po zgłoszeniu tego po 3 miesiącach nadal maiłem ten problem, ale to było z rok temu, więc może rzeczywiście naprawili
Trebuh
  • Rejestracja:ponad 10 lat
  • Ostatnio:około 4 lata
  • Lokalizacja:okolice Łodzi
0

Chciałem poszukać rozwiązania błędu:
call_user_func_array() expects parameter 1 to be a valid callback, non-static method should not be called statically in

Dobrze Google przeszukuje strony ;p


GG: 10101100010110000100011101 (BIN)
"Nie wszystko napisane w internecie jest prawdą" - Józef Piłsudski.
edytowany 1x, ostatnio: Trebuh
dzek69
Wydaje mi się, że komunikat jest jasny, nie wiem co tu szukać ;)
Trebuh
@dzek69 Ja się muszę jeszcze wiele nauczyć :)
0

Troche javowy, ale napisze w pseudokodzie:

Kopiuj
private List<Address> addresses;
...

public List<Address> getAddresses() {
    if (addresses == null) return ImmutableList.of();
    else return ImmutableList.copyOf(addresses);
}

Wszystko byloby ok, gdyby byla dokumentacja mowiaca ze listy nie da sie modyfikowac itp. Ale oto, ponizej jest taka metoda:

Kopiuj
public void setAddresses(List<Addresses> addresses) {
    this.addresses = addresses;
}

Moze mi ktos wyjasnic, po co tworzenie kopi listy i zwracanie (co nota bene uniemozliwia kod w stylu getAddresses().add(new Address(...))) skoro i tak ponizej jest setter?

@Shalom: ale co to zmienia? Tylko utrudnia, i nic nie jest tak naprawde zabronione, bo tak czy tak moge sobie wywolac settera.
Ale podsumujmy, Shalom uwaza, ze ten kod ma sens? Alles klar.

Aha, dodam ze to JPA/Hibernatowa encja.

Zobacz pozostałe 7 komentarzy
niezdecydowany
niezdecydowany
" I w wielu firmach podpięcie guavy to kombinowanie. " co ku!@a ? czyli rozumiem java 1.6 ciągle w modzie ? żeby przypadkiem nie być zbyt hipsterskim ?
Koziołek
nie java 1.6, ale np. audyty bezpieczeństwa. Im większe korpo tym więcej papieru by mieć czystszy tyłek. Szczególnie w przypadku open source, gdzie nikt nie daje ci gwarancji, a tym samym musisz podjąć ryzyko samodzielnie.
niezdecydowany
niezdecydowany
lol, dziwne... tu raczej nie o wielkość korpo chodzi, a o specyfikę branży, bank ?
spartanPAGE
Spermy, dlatego tacy puryści :^)
Koziołek
Finanse, usługi dla szeroko rozumianego rządu, farmacja i medycyna.
flowCRANE
Moderator Delphi/Pascal
  • Rejestracja:ponad 13 lat
  • Ostatnio:3 minuty
  • Lokalizacja:Tuchów
  • Postów:12154
1

vivachrome.png

Uuups, wydało się...


Pracuję nad własną, arcade'ową, docelowo komercyjną grą z gatunku action/adventure w stylu retro (pixel art), programując silnik i powłokę gry od zupełnych podstaw, przy użyciu Free Pascala i SDL3. Więcej informacji znajdziesz na moim mikroblogu.
Zobacz pozostały 1 komentarz
flowCRANE
Tęsknię za Presto... ;)
dzek69
@fp - otwarcie chrome://extensions i całej listy wszystkiego od "chrome" robi przekierowania. Nikt przecież nie udaje, że to nie jest na Chromium
flowCRANE
Wiem @dzek69, po prostu takie rzeczy powinny być maskowane; Dziwnie to musi wyglądać w oczach nieinformatyka;
dzek69
W Operze też są przekierowania, settings akurat ukrywa ciąg chrome, ale strony rozszerzeń mają protokół chrome-extension:// ;) Strzelam, że każda przeglądarka na Chromium gdzieś taki ślad zostawi. A Vivaldi nie jest dla nieinformatyków :p
flowCRANE
W nowej Operze zapewne też, bo też stoi na Chromium... Ale co tam - niech się ludzie głowią :)
0

@Shalom, @niezdecydowany, @koziolek - a nie uwazacie, ze zeby kod mial sens w waszym rozumieniu, wymagana jest pewna zmiana w tym kodzie? Cos w stylu:

Kopiuj
public void setAddresses(List<Addresses> addresses) {
    this.addresses = ImmutableList.copyOf(addresses);
}

? Skoro robi defensive copy w getterze, to niech robi jak i w setterze.

@niezdecydowany - co ty mi bedziesz pierniczyl o niezmiennosci obiektow ktore maja settery. Moze jak juz skonczysz tutaj ludzi wyzywac w chamski sposob, to ty idz troche doczytaj.

@niezdecydowany - tak sie sklada, ze o 'defensive copy' napisalem wlasnie w poscie, ktory postanowiles skomentowac twierdzac, ze nie wiem co to jest.
Po drugie, co ma defensive copy to niemutowalnosci? Twierdzisz, ze obiekt z setterem, jesli robione sa kopie defensywne, jest niemutowalny?
Ja sobie zycze zebys byl mnie agresywny i chamski. Ty ich nie spelniasz, wiec i ja mam w nosie twoje.

Zobacz pozostały 1 komentarz
niezdecydowany
niezdecydowany
nie nie nie, ja ci wskazuje zwracanie obiektów a nie ich settowanie, co jest raczej bez sensu - przeczytaj, potem dyskutuj.
Wizzie
stary, jesli twoj setter modyfikuje obiekt to już nie jest immutable :D
niezdecydowany
niezdecydowany
tu się zaczęło od tego żeby nikt przez przypadek nie zmieniał stanu obiektu(MODELU) JPA (którego możesz uniknąć przez dobrą architekturę - bo, np: umawiamy się że pracujemy na tych obiektach tylko w serwisach na których jest @transactional) - a teraz, gościu zmierza w kierunku niezmienności obiektów, i robi to od d**y strony, bo setujesz kopie defensywną a nie ją zwracasz..... zresztą twoja kopa defensywna jest gó1@wno warta, jeżeli tylko obiekty adresses są mutowalne. Idź projektów kalkulatory a nie bierzesz się za takie rzeczy.
AL
@niezdecydowany załóżmy że obiekty adress są mutowalne i coś tam w nich pomieszam to Hibernate (sesja aktywna) też wrzuci to do bazy "natychmiastowo", czy tylko w momentach modyfikacji kolekcji? (dodanie,usunięcie obiektu-> to testowałem ale Twój post dał mi świadomość nie wiedzy). :D
niezdecydowany
niezdecydowany
No właśnie nie jestem pewien, trzeba by było sprawdzić :D ? Sprawdze, potem dam znać
Koziołek
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Stacktrace
  • Postów:6821
1

Nie, bo Hibernate "zgłupieje ci" listę > http://stackoverflow.com/questions/13789781/force-hibernate-to-use-my-custom-list-implementation

Jeśli chodzi o settey i niemutowalność, to zawsze można używać prywatnych setterów (JPA to ogarnia).


Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException
datdata
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 7 lat
  • Postów:957
0
Kopiuj
var result = cos.Empty()
if(!cos) {
   return true 
}
return false

Nie jakieś straszne wtf, niemniej jednak.


"A human being should be able to change a diaper, plan an invasion, butcher a hog, conn a ship, design a building, write a sonnet, balance accounts, build a wall, set a bone, comfort the dying, take orders, give orders, cooperate, act alone, solve equations, analyze a new problem, pitch manure, program a computer, cook a tasty meal, fight efficiently, die gallantly. Specialization is for insects." Robert Heinlein.
Zobacz pozostałe 3 komentarze
datdata
W tym języku średniki są opcjonalne, a konwencja jest taka że ich nie używamy. Zmienną result zostawiłem, bo cos to metoda na jakimś obiekcie i uważam, że z resultem jest czytelniej.
dzek69
To trochę głębszy temat niż "opcjonalne". Po prostu mają inne znaczenie niż w innych językach. Niemniej - ich stosowanie zapewnia jednolitość, eliminuje potencjalne głupie bugi i generalnie z tego co temat badałem - większość profesjonalnych i nie koderów opowiada się za ich stosowaniem.
datdata
Ja właściwie też. Nie mniej wytyczne języka i konwencje projektu są takie, że ich nie stosujemy - więc też tak robię. Jeśli ktoś się zapomni i jakiś zostawi to kod się skompiluje.
mad_penguin
mad_penguin
Co to za język?
KR
  • Rejestracja:prawie 14 lat
  • Ostatnio:ponad 2 lata
  • Postów:353
8

Jako ze w pracy mamy podpietego sonara pod projekt to ostatnio przejrzalem sobie klaski, ktore tworza najwiekszy "Technical Debt" na projekcie. No i znalazl sie taki kwiatek.

1 klasa
27.2k linii kodu
~150 klas wewnetrznych, duzo statycznych
Duplikacja kodu: 74.5%!!!
Dług tej 1 klasy to 125 dni :)

Wychodzi na to ze ta klaska to jedno wielkie copy paste. Nie ma to jak dobra jakosc kodu...

MarekR22
takie kwiatki zwykle są wynikiem użycia jakiegoś generatora kodu, np coś co generuje klasy z XSD lub WADL.
0

@Krycho
Obstawiam jakiś autogenerowany kod, np stub ws wygenerowany axisem.

KR
Niestety ale widac po kodzie(nazwy zmiennych, komentarze, javadoci, itp.) ze nie byla ona autogenerowana :) Raczej napisany kawalek i kopiowny + zmieniany.
Demonical Monk
  • Rejestracja:około 17 lat
  • Ostatnio:10 miesięcy
18

Obliczanie rabatu.

Kopiuj
return ($rabat > 0) ? ($rabat == 100) ? 0 : $cena*($rabat/100) : $cena;

Czyli tak:

Do zapłaty [PLN] Wartość rabatu [%] Do zapłaty po rabacie [PLN]
10,00 0 10,00
10,00 25 2,50
10,00 50 5,00
10,00 75 7,50
10,00 100 0,00

Czyli im większy masz rabat tym więcej musisz zapłacić, chyba że masz 100% to nie musisz w ogóle. Wszystko ofc liczone na floatach i zaokrąglane w losowych miejscach później. Przez 7 lat nikt się nie zorientował że coś jest nie tak.


Women were the reason I became a monk - and, ah, the reason I switched back...
Zobacz pozostały 1 komentarz
Demonical Monk
Niestety wszystko co publikuje zostało już wcześniej zgłoszone w trackerze i załatane, nawet gdyby ktoś faktycznie znalazł ten soft :D Można zacząć koncert "buuuuuuuuuuuuuuuuuuuuuuuuu".
Demonical Monk
Tylko hm, to co ja robie jest jakby forkiem innego softu w którym ten bug pewnie nadal występuje... No to możliwe że znajdziesz sklep w którym rabat tak działa ;)
W0
Przecież to oczywiste, trzeba podawać rabat w formie: rabat = 100 - podanyRabat Czego tu nie rozumieć?
somekint
już wiem za co monk dostał bana ;)
ShookTea
  • Rejestracja:około 12 lat
  • Ostatnio:prawie 6 lat
  • Lokalizacja:Wrocław
  • Postów:629
0

Sytuacja ze szkoły, która zdarzyła się kilku osobom. Kod w C++ ma wczytać z konsoli liczby do tablicy int[3][3], podnieść każdą z liczb do kwadratu i wyświetlić.

Zrobił to mniej-więcej tak:

Kopiuj
#include <iostream>
#include <cstdlib>
#include <cmath>
using namespace std;

int main (int arqc, char * argv [])
{
    int tab[3][3];
    int v;
    //wprowadzanie
    for (int i = 0; i < 3; i++) {
    	for (int j = 0; j < 3; j++) {
    		cout << "Podaj tab [" << i << "][" << j << "]=";
    		cin >> v;
    		tab[i][j] = pow(v, 2);
    	}
    }
    for (int i = 0; i < 3; i++) {
    	for (int j = 0; j < 3; j++) {
    		cout << "tab[" << i << "][" << j << "] = " << tab[i][j] << endl;
    	}
    }
    system("PAUSE");
    return 0;
}

Testowanie:
Dla wszystkich liczb wylicza dobrze, z wyjątkiem wielokrotności piątek, dla których odejmuje jeden. pow(5,2) jest równe 24, a pow(10,2) - 99.

EDIT.
Tak, korzystamy z cholernego Deva, a WTFem jest tu przede wszystkim brak dowolności w wykonaniu działania - bo "jak będziecie potęgować do 15, to przecież nie będziecie tego wypisywać, pow łatwiejszy".

Jest zainstalowane IDE NetBeans, ale skonfigurowane tylko do Javy. Konfiguracja dla C++? "Nie opłaca się, bo jest zainstalowany Goliath i się usunie po wyłączeniu komputera". Nauczyciela poprawiałem kilkukrotnie, gdy zamiast kodu w C++ pisał na tablicy w Pythonie i marudził, że to przyzwyczajenie. Sorry, ja w C++ wiem jedynie tyle, ile umiem z Javy + wyświetlanie/wczytywanie z konsoli, ale jeśli umiem więcej, niż nauczyciel, który przygotowuje całą grupę (która w większości jest ciemna, jeśli chodzi o programowanie), to zaczynam się martwić, jakie będą wyniki egzaminów w styczniu.


edytowany 1x, ostatnio: ShookTea
Zobacz pozostałe 2 komentarze
Endrju
WTF to używanie std::pow dla liczb całkowitych.
twonek
Cóż, sami się o to prosiliście używając pow() (do potęgi drugiej, seriously?) i potem rzutując wynik do int.
Shalom
@ShookTea to się nazywa brak zrozumienia jak działaja liczby zmiennoprzecinkowe w komputerze i WTF jest tylko dla geniuszy co napisali taki kod. Liczby zmiennoprzecinkowe są reprezentowane niedokładnie w efekcie twoje spodziewane 25 to może być np. 24.9999 i zrzutowanie tego na inta powoduje że zostaje 24.
MarekR22
to jet tak, jak nie wie się czemu w tej sytuacji nie powinno się stosować pow (ale dla 5 10 powinno działać).
ShookTea
@Shalom "geniusze co napisali taki kod" nie mieli innego wyboru. Zresztą, dodałem EDIT.
dzek69
Moderator
  • Rejestracja:ponad 18 lat
  • Ostatnio:dzień
  • Lokalizacja:Rzeszów
1

MySQL

amount -> double(9,2)

dwa wiersze

id amount
1 4.81
2 836.40
Kopiuj
select * from tabela where amount=4.81 -- 1 result
select * from tabela where amount=836.40 -- 1 result
select * from tabela where amount = '836.40' -- 1 result
select * from tabela where amount = '4.81' -- no results

I generalnie "działa" dla 55 tysięcy innych wartości, ale nie działa dla 4.81 ;)


Azarien
porównywanie liczb zmiennoprzecinkowych się zemściło...
dzek69
wiem, choć oczekiwałbym, że skoro podałem definicję, że skoro działa jako float, i jako string dla tylu wierszy - to i w tym przypadku powinno ;)
abrakadaber
abrakadaber
nie porównywanie tylko niejawna konwersja - kto porównuje liczby i ciągi znaków?
KR
Skoro jest double (9,2) to nie powinno być żadnej utraty precyzji. WTF jak najbardziej słuszny.
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)