Programistyczne WTF jakie Was spotkały

Programistyczne WTF jakie Was spotkały
K8
K8
  • Rejestracja:około 4 lata
  • Ostatnio:ponad 2 lata
  • Postów:791
4

Wczoraj kładę się i myślę o kodzie klasy, nad którą pracuję. Dzisiaj jem zupę i znowu o tym kodzie myślę. A jest to projekt hobbystyczny. To normalne, czy coś tu nie tak?

Zobacz pozostałe 12 komentarzy
K8
kosmonauta80
Racja. Idę odpalić VSC.
vpiotr
Raczej WoT
Marooned
Ja jak się wkręcę w jakiś swój projekt, to do 3 spać nie mogę, bo ciężko myśli uspokoić. Sny o potędze to wkurzająca sprawa ;-)
ledi12
  • Rejestracja:ponad 5 lat
  • Ostatnio:18 dni
  • Lokalizacja:Wrocław
4

Miałem do "wskrzeszenia" notebook pysparkowy napisany przez ÜBER programistów z Indii.

Ściana kodu - Jedna funkcja z 270 linijkami bez adnotacji z zagnieżdżonymi 47 ifami <3 Już pomijam, że jakiekolwiek DRY, czy KISS zostało oplute i przekopane na glebie. ÜBER hindus postanowił zrobić ÜBER funkcje :D

Oczywiście nawet nie próbowałem tego sprzątać. Zebrałem wymagania i napisałem notebooka na nowo.


Robię http response status cody w martwych ciągach
K8
K8
  • Rejestracja:około 4 lata
  • Ostatnio:ponad 2 lata
  • Postów:791
1

Robię właśnie kalkulator w JS. To jest dopiero WTF (natura JS):
0.1 + 0.2 = 0.30000000000000004

Zobacz pozostałe 41 komentarzy
KamilAdam
Hm, czyli języki powinny domyślnie używać Decimal floating point
jarekr000000
@KamilAdam: to jest jedno z rozwiązań - IMO średnie. Natomiast literał 0.1 domyślnie konwertowany na float to po prostu pułapka. Już javowe float x = 0.1f + 0.2f (zupełnym przypadkiem) przynajmniej pokazuje, że jest coś na rzeczy. (Z tym, że java w ogóle problemu nie rozwiązuje, bo w javie double x = 0.1 + 0.2 przejdzie).
KamilAdam
@jarekr000000: to jest jedno z rozwiązań - IMO średnie a co jest złego w IEEE 754-2008? Bo jeśli dobrze zrozumiałem jest to właśnie próba zakodowania 0.1 i w pamięci komputera będzie dokładnie 0.1. Jaki tu jest problem? To że mimo wszystko precyzja jest ograniczona i trzeba by używać liczb nieograniczonej precyzji?
jarekr000000
@KamilAdam: po prostu większość hardware jest optymalizowana na binary float. A obliczenia dziesiętne to tylko pewna działka (dla wielu specyficzna).
AF
To jest WTF, tylko wszyscy do niego przywykli. @jarekr000000 dobrze mówi, szanujący się język nie powinien na to pozwolić.
krancki
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 2 lata
  • Lokalizacja:74.7261832, -41.7409518
  • Postów:151
9

Takie rzeczy zawszę cieszą
Bugonado.png

edytowany 1x, ostatnio: krancki
obscurity
  • Rejestracja:około 6 lat
  • Ostatnio:2 dni
2

Ciekawostki optymalizacyjne w javascript (V8). Stwórzmy funkcję sumującą propertiesy elementów tablicy i dwie tablice - jedną ze spójnymi elementami, drugą z elementami gdzie kilka ostatnich ma dodatkowe propertiesy i stają się w pamięci instancjami innych obiektów:

Kopiuj
function sum(arr) {
    let acc = 0;
    for (let i = 0; i < arr.length; i++) {
        acc += arr[i].val;
    }
    return acc;
}

const array1 = [];
const array2 = [];
const s = { val: 1 };
for (let i = 0; i < 100_000_000; i++) {
    array1.push(s);
    array2.push(s);
}

array1.push({ val: 0 }, { val: 1 }, { val: 2 }, { val: 3 });
array2.push({ val: 0, a: 0 }, { val: 1, b: 0 }, { val: 2, c: 0 }, { val: 3, d: 0 });

teraz porównajmy czasy odpalenia na array1 i array2:

Kopiuj
for (var i = 0; i < 5; i ++) {
  console.time('array1'); sum(array1); console.timeEnd('array1');
}

for (var i = 0; i < 5; i ++) {
  console.time('array2'); sum(array2); console.timeEnd('array2');
}

wyniki dla array1 (z elementami jednego typu):

Kopiuj
~130ms
~130ms
~130ms
~130ms
~130ms

wyniki dla array2 (z elementami różnych typów):

