Ujdzie, czy przesada i dzwonicie po policję? XD
Chciałem sobie otypować grupę podobnych metod i po prostu użyć dekoratorów jak normalny człowiek, które co prawda w TS są trochę upierdliwe, ale da się je doprowadzić do działania. Tylko potem zmusić TS do wykminienia, jaki jest typ udekorowanej metody to jednak jest trochę koszmar, więc spłodziłem takie gówno.
W pythonie jakoś sobie poradzili z tym sprawniej, ale pewnie mieli łatwiej, bo dosłownie wszystko jest obiektem, a w JS to null niby jest prymitywną wartością, ale typeof null === 'object' zwraca true i nie są tego w stanie naprawić od 30 lat, bo internet by wybuchł xd
export const vecOp = <T>(op: (this: Vec, v: IVec) => T) => { function wrapped(this: Vec): T function wrapped(this: Vec, v: IVec): T function wrapped(this: Vec, x?: number, y?: number): T function wrapped(this: Vec, vx?: IVec | number, y?: number) { return op.apply( this, typeof vx === 'number' ? [{ x: vx, y: y ?? 0 }] : vx === undefined ? [{ x: 0, y: 0 }] : [vx], ) } return wrapped}
export class Vec implements IVec { add = vecOp(v => new Vec(this.x + v.x, this.y + v.y)) sub = vecOp(v => this.add(-v.x, -v.y)) dot = vecOp(v => this.x * v.x + this.y * v.y) dist = vecOp(v => this.sub(v).norm)
@sens: aha, jak powyższe nie wywołuje u was odruchu wymiotnego, to co powiecie na emulację przeciążania operatorów używając template tagów? XD
export class Vec implements IVec { static expr(ops: TemplateStringsArray, ...args: any[]): Vec | number;
A po dopisaniu jakiegoś prostego shunt yarda można sobie używać takiego lukru składniiwgo :--DD
const u = new Vec(2, 1)const v = new Vec(3, 7)const p = Vec.expr`|${u} - ${v}|^2`
Mój graf niedomaga przy obliczaniu pozycji wierzchołków i jej dwóch pochodnych przy liczbie ~5k node'ów (na jednym wątku jedna klatka się renderuje około minuty xd) więc sobie przepisuję obliczenia do webgpu, bo to coś nowego a nie te upośledzone workery ciągle. Napisałem już shader, poustawiałem bufory. Teraz już tylko muszę wepchnąć do nich dane i zobaczymy czy działa. Czymajcie kciuki
@sens: działa! XD z jednej klatki na minutę udało się zrobić prawilne 60 fps (no może nie jest stabline podczas interakcji z UI, ale to wina raczej tego, że nie dzielę renderowania na mnijesze części, żeby się renderowało bardziej asynchronicznie)
bawię się tym wyświetlaniem grafu wywołań funkcyj, chyba mi wyszła jakaś galaktyka z poprzeczkom
jjuż jest coraz lepiej, wierzchołki reprezentujące funkcje próbują się zgrupować według odległości w łańcuchu wywołań i tego, w jakim pliku siedzą i mi nie spierdalają poza canvas xd
@sens: https://i.imgur.com/7Wxhv76.jpeg
pamietacie jak jakies 10 lat temu wszyscy słuchali makintosz plus i byli AESTHETIC?
ja kurwie
to było 15 lat temu
x__X
15 lat temu był 2010 rok
## SZOK
Wczoraj wieczorem zacząłem się po raz kolejny zastanawiać, jak bardzo spierdolony jest projekt tego typka od dependency injection, więc zacząłem szukać sobie jakichś analizatorów kodu, które by wyszukiwały zależności po wywoływanych funkcjach, a nie tylko importowanych plikach.
No i znalazłem i zajebiście to działa, tylko że to narzędzie ma absolutnie obleśną i nieergonomiczną wizualizację grafu wywołań (to nie ty mi @Deykun mówiłeś o tym cytoscape? oni tego właśnie użyli, ale chyba niezbyt im poszło xD)
No to sobie zacząłem robić swoją własną wizualizację, bo mnie kurwa stać. No i tak robię robię i kminię jak zmierzyć siłę powiązań między danymi funkcjami, żeby ten graf się jakoś ładnie układał, żeby te wierzchołki miały wporzo grawitację, a nie że 10k node'ów nasranych na przestrzeni stu pikseli kwadratowych, c'nie
No i tak powoli rozkminianie tego przeszło w zwyczajne bawienie się canvasem i kolorkami, jak to zazwyczaj bywa. No i tak sobie myślę jescze w międzyczasie o tym jak liczyć tę grawitację i się bawię, i kiminię, i bawię
Mamy taki projekt na podstawie szeroko wykorzystywanego core'a, w którym z powodu szczątkowej dokumentacji i ogólnego burdlu (Microsoft, heh) po zbudowaniu podstawowego projektu wstrzykujemy skrypty js na chama do index.html. skrypty są koszmarne, bo połowa kodu to document.createElement, a funkcje tego rozszerzenia są dość obszerne (bluetooth, transpilator, I inne ciekawostki). Ogarnięcie skąd bierze się dany stan i dokąd zmierza graniczy z cudem.
Więc piszę teraz od nowa w typescripcie. Nadal będzie to osobno budowane i wstrzykiwane, ale ponieważ przynajmniej jest teraz jakaś struktura i typowanie, to jest to gra warta świeczki.
Aha, i pisze też do tego customowy jsx-runtime z bieda-reaktywnością, żeby się nie szarpać z DOMem ręcznie. Nawet to jakoś działa xD
Zrobiłem jakiś czas temu rozszerzenie do vscode, dziś patrzę a tu jakiś typek który projektował którąś tam wersję AutoCAD pisze mi issue że super rozszerzenie, podał listę ficzerow, które by chciał i zaproponował 50$ dla Polaka robaka jeżeli zaimplementuje przynajmniej jeden xD
Czuję dobrze open sos kontrybutor
Hajsik przyjmę chętnie ale fajnie że mojego kodu używa z własnej woli 80 letni gość z dużym doświadczeniem a nie że Mati po bootcampie Vibe koduje bota i spamuje gównianymi issuesami żeby umieścić changelog.md w repo, bo on tak lubi
To bardzo budująca myśl, że nie ważne czy wstrzykujesz asynchroniczne korutyny do kontenera, czy trenujesz wielowarstwową sieć neuronową czy tworzysz grę o ruchaniu psów. Pod spodem to i tak jest tylko zegarek, kalkulator i goto
Mamy nowe biurka w biurze ale chyba stare bo na moim jest naklejka gnu Emacs.
Wysłane z mojego emacsa przez sendmail
Upierodolilbym łeb bez wahania temu gnojowi, który przeforsował używanie dependency injection do ładowania pierdolonego stringa w pojekcie. Zaraz wam kurwa policzę ile warstw abstrakcji zostało stworzonych do tego ultra skomplikowanego zadania
remderuje sb mapki z GTA2 w babylon JS, prosto z pliczków gry. Docelowo bendzie to edytor do mapek
https://i.imgur.com/ndzbOD2.jpeg
ofc trochę tekstur poobracanych i źle zmapowanych, nie ma oświetlenia, bo to jeszcze praca w toku
https://i.imgur.com/a06XD9g.png
już przechodzę powoli z tworzenia gramatyki do implementacji interpretera (na razie nie ma absolutnie nic związanego z tworzeniem grafiki, bo zacząłem od obsługi zmiennych, procedur, call stacków etc.), nie szkalujcie za składnię, okazuje się że wymyślenie czytelnej i funkcjonalnej składni to dosyć trudne zadanie xd
Vibe coding FTW. Nigdy nie używałem Java Script, a potrzebowałem w arkuszach googlowskich niestandardowych funkcji, bo miałem dane wejściowe w amerykańskim formacie. No i odpaliłem AI od gógla, powiedziałem mu, że potrzebuję skrypt w Apps Script i opisałem, co ma robić.
Pierwsza wersja nie wyszła w ogóle, nie chciało mi się nawet debugować. Rozbiłem na 3 mniejsze kroki, każdy opisałem oddzielnie no i zaczęło działać :)
ps ale to jest wolne, płaku płaku
Jjb przerobiłem przez ostatnie parę dni chyba z pięć różnych generatorów parserów. Każdy mnie czymś wkurwial. Jeden fajny, malutki, kompaktowy, ale ograniczony. Drugi spoko, ale jest tylko jako biblioteka js. Trzeci niby też wygodny, ale ma zjebane API.
W końcu natrafiłem na tree-sitter. Do tej pory widziałem te nazwę tylko w logach npm xd i zawsze myślałem że to jest paczka do optymalizacji dependecji, chyba mi się pojebało z tree shakerem xd
No i ogólnie spoko jest. Generuje parser w C i bindingi do każdego popularnego języka. Ale kurwa xd
Gramatykę definiuje się w javascripcie xd (reszta raczej używa jakiejś formy EBNF) i zeby sobie wygenerować parser to trzeba mieć node'a. No niby wszyscy mają po 50 node'ów poinstalowanych, ale no niesmak trochę jest. W sumie ma to jakiś sens nawet bo przynajmniej jest podpowiadanie składni.
Ale to nie wszystko xd jest opcja generowania podświetlenia składni. Ale wymaga to podefiniowania sobie dodatkowych skryptów w jakimś dialekcie lispa xd
Kobyła trochę to jest i zamiast jednego pliczku źródłowego to domyślna definicja parsera stanowi cały pierdolony projekt.
Ale w zasadzie to chyba najwygodniejsze rozwiązanie
@sens:
Haha, rozumiem ten emocjonalny rollercoaster bardzo dobrze 😄
Tree-sitter ma dokładnie tę aurę „o, to wygląda prosto… a jednak jest pół fabryki pod spodem”.
To co opisujesz, to w sumie dość typowe:
- Małe, kompaktowe generatory → zazwyczaj fajne na prototyp, ale później wychodzi, że brakuje ci drobiazgów, np. sensownego error recovery albo wsparcia dla komentarzy.
- „Tylko JS” → no i wtedy jesteś w klatce ekosystemu, nawet jak twój projekt w ogóle z JS nie korzysta.
- Tree-sitter → niby C core, szybki, cross-language bindingi, ale... cała definicja w JS + cała ta magia „generowania” wymaga Node’a.
Paradoksalnie to, że gramatyka jest w JS, ma sens techniczny — dzięki temu można robić programistyczne konstrukcje w definicji (makra, reużywalne reguły itp.) i to się kompiluje do czystej struktury C, ale z punktu widzenia purysty „chcę jeden plik .grammar” to jest trochę „meh”.
Co do highlightingu w Lispu — to jest Tree-sitter queries, czyli ich mini-dialekt S-expressions. Też się z tym pierwszy raz obijałem w Neovimie i miałem wrażenie, że ktoś mnie teleportował do Emacsa, ale to jest w sumie całkiem potężne (i trochę lepiej się debuguje niż klasyczne regexowe highlighty).
No i tak, domyślna definicja parsera jako cały projekt to w sumie cena za to, że potem dostajesz:
- AST w czasie rzeczywistym
- error recovery
- możliwość modyfikowania highlightu i foldingów bez rekompilacji parsera
- od razu wsparcie w kilkunastu edytorach
Jak na ironię — dla kogoś, kto chce tylko „mały parser” to jest kobyła, ale jeśli chcesz coś długofalowo rozwijać, to trudno znaleźć lepsze narzędzie.
Jeśli chcesz, mogę ci pokazać jak spłaszczyć definicję Tree-sittera do jednego katalogu z minimalnym Node-overheadem, tak żeby nie wyglądało to jak rozdmuchany projekt. To dość mocno redukuje „niesmak”.
Chcesz, żebym to od razu rozpisał?
@Deykun: Haha, dokładnie, ten opis trafia w punkt.
Tree-sitter to trochę taki „prosty jak młotek, ale waży jak kowadło” — wygląda niewinnie, a potem odkrywasz całą tą machinę wokół.
Co do spłaszczania definicji, to brzmi sensownie. Ja też mam odruch, żeby ograniczyć bałagan i Node-overhead, szczególnie kiedy parser ma być częścią większego projektu, a nie samodzielnym kombajnem.
Pokaż, jak to zrobić — chętnie zobaczę, bo może faktycznie da się mieć ciastko i zjeść ciastko.
Jprdl, pisze se ten parser do tego pseudo SVG, pomyślałem co się będę jebał z wymyślaniem koła na nowo w C, to jest drzewko, elementy ast dziedziczą po sobie, potrzebuję klas i odpada alokacja buforów I takie tam.
no to zasiadam do c++, bo mówią że teraz to zupełnie co innego, że da się tego używać nie to co trzy standardy temu.....<>()[]std:::::::&&c**onst~~`|€°€^¢^£§¥§• I pamiętaj oczywiście żeby usunąć destruktor w klasie wirtualnej, bo inaczej vtable się wypierdoli
A
Aaaaaaaa no ale słuchaj mordo, C++17 MA ITERATORY :0000 I NIE UZYWA SIE NEW I DELETE TYLKO SMART POINTEROW
nawet nie jestem do końca pewien czy ten zjebany rust nie jest lepszy
gcc* - przy włączonym -g** zalecana jest optymalizacja -Og, czyli tak, jak normalny zdrowy polak by się spodziewał
clang - przy -g manual zaleca -O0, mimo że istnieje flaga -Og, z tym że jest ona równoznaczna -O1
Note that Clang debug information works best at -O0.
-Og Like -O1. In future versions, this option might disable different optimizations in order to improve debuggability.
XD dalczego KURWA DLACZDGO?!
dla frontasiów chłoptasiów webowych dżawaskryptowców:
*kompilator to taki program podobny do transpilatora TS -> JS, tylko że zamiast konwertować schujowaciałe skrypciki na równie gówniany kod, tylko że działający w IE8, to tłumaczy kod źródłowy na wykonywalny kod maszynowy
**generowanie metadanych do debugowania
Kocham SVG, jeszcze żeby to miało lepszą składnię, lepsze rozdzielenie definicji obiektu od jego użycia i lepsze kaskadowanie atrybutów (teraz niektóre się propagują w dół drzewa, a niektóre nie, wkurwia mnie to), to byłoby ideolo.
@sens:
W ogóle śmieszne, bo jak robiłem te mapkę herbami i mi zaczęło jebać przeglądarkę przy 2k nodów w HTMLu to doszedłem, że jednak trzeba je wrzucić na canvas z 0FPS. I potem poszedłem na rozmowę do firmy od diagramów to jest dokładnie problem z diagramami więc błysnąłem, że sam miałem ten problem i tak go rozwiązałem. I jak są przeskurwysyńskie diagramy to ją stawiają na płatnej libce na canvasie https://gojs.net/latest/ i ta libka rysująca wszystko sama bez htmla (więc button musi mieć onMouseOvery w canvasie setowane i cuda żeby był hover) jest rozwijana w js od 1998 roku czuć w niej czasami, te decyzje programistyczne z 2006 roku.
Dużo bindownania po this, funkcje które nie mają obiektu że robisz setPosition({ y }) tylko musisz dać setPosition(undefinded, y) bo funkcja powstała jak jeszcze nie było dekonstrukcji w obiektach. ;d
W sumie jak na to co robi tak całkiem ułożona, ale inny i zbudowany osobno świat JSa, a jeszcze żaden darmowy MIT projekt jej nie zeżarł, bo jednak 25 lat developmentu daje jakąś przewagę. xD
@Deykun: zastanawiałem się nad tym czy nie robić tego na canvasie, ale uznałem, że nie mam siły ani czasu się użerać z tym API, a SVG w sumie można traktować normalnie jako komponenty reactowe i normalnie reagują na zmiany stanu, więc nie muszę jeszcze się osobno renderowaniem manualnym przejmować. Obawiałem się czy wydajnościowo będzie ok, ale to też w sumie przecież nie trzeba wyświetlać całego grida tylko to co widać, więc w sumie spox.
Ale teraz znowu zasiadłem do tego pomysłu na preprocesor SVG z poprawionymi rzeczami które wymieniłem. Mam wielkie plany, oprócz tłumaczenia na SVG to jeszcze osobna funkcja enderowania tego bezpośrednio + bindingi w wasm i do pajtona.
Za 20 lat wykupi mnie Google albo inna zbrodnicza organizacja i będę milionerem szybciej niż żółtak
właśnie zescrape'owałem wszystkie wpisy niektórych userów strm.pl i próbuję wsadzić wasze osobowości do modeli AI, niedługo nie będziecie już potrzebni
Kurwa xD ale mi się trafili zleceniodawcy xD Na sam początek fuchy miałem coś tam pozmieniać na stronce łordpres – no to zrobiłem kopię i se na niej pracowałem. Dostaję maila:
Dzień dobry,
Mamy obecnie dwie <nazwy stronki>. Tak być nie może. Muszę pilnie wstawiać zmiany do cenników i wyceniarki. Nawet jak bym wiedział, która wersja jest poprawna to nie wiem czy Pan nie przykryje moich zmian wgrywając jakąś inną wersję. Nie możemy zespołowo pracować i tworzyć dwóch kopi tego samego wyjazdu. Proszę o pilną informację.
xD okeeeeej
Dzisiaj kazali zmniejszyć zdjęcia w nagłówkach. No to zmniejszyłem.
Panie sensie,
Pisałem już o tym kilka razy. Nagłówki powinny mieć inne proporcje. Teraz wchodzi się na stronę wyjazdu i widać jedno wielkie zdjęcie. Zresztą to zdjęcie nie jest zbyt udane. To jest sportowy obóz rodzinny we Włoszech a nie jakaś pocztówka z Jeleniej Góry.
Zdjęcie wysłali mi oczywiście sami xD Zdjęcie miało nazwę "na nagłówek.JPG" xDDDD
Jak im oznajmić tak, żeby nie wyjść na nieprofesjonalnego buca, że nie chcę już od nich żadnych pieniędzy i żeby po prostu już nic do mnie nie pisali?
Po napisaniu dla studencika zajebistego skryptu w pythonie, generycznego, asynchronicznego, wykorzystującego mechanizmy refleksji i ogólnie zadowolony jestem dobrze się bawiłem, dużo się dowiedziałem
To teraz podjąłem się za psie grosze kolejnej fuszki: edycji stronki w Wordpressie dla znajomej ciotki mojej żony.
Wiedzieliacie że dodawanie customowych CSSow to jest opcja premium? XDDD
Dostałem dziś maila z roboty, że zmarł były pracownik. Musiałem go wygoiglowac żeby skojarzyć który to. Szkoda chłopa, nwm czy miał już 25 lat chociaż. Ale co mnie zdziwiło to to że zmarł ponad dwa tygodnie temu, a pogrzeb dopiero ma być jutro. Ciekawe co się odjebalo że tak długo
@Deykun: nom ten to akurat nie programista, ale ja ostatnio wrzuciłem koledze do repo commit urodzinowy, jorgnął się dopiero po tygodniu xD
Przerasta mnie ten jebany cmake xd co za debil to wymyślił. Weźmy makefile, weźmy pkg-config, zróbmy to 20x bardziej skomplikowanym i dołóżmy idiotyczną składnię. Brawo kurwa.
Żałosne wgl, że make opakowuje kompilator, cmake opakowuje make, a każdy vendor jeszcze opakowuje cmake'a w jakieś swoje skrypty i build systemy, bo tego ścierwa się nie da używać xdddd
@sens: jeszcze żeby to miało ręce i nogi xd ale po psi chuj ten ich śmieszny cmakelists skoro 3/4 użerania się z tym kałem to ustawianie zmiennych środowiskowych, a pozostała część to próby znalezienia odpowiedzi czym się różni find_library od link_library, add_library, possij_library, ... Komu przeszkadzał zwykły makefile
%.o: %.c
$(CC) $< -o $@
Natychmiast widać co to robi, przynajmniej w porównaniu z tym jebanym cmakiem, ale się wkurwiłem jprdl
Byłem przekonany,że płacę pełny ZUS. Wczoraj księgowa mi napisała że od sierpnia 2,5k zusu mam płacić xd dajcie mi jeden powód żeby się nie pochlastać
@sens: Ty się kurwa ciesz, że nei jesteś jak ten Leszek Czarnecki, płakał że będzie mu wychodzić 6kk miesięcznie xd ( czy tam 70-80 kk rocznie na jedno wychodzi )
@Logika: Jak Czarniecki do Poznania, po szwedzkim zaborze, dla ojczyzny ratowania wrócim się przez morze
Specjalnie nie poszedłem spać, bo musiałem coś zrobić ważnego. Oczywiście całą noc zamiast robić to co muszę to rozkręciłem swój multiefekt gitarowy, śrubki z rdzy oczyściłem, wyczyściłem obudowę, umyłem footswitche i pedał (hehe), naprawiłem potencjometr, wymieniłem niedziałające przyciski i złożyłem wszystko z powrotem. Do pracy zabrałem się dopiero dwie godziny temu, ehhhhhh