W tym projekcie przedstawiam wgląd w specyfikację PDF i umożliwiam interaktywne operowanie na tworzonym kodzie, przesyłając go do samodzielnie napisanego serwera. Zobaczysz, jak stworzyć prosty dokument PDF. Przykłady kodu i praktyczne wskazówki ułatwią wdrożenie tych rozwiązań w Twoim projekcie.
infinityhost.ct8.pl/code_11_pla/
infinityhost.ct8.pl/code_11_ena/
Glenford J. Myers, "Projektowanie niezawodnego oprogramowania", WNT 1980, oryginał John Willey and Sons 1976, rozdział Języki programowania programowania a niezawodność, podrozdział Procedury i zakresy danych:
Podstawowa reguła powiada, że - o ile programista nie określi jej inaczej - zmienna powinna być lokalna względem jednego modułu lub procedury. W APL przyjęto wręcz odwrotną zasadę: jeśli programista jawnie nie określi zmiennej jako lokalnej względem danego modułu (funkcji APL), to jest ona zmienną globalną. To zjawisko powoduje zdradliwe błędy, na przykład wówczas, gdy programista konsekwentnie używa zmiennej I jako sterującej pętlą w wielu funkcjach APL, lecz przynajmniej w jednej z nich zapomina okreslić I jako zmienną lokalną.
(...)
Należy przyjąć kilka zasad kontroli zakresu i globalności danych. Wszystkie dane powinny być lokalne względem procedury, w której są deklarowane, jeżeli programista nie określi ich inaczej.
Skądś znajome? Przeczytawszy to od razu pomyślałem o JavaScripcie, który powstał 19 lat później. Jeżeli nie znacie JS i nie wiecie o co chodzi, poniżej podaję przykład sytuacji opisanej na przykładzie obecnie bardzo mało popularnego już APL występującej w JavaScripcie.
A podobno rozważano stworzenie języka dla przeglądarek opartego na Scheme...
Swoją drogą nie do końca prawidłowe jest też współczesne używanie języka stworzonego do irytujących animacji na stronach w dużych aplikacjach serwerowych.
function aaa () {
/* Zapomniałeś deklaracji. */
i = 0; /* Nada wartość 0 zmiennej GLOBALNEJ o nazwie i,
tworząc taką jeśli nie istniała. */
}
function bbb () {
/* ... */
++i;
aaa (); /* Nic z tego, i jest teraz w stanie pozostawonym
przez funkcję aaa. */
/* ... */
}
Poprawnie byłoby:
function aaa () {
var i; /* Deklaracja zmiennej wewnątrz funkcji,
co czyni ją zmienną lokalną. */
i = 0;
}
Zostań Prelegentem na 4Developers Wrocław i Łódź!
Masz wiedzę i doświadczenie, które chciałbyś przekazać innym? Dołącz do nas jako prelegent na 4Developers! Szukamy ekspertów na następujące ścieżki:
Wrocław: Architektury Aplikacji, Cloud & DevOps, Java, JavaScript, Security, .NET
Łódź: Architektury Aplikacji, Cloud & DevOps, Java, JavaScript
Dlaczego warto?
Jak się zgłosić?
Wypełnij formularz zgłoszeniowy, podając temat i krótki opis prelekcji.
CFP 4Developers Wrocław - https://cfp.4developers.org.pl/wroclaw-2024/
CFP 4Developers Łódź - https://cfp.4developers.org.pl/lodz-2024/
No i światło dzienne ujrzał program służący do wykonywania prostych skryptów, o którym marzyłem od dawna i pisałem sobie w wolnym czasie.
https://github.com/andrzejlisek/ScriptSDCCWeb
Sam pomysł nie jest nowy, tylko bardzo stary, zrealizowany w tym projekcie: https://github.com/andrzejlisek/ScriptSDCC
Historycznie, pomysł był taki, żeby na szybko coś przeliczyć, na szybko coś namalować. Zamiast wymyślać jakiś język skryptu, postawiłem wtedy na coś gotowego, co już prawie rozwiązywało problem. Jest program https://sdcc.sourceforge.net/ , który kompiluje kod w języku C do różnych mikroprocesorów 8-bitowych, czyli prostych w symulacji. Miałem już gotową implementację procesorów 8051 i Z80 zrealizowaną na potrzeby innych programów, czyli wystarczyło wziąć gotowy kod, odpowiednio dostosować, usunąć, co niepotrzebne i już.
Interakcja z użytkownikiem też jest prosta. Na potrzeby tego jest określony adres w pamięci zwany jako "swap page", czyli strona wymiana danych. Wystarczy śledzić jeden wybrany bajt w tej pamięci i jak zmieni wartość, to symulator wykona określoną czynność, np. wypisze tekst, pobierze dane, namaluje coś. Pomysł został zrealizowany z powodzeniem, a nawet posłużył do sprawdzenia, jak duży obszar w pamięci zajmuje dany program, a nawet do testowania różnych algorytmów implementowanych w SDCC na potrzeby implementacji czegokolwiek.
Bardzo szybko zamarzyło mi się, żeby mieć taki program na telefonie, choćby bez kompilacji, bo na telefonie nie można uruchomić SDCC. Pomysł odpuściłem, bo jakoś nie widziało mi się przerabiać tego wszystkiego do JavaScript. Teraz, WebAssembly umożliwia tworzenie "logiki biznesowej" w C++, więc wróciłem do tego projektu. Jednakże, zamiast przerabiać na 1:1, co nie byłoby łatwe, postanowiłem zrobić interfejs od początku, wg nowego pomysłu. Głównym elementem interakcji będzie prosty formularz, co zresztą zacząłem realizować w starym projekcie, ale nie skończyłem i nie publikowałem. Grafika będzie taka sama, jak w poprzednim projekcie, same algorytmy malowania już miałem w tamtym projekcie.
W ten oto sposób projekt zrealizowałem bazując na źródłach starego i spełnia swoją funkcję. Dodatkowo dorobiłem symulację procesroa 6502, bo to tez jest prosty procesor, a SDCC od którejś wersji kompiluje do niego. W celu demonstacji możliwości ScriptSDCC, umieściłem kilka skryptów zarówno w postaci źródłowej, jak i skompilowanej na wszystkie trzy procesory, a także opisałem te skrypty wraz ze screenami. Na screenach widać, że grafikę można prezentować z różnych perspektyw, skalować w różny sposób. Co prawda, bardzo daleko do zaawansowanych narzędzi przeznaczonych do tego celu, jak np. Matlab, a w grafice bardzo dalego do możliwości OpenGL, ale to miało być proste narzędzie, łatwe w użyciu i celem nie jest "konkurowanie" z profesjonalnym oprogramowaniem.
Oprócz podstawowego zastosowania narzędzia, można porównywać, jaki obszar pamięci zajmuje kod tego samego na różnych procesorach, a także porównywać wydajność, bo o ile tempo pracy silnika jest podobne (liczba instrukcji na sekundę), o tyle czas wykonania jakiegoś przeliczenia może się znacznie różnic.
The web script launcher based on ScriptSDCC project - andrzejlisek/ScriptSDCCWeb
https://github.com/andrzejlisek/ScriptSDCCWeb@andrzejlisek: rozumiem, że to miałeś i bardzo dobrze, że używasz czego co masz i znasz. To oznaka doświadczenia u programisty. Niestety martwi mnie jedno - dlaczego tego użyłeś? W sensie, ja tutaj widzę sytuacje taką jak - mamy zalaną piwnicę i musimy wypompować wodę do rowu. Ja bym tutaj widział, włożyć pompę do piwnicy, a wąż do rowu i heja! W twoim rozwiązaniu widzę, że pompa jest w piwnicy, wąż jest w zbiorniku buforowym, w którym jest kolejna pompa co już pompę wodę z bufora do rowu... Jakby ten element jest zbędny. Już nawet nie wspominam o SDL, zostawmy to - ale dlaczego do uruchamiania "skryptów w C" używasz SDCC oraz emulatora Z80, a nie po prostu GCC/MinGW czy CLanga? Przecież można skompilować kod dla x86/x64, uruchomić i tyle. W zasadzie to nawet make to ogarnie czy skrypt basha. Dlaczego użyłeś emulatora i SDCC a nie środowiska natywnego oraz kompilatora C? Ew. czego brakuje w rozwiązaniu gotowym jak https://www.mycompiler.io/pl/new/c ?
@roark.dev: Przyjmuję do wiadomości, że przyjęte rozwiązanie ma swoje wady i podchodząc do tego zupełnie inaczej można mieć to samo lepiej. O apce MyCompiler.io nic nie wiedziałem, znałem Ideone.com o podobnym zastosowaniu. W początkach, pomysł z maszyną wirtualną w jakiejkolwiek formie (mało istotne, czy to będzie emulacja Z80, czy przykładowo wirtualna maszyna w stylu JVM, ważne, że coś prostego w implementacji) ma też to do siebie, że można kontrolować wykonanie programu poprzez uruchomienie, zatrzymanie, odczyt i zapis stanu maszyny, innymi słowy, program nadzoruje uruchomiony skrypt, a skrypt nie jest częścią programu, co ma miejsce przy natywnej kompilacji. Oczywiście, że w C, czy C++ czy jakimkolwiek innym języku kompilowanym natywnie też da się to mieć poprzez wątki. W tamych czasach (kiedy to powstał desktopowy ScriptSDCC) dośc intensywanie korzystałem z SDCC na potrzeby związane z 8051 i Z80, co też miało wpływ na ten pomysł, to dodatkową zaletą (już nie związaną z zastosowaniem tego programu) była możliwość podglądu, jak kompilator rozmieszcza kod i dane w pamięci, jak opcje kompilatora na to wpływają. Myślę, że nie ma sensu na siłę wymyślać argumentów będących odpowiedzią na pytanie "dlaczego akurat tak to zrealizowałem".
Ostatnio pracowałem nad side project na Supabase i musiałem zaimplementować RBAC. Moje rozwiązanie okazało się na tyle interesujące, że zyskało uznanie samego Supabase i znalazło się w ich community highlights!
Kluczowe w moim podejściu było wykorzystanie bogatego zestawu narzędzi, które oferuje PostgreSQL. Okazało się, że całą kontrolę dostępu opartą na rolach można skutecznie zrealizować bezpośrednio na poziomie bazy danych. Jeśli jesteś ciekaw szczegółów, zapraszam do przeczytania mojego artykułu tutaj https://devstuffs.substack.com/p/dead-simple-role-based-access-control.
Pojęcia nie mam co to Supabase, ale to co napisałeś brzmi, spoko, więc daję lajka :-D
@PaulGilbert: Taka alternatywa do firebasa od googla :v. A tak całkiem serio tworzysz baze i na podstawie schemy masz z automatu cruda + authN/Z w paczce więc mechanizmami bazodanowymi możesz opendzlować temat autoryzacji do konkretnych zasobów np masz dostęp jaki uzytkownik robi request HTTP albo graphql (który tłumaczony jest do zapytania) a ty na poziomie RLS robisz walidacje czy uzytkownik X może wykonać operacje na wierszu Y. Można powiedzieć taka platforma low-code.
To chyba oczywiste. Języki pozwalają na takie "ficzery" tylko dlatego, że w przypadku dynamicznych języków jest to proste (zmienne i tak są trzymane w wielkiej hashmapie) i dużo prostsze w implementacji niż poprawne zmienne per scope