Kopiuj
~130ms
~160ms
~600ms
~600ms
~600ms

Silnik v8 postanowił przeoptymalizować funkcję sum na megamorficzną. Po "reoptymalizacji" odpala się 4 razy dłużej. NIEZALEŻNIE od danych wejściowych. Odpalając znowu na array1:

wyniki dla array1 po odpaleniu tej funkcji dla array2:

Kopiuj
~600ms
~600ms
~600ms
~600ms
~600ms

!! Czas już nigdy nie zejdzie do starego 130ms. Chyba że stworzymy nową funkcję:

Kopiuj
function sum2(arr) {
    let acc = 0;
    for (let i = 0; i < arr.length; i++) {
        acc += arr[i].val;
    }
    return acc;
}

teraz sum2(array1) działa znowu szybko (dopóki elementy są tego samego typu).
Musiałem sam sprawdzić bo nie uwierzyłem

Źródło: https://twitter.com/SeaRyanC/status/1496273922714902528


"A car won't take your job, another horse driving a car will." - Horse influencer, 1910
Zobacz pozostałe 5 komentarzy
enedil
@abrakadaber: słownie, 100 milionów. Można dać opcjonalnie taki wizualny separator między cyframi.
abrakadaber
abrakadaber
ja wiem, że to jest sto milionów tylko mi o te podkreślenia _ chodzi - to jest normalny fature jsa?
Xarviel
@abrakadaber tak. W 2021 wszedł nowy feature, który na to pozwala.
obscurity
@abrakadaber: nie tylko jsa, są też w adzie, php od 7.4, w c# od 7, javie od 7, pythonie od 3.6, w c++ od wersji 14 (tylko z apostrofem), itd.... Ogólnie taki nowy trend który wchodzi lub wszedł do większości języków https://rosettacode.org/wiki/Numeric_separator_syntax tylko twórcy free pascala z tego co czytam stwierdzili że już i tak mają zbyt paskudną składnię przy liczbach z %$& i odrzucili
xxx_xx_x
W kotlinie tez takie co jest ;)
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 14 godzin
7

Domofony których każdy klawisz "pika" dźwiękiem o innej wysokości podczas wpisywania kodu.
Przecież tak można kod podsłuchać. No kto to wymyślił.

edytowany 1x, ostatnio: Azarien
Zobacz pozostałe 9 komentarzy
Azarien
@MarekR22 telefony rzeczywiście nadają dwa tony, ale ten domofon o którym mówię (a który spotkałem już w różnych miejscach) nadaje zwykłe „pojedyncze” piknięcia.
Miang
jak idziesz do Mamy to klepiesz kod
MarekR22
@Azarien: chyba źle się wyraziłem, o to mi chodziło mi o wybieranie tonowe.
Azarien
@MarekR22: wiem o co ci chodziło, ja wcześniej mówiłem o domofonie - ale on miał inne dźwięki.
Madaoo
Nie wiem, ale niektóre Intercomy czy SIPPhony też korzystają z DTMFu, a to dla tych co chcą wiedzieć jaki kod do otwarcia drzwi ma sąsiad: https://en.wikipedia.org/wiki/Dual-tone_multi-frequency_signaling
K8
K8
  • Rejestracja:około 4 lata
  • Ostatnio:ponad 2 lata
  • Postów:791
1

Czytam sobie kolejny rozdział książki dotyczącej JS ES6. I chyba odpuszczę na tym poziomie zaawansowania (początkujący).
Bo chodzi o zagadnienia proxy i refleksji. Używa ktoś tego?

Riddle
Czy użyłeś kiedyś google chociaż raz? Wszystko o co pytasz można znaleźc w dokumentacji; https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect
M0
  • Rejestracja:ponad 11 lat
  • Ostatnio:około godziny
  • Postów:362
4

Połączenie django oraz safari(i pewnie apki). Mamy sobie endpoint z id pod który strzelamy np. endpoint/2 Django zwraca 301 do endpoint/2/ bo wymaga, aby url kończył się / i w tym momencie następuje wylogowanie z aplikacji bo safari kolejny request robi bez tokenu. Inne przeglądarki to ogarniają.

Zobacz pozostały 1 komentarz
M0
@1a2b3c4d5e: tak dobrze rozumiesz, robię get i dostaję 301, poprawione to zostało, aby już nie było przekierowania.
MarekR22
Jakie właściwości ma to cookie? Do jakiego adresu jest limitowane?
SZ
jaka masz defnicje urli ?
M0
@szok: w Django było endpoint/<pk>/, zaś fronty były pod endpoint/<pk> Apka jest przejęta po innej firmie i jest tam sporo dziwnych rozwiązań
SZ
Ok, wszystko jasne :)
chalwa
  • Rejestracja:około 7 lat
  • Ostatnio:około rok
  • Postów:109
8

Chwila zaćmienia i zamiast zalogować się na LinkedIn utworzyłem konto na Indeed. Dzięki Bing!
A podobno linkedIn został kupiony przez M$ ;P

P.S. zawszę mylę Sing In z Sign Up

linkedin.PNG

edytowany 2x, ostatnio: chalwa
krancki
@chalwa: Jeżeli szukasz czegoś innego niż to co szukasz, Bing jest zawsze najlepszym rozwiązaniem :D
vpiotr
Bing też dobrze pokazuje które technologie powinny zniknąć z powierzchni Ziemi (wg MS).
neves
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 11 godzin
  • Lokalizacja:Kraków
  • Postów:1114
9

Dzisiaj zapuściłem się w jakieś obce rejony kodu, i odkryłem największe stężenie słowników, jakie kiedykolwiek w życiu widziałem, nawet nie chce wiedzieć do czego to służy :D

screenshot-20220304124222.png


Miang
zabij nim złoży jaja ;) a w jakim języku?
KR
EarthquakeDesignCodesIdsCs - fajne;-)
somekind
To jest prawdziwa biblioteka, ma wszystkie możliwe słowniki.
MA
Jak można zapomnieć o readonly...
SA
@_Mateusz_: co ma do tego readonly?
Shalom
Szklana kula mówi że ktoś zaklepał jakąś własną "bazę in-memory" a tutaj zrobił sobie do niej indeksy :D
Marooned
Na moje to brakuje słownika do spisu treści tych słowników.
Miang
  • Rejestracja:prawie 7 lat
  • Ostatnio:około 2 godziny
  • Postów:1659
5

zaremowane w makefile

Kopiuj
#				src/putzfrau	\

Szwajcar to pisał ;)


dzisiaj programiści uwielbiają przepisywać kod z jednego języka do drugiego, tylko po to by z projektem nadal stać w miejscu ale na nowej technologii
edytowany 1x, ostatnio: Miang
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:minuta
0

https://www.komputerswiat.pl/wideo/wydarzenia/czy-komputery-kwantowe-moga-stac-sie-zagrozeniem-oto-co-mowia-naukowcy/cxq6ell

Na Chrome przesunięcie stronę lekko w dół, a strona w nieskończoność będzie mrugać: na przemian będą się pojawiać i znikać jakieś paski u dołu i góry.
Na Firefox robi się tylko jedna iteracja, na Egde też. Safari nie sprawdzałem.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22
Zobacz pozostały 1 komentarz
MarekR22
cofanie mi działa. Po prostu przy naciśnięciu "back" trzeba zrobić skrolowanie w górę. Taki badziew z animacją powinien szybko wyjść na testach i zostać naprawiony.
obscurity
u mnie jakoś losowo działa, czasem "back" jest dostępny czasem nie
obscurity
chrome potrafi często robić zmiany bez kompatybilności wstecznej. przypuszczam że działało normalnie jak to testowali a w nowszej wersji chroma już nie. kilka razy zdarzyło mi się coś poprawiać bo nagle zmienili zdanie - przykładowo border na fixed nagłówek tabeli nie działało, dało się zrobić workaround przez box-shadow, ale w kolejnej wersji box-shadow też już nie działał
Azarien
U strona zaczyna tańczyć na Vivaldi - paski się pojawiają i znikają, ale płynnym ruchem. A w ogóle to nie cierpię jak strona próbuje robić coś dziwnego ze scrollowaniem. Przewijanie powinno być tylko tym: przewijaniem. Żadnych dynamicznych pasków, ani sticky barów, ani wymuszania płynności (skoro wyłączyłem płynne przewijanie to znaczy że go nie chcę, koniec kropka), ani doładowywania treści. Niech scroll pozostanie scrollem.
KR
U mnie na FF na Androidzie wszystko działa ok.
AS
  • Rejestracja:prawie 4 lata
  • Ostatnio:około 21 godzin
  • Postów:344
0

Robię code review w międzynarodowym zespole:

Kopiuj
l1.retainAll(l2)

Piszę, że „this is qadratic time complexicity and these lists are huge”. Ten mi odpisuje, że racja i jest „open to alternatives”.

Dobrze, że pracujemy zdalnie, bo bym nie wytrzymał w profesjonalnej masce i przy wszystkich zadałbym pytanie, kto go zatrudnił na stanowisko Senior Java Developer. Na LI ma 10 lat doświadczenia. Nie jest Hindusem.

To nie pierwszy raz z tą osobą, że mam „wtf, z kim ja pracuję”. Zadania algorytmiczne na interview mają sens.

Zobacz pozostałe 12 komentarzy
KamilAdam
Kotlin tak robi @obscurity patrzyłeś w dalej w kod? Operacja konwersji może się nie udać i i tak dostaniemy listę i złożoność kwadratową is Collection -> if (this.safeToConvertToSet()) toHashSet() else this
KamilAdam
potem dalej mamy private fun <T> Collection<T>.safeToConvertToSet() = brittleContainsOptimizationEnabled() && size > 2 && this is ArrayList, czyli LinkedListy już odpadły, dlaczego?
obscurity
@KamilAdam: ale przynajmniej próbuje coś zrobić lepiej a nie odpala algorytm który napisał student na przerwie
KamilAdam
Dalej nie daje to gwarancji że nie będzie złożoności kwadratowej
obscurity
nikt nie pytał o taką gwarancję, ale wbudowane funkcje języka powinny być chociaż w jakimś podstawowym stopniu zoptymalizowane. iterowanie po całej drugiej kolekcji w celu dodania do seta też jest w wielu przypadkach bezcelowe gdy usunęliśmy już wszystkie elementy z pierwszej kolekcji które były na początku drugiej. Można by tu zrobić jakieś LazyHashSet które dokłada elementy z iteratora tylko w miarę potrzeby
K8
K8
  • Rejestracja:około 4 lata
  • Ostatnio:ponad 2 lata
  • Postów:791
1

Co się stało z developer.mozilla.org? Jak można było zmienić taki fajny i czytelny UI na obecny?

Riddle
Mój strzał: chcą się upodobnić do Docs'ów od Microsoftu. Dokładnie ten sam powodów czemu bing jest teraz prawie nierozróżnialny od Google'a. Zeby userzy nie wiedzieli z czego korzystają.
KR
Moderator
  • Rejestracja:prawie 21 lat
  • Ostatnio:dzień
  • Postów:2964
13

Recenzowałem kod pewnego seniora X, kilkaset linii zmienionych, w tym testy, w sumie nawet nie taki duży ticket. Miałem na początku pozytywne nastawienie, bo obawiałem się bloba spaghetti na 5 tys linii. A tu jednak zaskoczenie - kod ma w sumie nawet niezłą strukturę i w sumie bez większych problemów dość szybko ogarnąłem o co chodzi. Pomyślałem "X robi postępy, może będzie nieźle" . Wcześniej nie było to normą u X.

Znalazłem:

  • dwa przypadki wyścigów, w dwóch różnych miejscach, które zaowocowałoby wywaleniem kodu lub zwróceniem złych wyników zapytania pewnie w czarny piątek
  • jeden błąd w założeniach do algorytmu i ogólnie algorytm skopany i dający błędne wyniki w pewnej nieskończonej liczbie przypadków brzegowych (deterministyczne)
  • kilka przypadków niedokładnie udokumentowanych metod i potencjalnych błędów (trudno ocenić czy błąd czy nie, bo zachowanie nieudokumentowane, ale implementacja "dziwna")
  • parę innych drobiazgów

Recenzja zajęła mi dwa dni. Wszystko starałem się jak najdokładniej opisać, w sumie zadowolony byłem że tyle znalazłem, więc będąc w dobrym humorze nawet zawarłem wiele propozycji jak można to poprawić.

Po 10 minutach od wysłania recenzji, czytam odpowiedzi X na moje komentarze:

  • "Ten kod skopiowałem z innego miejsca, więc nie może być źle".
  • "Interesujące" (brak dalszego wyjaśnienia)
  • "Ten komentarz nie ma sensu." (i nic więcej, ani słowa wyjaśnienia)
  • Komentarz oznaczony jako Resolved. Brak zmiany w kodzie.

WTF?

edytowany 1x, ostatnio: Krolik
Zobacz pozostałe 16 komentarzy
KR
Sorki, chyba za szybko pisałem. Miałem na myśli, że do ticketu były napisane testy i nie failowały. Nie że zmienił testy. W sensie, ticket miał ok 500 linii (dodanych / usuniętych / zmodyfikowanych) i w tej liczbie zawarte były już dodane testy, więc samego kodu było na jakieś 300 może 350 linii. W sumie testó na szczęście dużo i tu złego słowa o tym gostku nie mogę powiedzieć. Natomiast dla mnie WTFem są jego komenty na review - tak jakby chciał mi powiedzieś "sp*aj". Albo on ma jakiegoś aspergera, nie wiem.
WeiXiao
i jak to się rozwinęło?
Sarrus
Tak sobie "stańcie z boku" i przeczytajcie co o tych testach tu piszecie. Nie było w poście informacji, czy testy nowe czy poprawiane. Czy wymagania się zmieniły czy nie. Czy doszła nowa funkcjonalność czy nie, a w komentarzach drzecie szaty, że powinno czy nie powinno się zmieniać testów. Weźcie czasem na wstrzymanie, bo tylko niepotrzebne nerwy sobie psujecie.
KR
@1a2b3c4d5e: na razie część rzeczy poprawił, ale do reszty się kłóci że kod jest dobry. Dodał jeden test demonstrujący że kod działa w przypadku, o którym od początku widziałem że działa, natomiast nie testuje tego brzegowego dającego złe wyniki. Przy czym ten brzegowy podałem mu na początky na tacy. Sprawia wrażenie jakby nie czytał tego co mu pisze, albo wiedział coś, o czym nie wiem, ale celowo nie chciał tego wyjaśnić. Ja tam cierpliwy jestem więc pewnie jeszcze kilka rund CR będzie :D
KR
Wielokrotnie miałem na CR tak, że kod był w ogólnym przypadku błędny, ale w szczególnym przypadku ok, a kontekst użycia tego kodu zakładał tylko te dobre szczególne przypadki. Ale ten kontekst to była wiedza tajemna w głowie jednego seniora który to pisał. Praca z takim kodem to jak przechodzenie przez pole minowe. Jak ktoś się upiera przy czymś takim, to wtedy go cisnę przynajmniej na dokumentację i dodawanie asercji.
WhiteLightning
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 7 godzin
  • Postów:3169
K8
K8
  • Rejestracja:około 4 lata
  • Ostatnio:ponad 2 lata
  • Postów:791
1

Pomysł: użyj webpacka, aby ogarnąć lepiej projekt składający się z wielu modułów
Rzeczywistość: doinstaluj ponad 10 różnych modułów i utwórz podobną ilość dodatkowych plików konfiguracyjnych, dzięki czemu projekt jest 100x bardziej skomplikowany

Zobacz pozostałe 3 komentarze
axelbest
Jeśli używa się ton bibliotek, a node modules ma 500k plików i waży 600mb. To tak uważam że jQuery w zupełności wystarczy żeby proobic wizualne wodotryski i podmienić fragmenty stron ajaxem. Trudniejsze rzeczy też się da.. Jednak mimo tego co ja tu wygaduje, skoro ktoś obsmiewa to w satyrycznym materiale to ziarenko prawdy w tym jest. Nikt nie śmieje się przecież z Javy bo nie obsługuje wielowątkowości (co nie jest prawda, dlatego nikt tak nie żartuje). filmik pokazany znajomym jsowcom spotkał się tylko z komentarzami "życie" /"axelbest... Przeciez tak moja praca wygląda"
axelbest
Ale brońcie się dalej jsowcy. Z was świat się śmieje tak samo jak z phpa
Riddle
@axelbest: jQuery teraz nie ma niczego co warto mieć. Jeśli teraz miałbym zrobić dowolną aplikację, to wybrałbym prędzej Vanilla JS niż jQuery.
axelbest
No i to słuszna decyzja. Ale mając wybór babel, webpack, transpillery, typescripty, reacty, reduxy I to podparte tysiącem hackow, to wolę jQuery.
somekind
Ale brońcie się dalej jsowcy. Z was świat się śmieje tak samo jak z phpa - nie no, zdecydowanie bardziej. Już nawet ja nie śmieję się phpa.
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 13 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10053
2
kosmonauta80 napisał(a):

Pomysł: użyj webpacka, aby ogarnąć lepiej projekt składający się z wielu modułów
Rzeczywistość: doinstaluj ponad 10 różnych modułów i utwórz podobną ilość dodatkowych plików konfiguracyjnych, dzięki czemu projekt jest 100x bardziej skomplikowany

"Doinstaluj"? Do czego? Bo na pewno nie do projektu. Twój kalkulator nadal będzie się składał tylko i wyłącznie z tego kodu który napisałeś.

Te "dodatkowych 10 modułów" nie są dodawane do projektu, tylko do Twojej lokalnej instalacji - to jest bundler, narzędzie developerskie służące do budowania projektu. Jak już zbudujesz projekt to to co jest w dist/ to jest Twój projekt, bundler możesz wyrzucić. To podobne jak ściągasz przeglądarkę Firefox która ma 300 MB żeby pokazać index.html który ma 1Kb.

Poza tym, w innych technologiach jest tak samo, javowy Maven/Gradle i pluginy, pythonowy pip/py, ruby gem/bundle, phpowy Composer. To jest standard że narzędzia developerskie zajmują bardzo często dużo więcej miejsca i konfiguracji niż wynikowy projekt. Visual Studio Redistributables C++ 2015 zajmuje 6GB żeby zbudować binarkę mającą pół MB.

Im szybciej się z tym pogodzisz tym lepiej.

edytowany 3x, ostatnio: Riddle
several
Visual Studio Redistributables C++ 2015 waży 14MB.
Sarrus
@several pewnie chodziło o SDK
Sarrus
  • Rejestracja:prawie 14 lat
  • Ostatnio:5 dni
  • Postów:2512
5

Pewien rejestrator chińskiego producenta kamer wysyła zdarzenia asynchronicznie. Odbiera się je przez http long polling. Zgłoszono mi problemy z działaniem mojego programu. Patrzę - no błąd deserializacji XML (C#). No ok włączam poszerzone logowanie i co ja patrzę? No XML się poprawnie nie deserializuje, bo to co dostaję to JSON. Ale zaraz, zaraz. W innym miejscu nadal widzę XML. No tak bo w ramach jednego strumienia (multi part mixed) dostaję raz XML, a raz JSON. Jaki trzeba mieć burdel w kodzie, żeby robić coś takiego? YAFUD.

cerrato
zdradzisz nazwę tego producenta?
jurek1980
Ja tam bym się bał gdzie ten Json i XML leci jeszcze poza Twoją aplikacją.
jurek1980
@cerrato: jak opłaca się dopisywać apke to raczej coś droższego. Mogę zgadywać że zaczyna się na H? Ciekawe czy zgadłem.
cerrato
No właśnie też miałem taką pierwsza myśl - stąd moje pytanie :D
K8
K8
  • Rejestracja:około 4 lata
  • Ostatnio:ponad 2 lata
  • Postów:791
1

Naprawdę, te wszystkie tutoriale prowadzone w India-English to jeden wielki WTF...

Zobacz pozostałe 7 komentarzy
vpiotr
@Sarrus: a nie wiem, ale dzieki.
CZ
Tu nie chodzi o akcent bo ten da się zrozumieć, ale nieraz poziom jest nawet niższy niż na polskich uczelniach. Czasem typ się czegoś nauczy i od razu nagrywa filmik. Już więcej da się z dokumentacji nauczyć.
randomize111
@Czitels: coś dobrego też można trafić, że dużo słabizny to nie dziwne - ich jest około 1,4 miliarda
PdP
Dlatego gdy słyszę indyjski-angielski to wyłączam. Natychmiast.
wojtekxtx
@PdP: dokładnie tak samo. Scamerom dziękujemy
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 13 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10053
4

W PHP do funkcji preg_replace_callback() został dodany opcjonalny argument int $flags, trzymający flagi bitowe (te oldschoolowe, typu a | b | c). Tylko że zostały użyte te same flagi co do preg_match() oraz preg_match_all().

Co w tym złego zapytacie, a no to że w PHP jest konwencja sprawdzania czy feature istnieje albo tak class_exists(WeakReference::class), albo function_exists('preg_last_error') albo defined(PREG_UNMATCHED_AS_NULL). I to działa nawet, w końcu słabo typowany język.

Ale teraz jak dodali te flagi które są tymi samymi flagami to siłą rzeczy nie ma jak sprawdzić czy istnieją czy nie. Jak feature jest, to jest. Jak nie ma, to w defined() załapią się flagi z preg_match() z poprzedniej wersji. Nie ma możliwości teraz sprawdzić czy ta funkcjonalność istnieje. Jedyne co można zrobić teraz to porównać wersję PHP: if (PHP_VERSION > '7.2.0') :| Albo refleksją sprawdzić czy funkcja ma argument.

Dlaczego Ci goście jak dodają nowy feature to nie używają za grosz mózgu? ;|

edytowany 1x, ostatnio: Riddle
CH
Ale teraz jak dodali te flagi które są tymi samymi flagami to siłą rzeczy nie ma jak sprawdzić czy istnieją czy nie , Nie ma możliwości teraz sprawdzić czy ta funkcjonalność istnieje. ale jaka funkcjionalnosc i czy co istnieje. Napisz o co ci chodzi bo z tego tekstu nic nie mozna zrozumiec
Riddle
Funkcjonalność taka że preg_replace_callback() umie zwrócić nulla.
M0
  • Rejestracja:ponad 11 lat
  • Ostatnio:około godziny
  • Postów:362
7

Kiedy jesteś fanem pythona, ale kazali pisać w nodeJS.

Kopiuj

foo(x) {
const self = this;
......
self.doSomethigh(x)

}

I tak w większej ilości miejsc.

Marooned
Popularna praktyka by wewnątrz callbacków (zanim => weszło w życie) mieć dostęp do zewnętrznego this ;-)
M0
@Marooned: Start projektu do 2016 r. ale tam jest sporo dziwnych rzeczy, najlepiej wszystko zaorać i przepisać na nowo. Ktoś uczył się na tym CQRS i Event Sourcing, gdy to projektował.
wasiu
O, dawno już self = this; nie używałem ale kiedyś faktycznie to było dosyć popularne, właśnie przez te callbacki :) W typescript i angularze już takich cudów nie używałem :) zatem nie wtf :P
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 13 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10053
5

screenshot-20220406231406.png

Zobacz pozostały 1 komentarz
Marooned
No tak, coś jak 1+2 === (1+2) -> echo foo === echo (foo)
Riddle
To jest w ogóle dodatkowo zabawne, bo nie ma żadnego sensownego powodu czemu echo nie jest funkcją. Tzn wszystko co działa z funkcjami, nie działa z echo. Np nie można zrobić array_map('echo', $values);.
ZD
a w ogóle istniał jakikolwiek proces projektowania języka? Czy tylko weźmy klamerki z C i dolara z Perla (bez zrozumienia jego sensu) ?
Riddle
@ZrobieDobrze: Nie było. PHP początkowo powstał jako "preprocessor HTML" (trochę to czym SCSS jest dla CSS), tylko dodawano do niego elementy w dosyć chaotyczny sposób, przez co powstała taka mieszanina.
LukeJL
w Pythonie 2 print była instrukcją (i pisało się bez nawiasów print 123), a w Pythonie 3 już jest normalną funkcją.
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 13 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10053
1

Wchodzimy na stronę "Apache" w dokumentacji PHP: i jest Predefined constants:

screenshot-20220420010911.png

Klikamy a tam: https://www.php.net/manual/en/apache.constants.php
screenshot-20220420010931.png

To po co ta strona w ogóle? :|

Dodali pustą stronę po nic.

edytowany 1x, ostatnio: Riddle
Shalom
Pewnie generowane automatycznie?
jurek1980
Takich stron w dokumentacji PHP jest więcej. Raz, że pewnie tworzone automatycznie, dwa przygotowane pod wersje, trzy ja uważam, że lepsza informacja konkretna a nie zgadywanie np. czy skoro strony nie ma, to może informacje są gdzieś indziej i trzeba szukać dalej.
Riddle
@jurek1980: no dobra, masz rację, to ma sens. Ale wygenerowana nie jest bo ludzie piszą w różnych językach z palca w tej dokumentacji. Nawet przez chwilę chciałem napisać polską kiedyś, bo nie ma.
jurek1980
@TomRiddle: kiedyś była, ale gdzieś przy wersji 5.6.X chyba zrezygnowali z tłumaczeń. Ja miałem podobny pomysł, ale doszedłem do wniosku że będzie za dużo wojen o pierdoły jak np. czy to folder czy katalog i na pewno na takie rzeczy siły nie mam.
W0
Kilka razy zdarzyło mi się szukać czegoś w dokumentacji, po to tylko, żeby dopiero na SO znaleźć informację, że biblioteka czegoś nie obsługuje. Predefiniowane zmienne to jest coś, czego się raczej spodziewam na serwerze i taka informacja jest jednak cenna.
abrakadaber
abrakadaber
  • Rejestracja:ponad 12 lat
  • Ostatnio:7 miesięcy
  • Postów:6610
15

tak mi się przypomniało czytając temat o algorytmice vs pisanie CRUDów. Pracuję w firmie z własnym produktem. Nie jest istotne co to jest a jedynie fakt, że rozwijany jest od ponad 35 lat (pierwsze wersje były jeszcze DOSowe). Wiele rzeczy zostało napisanych od nowa, niektóre nawet kilka razy - ot zwykła rzecz w takich projektach.
Jedną z jego korowych funkcji jest porównanie dwóch projektów, wyświetlenie różnic i zaaplikowanie ich. Czasami te różnice idą w miliony przy jednym porównaniu. Różnice te mają też swoje kategorie, których jest ok. 150. Co ważne, dla usera, różnice wyświetlane są pogrupowane w formie drzewka (dwa poziomy - kategoria - lista różnic z kategorii).
Klienci zgłaszają, że na dużych projektach porównanie i wyświetlenie wyników potrafi trwać i kilka godzin i zjadać ok 20GB RAMu. No to patrzymy do kodu a tam wyświetlanie zrealizowane w ten sposób:

Kopiuj
forech kategoria in wszystkie_kategorie
{
  dodaj_kategorie_do_drzewka(kategoria);
  if (różnica.kategoria = kategoria)
    dodaj_różnicę_do_drzewka(różnica);
}

i teraz zakładając 10 000 000 różnic i 150 kategorii to if wykona się 1 500 000 000 razy.
Żeby było ciekawiej to cała ta operacja działa się na styku kodu niezarządzalnego i zarządzalnego a obiekty latały jako COMy (różnica.kategoria była po jednej stronie a porównanie po drugiej stronie). Więc dochodził dodatkowy narzut na tworzenie obiektów RCW przez c# (i to narzut dość znaczny, zarówno na pamięć jak i czas).
Finalnie, po zamianie listy na dictionary<kategoria, List<różnica>> do trzymania różnic oraz pobranie różnica.kategoria tylko raz i zapamiętanie lokalnie przyśpieszyło całą operację do 10 minut a zapotrzebowanie na RAM spadło do 700MB.

Także tego jeśli chodzi o logiczne myślenie to się jednak przydaje i twierdzenie, że maszyny mamy szybkie a RAMu dużo nie do końca się sprawdza.


Chcesz pomocy - pokaż kod - abrakadabra źle działa z techniką.
KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:6 dni
  • Lokalizacja:Silesia/Marki
  • Postów:5505
3

Pracowałem raz w firmie która uparcie używała OSGi.

no bo może kiedyś będziemy chcieli wymienić dynamicznie biblioteki na produkcji bez restartu aplikacji

Oczywiście apka była zdockeryzowana przez co dynamiczna podmiana traciła sens. Oczywiście nie mieliśmy dostępu do produkcji, bo klient samodzielnie apke instalował na swoich serwerach. Po dwóch lata pracy tam i próbie zrozumienia sensu OSGi dostałem pozwolenie na zaczęcie usuwania go :D BTW dalej nie wiem po co jest OSGi


Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
Zobacz pozostałe 4 komentarze
vpiotr
Tak, ale to niszowe zastosowanie. Wiekszosc obecnej javy to crudy w klaułdzie z kilkoma instancjami gdzie padniecie / aktualizacja serwisu NIE. powinna byc zauwazalna (ale czy tak jest?). Po to chyba caly ten k8s?
Koziołek
@vpiotr: tak, zgoda i dziś OSGi nie ma większego sensu, bo zarządzanie hot swapem przeniesiono na Green-Blue/Canary deployment i k8s, a zarządzanie zależnościami idzie ogarnąć za pomocą modułów. W dodatku k8s jest prostszy, mniej awaryjny i zapewnia interoperacyjność pomiędzy językami.
KR
zarządzanie zależnościami idzie ogarnąć za pomocą modułów. o,to można mieć już tę samą bibliotekę w dwóch różnych niekompatybilnych wersjach na raz w jednym programie?
Koziołek
@Krolik: teoretycznie tak, praktycznie nie, chyba, że własny classloader napiszesz.
KR
No czyli dupa, nadal problem nierozwiązany. Classloadery działają tylko w teorii, a w praktyce powodują tylko jeszcze więcej problemów.
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 13 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10053
11

Tutorial o enkapsulacji: https://www.geeksforgeeks.org/encapsulation-in-java/

Autor tam pisze że enkapsulację można uzyskać dodając gettery i settry

Encapsulation can be achieved by Declaring all the variables in the class as private and writing public methods in the class to set and get the values of variables
It is more defined with setter and getter method.

I z tego tutoriala się potem uczą inni.

Zobacz pozostałe 3 komentarze
Riddle
Wystarczy zobaczyć na godziny :D ps: first
cerrato
Godziny to jedno, ale może gdzieś sobie pisaliście jeszcze - jakieś PW czy discord, albo temat się jakoś pojawił wcześniej - dlatego pytam.
Riddle
Nie. Byłem pierwszy.
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 13 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10053
5

Instalator GnuWin32 na Windowsie wywala poza skalę (procentów):

screenshot-20220522142211.png

cerrato
Powinieneś się cieszyć - dostajesz 115% softu w cenie 100% ;)
obscurity
czemu używasz jakiegoś gnuwina zamiast cygwin?
Riddle
czemu używasz jakiegoś cygwina zamiast gnuwina?
obscurity
bo sam gnuwin na dole daje ci informacje że już nie jest rozwijany i wspierany i poleca cygwina?
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 13 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10053
2

Czytam sobie artykuł: https://www.pythoncentral.io/pyside-pyqt-tutorial-qlistview-and-qstandarditemmodel/ I gość tam korzysta z biblioteki która nie do końca ogarnia wcięcia, więc mamy takie coś:

Kopiuj
# Loop through the items until you get None, which
# means you've passed the end of the list
i = 0
while model.item(i):
if not model.item(i).checkState():
return
i += 1

app.quit()

model.itemChanged.connect(on_item_changed)

# Apply the model to the list view
list.setModel(model)

# Show the window and run the app
list.show()
app.exec_()

Gdyby to był inny normalny język z klamerkami, albo chociaż z end (jak w Rubym) to spoko, ale teraz to się tego nawet nie da odpalić bez zgadywania czy coś jest w czy poza funkcją.

Zobacz pozostałe 17 komentarzy
Azarien
@enedil i co z tego że nieczytelny, jak w każdym szanującym się IDE do C++ zaznaczasz tekst i klikasz na "formatuj kod" i masz ładnie sformatowany kod i odtworzone wcięcia (według JAKICHŚ reguł, ale te da się konfigurować, zresztą jakieś są lepsze od żadnych).
enedil
@Azarien: "proszę mnie już w tym wątku nie oznaczać"
Azarien
To się liczy dopiero od przeczytania tego komentarza, a ja odpowiadałem na wcześniejszy.
obscurity
@Magiczny: nic się nie wydarzyło
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 13 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10053
6

screenshot-20220531222918.png

PI
Taka wartość tego całego php
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)