Spring 5 i reactive

Spring 5 i reactive
FI
FI
  • Rejestracja:około 10 lat
  • Ostatnio:prawie 4 lata
  • Postów:471
0

https://spring.io/blog/2016/09/22/new-in-spring-5-functional-web-framework

Moje pytanie: czy to jest fajne (zakladamze tak), ale jesli tak to dlaczego?

M9
  • Rejestracja:prawie 10 lat
  • Ostatnio:prawie 6 lat
0

Jak dla mnie jest fajne bo:

  • nie zużywa 1 wątku na 1 request (mniej zasobów OS pożera)
  • Spring MVC bez tuningu wygląda jak wymiociny
  • programowanie reaktywne generalnie nie blokuje, czyli klient dostaje future i odpowiedź wtedy gdy jest rzeczywiście gotowa
  • jest dołączony sensowny klient (nie tylko RestTemplate, który piękny nie jest)
  • standardowe wsparcie ze Springiem, co oznacza bezproblemową i darmową integrację z najpopularniejszą platformą javową: spora szansa na użycie w pracy
  • będzie wsparcie dla Kotlina out-of-box
edytowany 3x, ostatnio: margor90
S9
  • Rejestracja:ponad 10 lat
  • Ostatnio:5 miesięcy
  • Lokalizacja:Warszawa
  • Postów:3573
0

Dla mnie to nie jest dobre, teraz wszyscy są modni i chcą być reaktywni, ale jakoś w backendzie średnio reaktywne programowanie mi pasuje. Np. na androida jest doskonałe, ale tutaj jakoś mi po prostu nie pasuje, zwykły Spring mi bardziej leży. No i co z zarządzaniem transakcjami?


"w haśle <młody dynamiczny zespół> nie chodzi o to ile masz lat tylko jak często zmienia się skład"
S9
dyskutujemy w postach nie komentarzach
M9
  • Rejestracja:prawie 10 lat
  • Ostatnio:prawie 6 lat
0

@scibi92 Dla mnie asynchroniczne programowanie zdarzeniowe to nie jest jakaś moda i hype to było od zawsze API nie zawsze było super przyjemne. Jak dla mnie nie wszędzie potrzebujesz transakcji. Poza tym dochodzi CAP i transakcyjność nie zawsze się przydaje (coś kosztem czegoś: transakcje się nie skalują). Jak ktoś pisze jakieś ERP to raczej nie potrzebuje takich zabawek. Nowoczesny frontend aż się prosi, aby pracować z róznymi future'ami / promisami.

edytowany 1x, ostatnio: margor90
S9
  • Rejestracja:ponad 10 lat
  • Ostatnio:5 miesięcy
  • Lokalizacja:Warszawa
  • Postów:3573
0

Co to CAP? No według mnie bez transakcji to sobie to cięzko wyobrazić programowanie, również w systemach ERP.


"w haśle <młody dynamiczny zespół> nie chodzi o to ile masz lat tylko jak często zmienia się skład"
edytowany 1x, ostatnio: scibi92
M9
  • Rejestracja:prawie 10 lat
  • Ostatnio:prawie 6 lat
0

Nie każdy system to ERP czy przerzucanie kasy z jednego konta na drugie. Czasem system wymaga zachowania wysokiej dostępności (często auto-skalowalności) i i bezawaryjnej pracy kosztem spójności danych (aplikacje typu Amazon albo Netflix). Zależy od wymagań.

Mi Spring 5 reactive przypomina mocno Spark Java (co jest na + oczywiście: nie trzeba integrować technolgii dostawców spoza Spring, mniej roboty, mniej problemów, lepsze wsparcie, mniej błędów, mniejsze ryzyko).

https://en.wikipedia.org/wiki/CAP_theorem

edytowany 4x, ostatnio: margor90
S9
  • Rejestracja:ponad 10 lat
  • Ostatnio:5 miesięcy
  • Lokalizacja:Warszawa
  • Postów:3573
0

No tak, jeśli wysoka dostępnośc jest ważniejsza od spójności danych to ok, akurat Java to często e-commerce i banki więc na ogół spójność danych jest dosyć istotna ;)


"w haśle <młody dynamiczny zespół> nie chodzi o to ile masz lat tylko jak często zmienia się skład"
edytowany 1x, ostatnio: scibi92
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 4 godziny
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4706
0

Non blocking to tylko miła rzecz dla wydajności. Tu chodzi o czystość kodu. Pożyjecie - docenicie.


jeden i pół terabajta powinno wystarczyć każdemu
M9
Poza tym do non blockng aby było to naprawdę wydajne trzeba miec niesynchroniczny sterownik do bazy. Ale i tak uważam zużywanie wątku na request za marnotractwo.
SZ
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:616
2

Ale o jakiej wydajności tutaj piszemy, wydajniej co to znaczy konkretnie. Mamy systemu na których pracuje 100 tys użytkowników i obsługuje to dwa tomcat(8core,16GB) + apache w load balancerze.
Nie każdy z nas pisze ogromne systemy..w zasadzie mniejszość, niestety ta mniejszość to ogromne firmy które dużo krzyczą, że reaktywność, że wydajność, że microservice itp. ale 95% softu tego nie potrzebuje

S9
  • Rejestracja:ponad 10 lat
  • Ostatnio:5 miesięcy
  • Lokalizacja:Warszawa
  • Postów:3573
2

Jarek mój ulubiony hype-drive developer :) No tak reaktywnośc bardzo zwiększa czytelność backendu. No bo jak mamy mapowanie URL i wywołanie po kolei metod z innych obiektów to jest bardzo nie czytelne :D

Kopiuj
@RequestMapping(value = "/rest/users/",method = RequestMethod.Post)
public void registerUser(UserRegisterForm userRegisterForm){
 userAccountService.registerUser(userRegisterForm);
}

Nikt nie domyśli się o co chodzi, najlepiej wszędzie dawać lambdy subsciption i obervable :D


"w haśle <młody dynamiczny zespół> nie chodzi o to ile masz lat tylko jak często zmienia się skład"
edytowany 1x, ostatnio: scibi92
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
8

Myśle że @jarekr000000 chodzi raczej o to że wszystko masz w swoim kodzie i to jest pewna różnica czasami. Jeśli masz @RequestMapping to liczysz na to ze Spring magicznie tą adnotacje ogarnie ładując sobie ten @Controller. Jak się pomylisz w konfiguracji kontekstu to może się okazać ze wstanie ci 99 kontrolerów a jeden nie, bo nazwa pakietu się zmieniła i nagle nie wiadomo czemu nie działa kawałek API aplikacji ;)
Kiedy masz to w swoim kodzie, to możesz zawsze postawić breakpoint i zobaczyć co się dzieje i dlaczego coś nie chce działać.

Z życia wzięte kiedy ostatnio takie "magiczne" rozwiązanie trochę mnie zabolało: mamy w jednym projekcie Spring Data i jakieśtam repozytorium extendujace CRUDRepository które czyta sobie z MongoDB. No i okazało sie ze raz na jakiś czas pewne dane w Mongo ulegają zmianie a nie powinny i nie wiadomo skąd ta zmiana przychodzi. Normalnym pomysłem byloby odpalić remote debug, postawić breakpoint w miejscu gdzie mamy metodę do komunikacji z Mongo i czekać aż sie triggeruje. Tylko ze takiej metody nie ma, bo mamy tylko ten interfejs z którego Spring Data w locie generuje kod. Można dać breakpoint na metodę interfejsu, ale wtedy znow lekki hardkor bo nagle mamy breakpoint na kilkuset klasach w classpath które ten interfejs rozszerzają i na kilkunastu faktycznych repozytoriach w naszym kodzie, co powoduje że aplikacja nagle zwalnia ze 100 razy...


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
0
scibi92 napisał(a):

Co to CAP? No według mnie bez transakcji to sobie to cięzko wyobrazić programowanie, również w systemach ERP.

Trend jest raczej taki, że gdzie się da to się ludzie pozbywają transakcji czy relacyjnych baz danych. Zwłaszcza w distributed world, twierdząc, że tylko "eventually consistent" jest możliwe w takim świecie. A z reactive oczywiscie jest problem z brakiem async driverow.

Pierwszy raz słyszysz o CAP ?

0
Biały Mleczarz napisał(a):
scibi92 napisał(a):

Co to CAP? No według mnie bez transakcji to sobie to cięzko wyobrazić programowanie, również w systemach ERP.

Trend jest raczej taki, że gdzie się da to się ludzie pozbywają transakcji czy relacyjnych baz danych. Zwłaszcza w distributed world, twierdząc, że tylko "eventually consistent" jest możliwe w takim świecie. A z reactive oczywiscie jest problem z brakiem async driverow.

Pierwszy raz słyszysz o CAP ?

Trend jest raczej taki, że gdzie się da to się ludzie pozbywają transakcji czy relacyjnych baz danych - tam gdzie to możliwe. * (poprawka)

M9
  • Rejestracja:prawie 10 lat
  • Ostatnio:prawie 6 lat
1

@Szczery
Myślę, że tutaj chodzi o zrzucenie kosztów utrzymania infrastruktury. Jeśli środowisko jest stabilne i stać nas na duży zapas mocy, mamy własnych adminów to może nie jest to super krytyczne. Coraz częściej szybko rosnący (i szybko zdychający w 95% przypadków) biznes w przypadku startupów chce płacić za serwery, hosting, środowiska, bazy whatever dokładnie tyle ile potrzebuje, wtedy gdy dany core jest potrzebny. Chce też, aby aplikacja nie padła nagle, jak będzie szybki przyrost użytkowników (przykład, gdy padają np. serwery PKW albo serwery uczelniane, gdy wiele osób nagle sprawdza wyniki). Jak dla mnie auto-scaling itp. to jest coś za co biznes może chcieć płacić (bo pozwala np. oszczędzać na kosztach hostingu chmurowego i przy okazji zapewnia dostępność). Nie zawsze firma chce mieć własną infrastrukturę. Liczba użytkowników ma tutaj znaczenie drugorzędne.

Wydaje mi się, że takich aplikacji (dużo użytkowników, wymagana skalowalność) nie ma tak mało. Przykłady to wszelkie duże portale internetowe (np. Allegro, WP).

Zgadzam się w zupełności, że klasyczne aplikacje na JEE 5 czy Springu działają dla 80% aplikacji zamawianych przez biznes. I nie ma sensu pchać się wszędzie z mikrousługami. Ale warto mieć w miarę możliwości bezstanowy monolit: zawsze można podzielić w miarę potrzeby. Każde wymaganie to jednak coś za co klient musi zapłacić (a nikt za darmo nie zbuduje auto-skalującego się systemu).

Zgadzam się, że można robić skalowalne aplikacje blokująco (w końcu HTTP jest bezstanowy). Po prostu trzeba spalić więcej prądu.

edytowany 1x, ostatnio: margor90
TD
Skalowanie (ale większe koszty) można też osiągnąć korzystając z blokującego serwera, ale np. z Kubernetes, który będzie dokładał mocy obliczeniowej wtedy kiedy to potrzebne.
M9
Pozostaje też raczej dokładanie nowych instancji serwera do klastra, gdy skończą się pule wątków (szybko się zużyją dla klasycznych aplikacji request - response).
TD
W połączeniu Kubernetes + AWS to wszystko dzieje się chyba automatycznie. W firmie mam właśnie coś takiego, ale nie jestem pewny czy dobrze rozumiem jak to działa bo mamy od tego wszystkiego ogarniętych devopsow a sam jeszcze nie miałem kiedy się tym jakoś bardziej zainteresować.
rubaszny_karp
k8s to akurat nie jest nic magicznego i nie robi nic wincyj niż : przekraczasz zużycie CPU ? dodaj instancje - każdą dodatkową warstwę wirtualizacji !@# prądem (tak wiem że docker to nie wirtualizacja tylko użycie natywnych cgroups z linuxa)
0
margor90 napisał(a):

@scibi92 Dla mnie asynchroniczne programowanie zdarzeniowe to nie jest jakaś moda i hype to było od zawsze API nie zawsze było super przyjemne. Jak dla mnie nie wszędzie potrzebujesz transakcji. Poza tym dochodzi CAP i transakcyjność nie zawsze się przydaje (coś kosztem czegoś: transakcje się nie skalują). Jak ktoś pisze jakieś ERP to raczej nie potrzebuje takich zabawek. Nowoczesny frontend aż się prosi, aby pracować z róznymi future'ami / promisami.

Bo za reactive stoi obietnica lepszego zużycia zasobów przy pomocy tego całego NIO. - co w javie takie proste nie jest bo trzeba patrzec na implementacje clientow, kontenerów, połączeń do DB itp.
Sporo firm, które ma swoje usługi publicznie dostępne raczej o tym myśli by swoje zasoby odpowiednio wykorzystywać.

zyxist
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 6 lat
  • Postów:101
0

@Szczery -> mówimy o wydajności, kiedy w roku 2017 masz obsługiwać 100 tys. użytkowników, w roku 2018 - 1 milion użytkowników, a w roku 2019 - 10 milionów użytkowników :). Zgadzam się, że dla małych projektów "tradycyjne" podejście jest wystarczające, ale nawet takie małe projekty mogą nagle zmienić się w duże. Wg mnie fajnie, że powstają narzędzia, które pozwalają na przejście na wyższy poziom wtajemniczenia, gdy sytuacja tego zacznie wymagać.

Odróżniam przy tym stosowanie mikroserwisów od użycia programowania reaktywnego. Programowanie reaktywne można wykorzystać zarówno w małych, jak i w dużych aplikacjach i oba ich rodzaje mogą na tym skorzystać.


edytowany 1x, ostatnio: zyxist
0

Powiedzmy, że chcę zbudować nową, nowoczesną aplikację javową w środowisku mikroserwisów.
Dajmy na to, że chce, żeby to byl Spring Boot 2.0 i Spring 5.

jak rozumiem chcemy w tym wszystkim w wiekszosci utrzymac gdzie sie da komunikację asynchroniczną, nie blokowac niepotrzebnie wątków, non blocking, backpressure, fail safe, lepszy throughput itp.? I to są cale zalety tego ambarasu, czy tak?

A zeby sobie ulatwic zycie z async IO to potrzebne są nam rzeczy jak Reactor/RxJava2.0 ? I teraz bedzie jakby to dzialalo out of the box w Springu?
Bo wczesniiej tez mozna bylo uzyc np. RJavy ale byla troche malo zintegrowanym bytem z frameworkiem ? A teraz zarowno rest client, endpointy czy obiekty z bazy danych moga nam zwracac wszedzie Observable i calosc przetwarzania jest taka... reaktywna?

Czy rzutuje to w jakis sposob na strukture aplikacji ?
jak rozumiem pewnie tez inaczej obslugujemy error handling, czy tak?

jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 4 godziny
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4706
0

Spring 5 WebFlux + project reactor działa razem dobrze (musi). Do tego robię to w Kotlinie. Spring boota, beanów springowych, itp. nie używam ale też powinno razem działać
(zaprawdę czasem nie wiem jak, ale testy pokazują, że działa).


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 1x, ostatnio: jarekr000000
0
jarekr000000 napisał(a):

Spring 5 WebFlux + project reactor działa razem dobrze (musi). Do tego robię to w Kotlinie. Spring boota, beanów springowych, itp. nie używam ale też powinno razem działać
(zaprawdę czasem nie wiem jak, ale testy pokazują, że działa).

ok, ale zalozenia jakie napisalem powyzej... po co mi to wszystko wlasciwie... są sluszne?

jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 4 godziny
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4706
0

Czy rzutuje to w jakis sposob na strukture aplikacji ? jak rozumiem pewnie tez inaczej obslugujemy error handling, czy tak?

U mnie tak. Aplikacja, właściwie wszędzie rzuca Fluxem, bazy, pliki itp. Flux (projectreactor) stał się de fakto kluczową częścią API.
Czy to dobrze dla każdej aplikacji nie wiem (mam czasem wątpliwości) - u mnie akurat chodzi o przetwarzanie dużej ilości PDFów i przy tym ten koncept pasuje jak znalazł.


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 1x, ostatnio: jarekr000000
0
jarekr000000 napisał(a):

Czy rzutuje to w jakis sposob na strukture aplikacji ? jak rozumiem pewnie tez inaczej obslugujemy error handling, czy tak?

U mnie tak. Aplikacja, właściwie wszędzie rzuca Fluxem, bazy, pliki itp. Flux (projectreactor) stał się de fakto kluczową częścią API.
Czy to dobrze dla każdej aplikacji nie wiem (mam czasem wątpliwości) - u mnie akurat chodzi o przetwarzanie dużej ilości PDFów i przy tym ten koncept pasuje jak znalazł.

A uzywasz spring boota? niedlugo pewnie wyjdzie ale to dalej RC1.

jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 4 godziny
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4706
0

Spring boot 2 to jest od grudnia. Ale nie używam. Nie wiem po co miałbym. Jak bede chciał spowolnić start aplikacji o 10 sekund to dorzuce Thread.sleep.


jeden i pół terabajta powinno wystarczyć każdemu
0
jarekr000000 napisał(a):

Spring boot 2 to jest od grudnia. Ale nie używam. Nie wiem po co miałbym. Jak bede chciał spowolnić start aplikacji o 10 sekund to dorzuce Thread.sleep.

niby w jaki sposob boot ma cokolwiek spowolnic ? sluzy w zasadzie za bootstrap i tyle.
i Boot jest na razie w wersji RC1.

0
Biały Mleczarz napisał(a):

Powiedzmy, że chcę zbudować nową, nowoczesną aplikację javową w środowisku mikroserwisów.
Dajmy na to, że chce, żeby to byl Spring Boot 2.0 i Spring 5.

jak rozumiem chcemy w tym wszystkim w wiekszosci utrzymac gdzie sie da komunikację asynchroniczną, nie blokowac niepotrzebnie wątków, non blocking, backpressure, fail safe, lepszy throughput itp.? I to są cale zalety tego ambarasu, czy tak?

A zeby sobie ulatwic zycie z async IO to potrzebne są nam rzeczy jak Reactor/RxJava2.0 ? I teraz bedzie jakby to dzialalo out of the box w Springu?
Bo wczesniiej tez mozna bylo uzyc np. RJavy ale byla troche malo zintegrowanym bytem z frameworkiem ? A teraz zarowno rest client, endpointy czy obiekty z bazy danych moga nam zwracac wszedzie Observable i calosc przetwarzania jest taka... reaktywna?

Czy rzutuje to w jakis sposob na strukture aplikacji ?
jak rozumiem pewnie tez inaczej obslugujemy error handling, czy tak?

bump

SP
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 2 lata
  • Postów:127
0
Biały Mleczarz napisał(a):
jarekr000000 napisał(a):

Spring boot 2 to jest od grudnia. Ale nie używam. Nie wiem po co miałbym. Jak bede chciał spowolnić start aplikacji o 10 sekund to dorzuce Thread.sleep.

niby w jaki sposob boot ma cokolwiek spowolnic ? sluzy w zasadzie za bootstrap i tyle.
i Boot jest na razie w wersji RC1.

RC1 wersji 2.

Serwer WWW uruchamia się w czasie zero, wszystko inne jest zbędne :)

https://docs.oracle.com/javase/8/docs/jre/api/net/httpserver/spec/com/sun/net/httpserver/package-summary.html

jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 4 godziny
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4706
0
Biały Mleczarz napisał(a):
jarekr000000 napisał(a):

Spring boot 2 to jest od grudnia. Ale nie używam. Nie wiem po co miałbym. Jak bede chciał spowolnić start aplikacji o 10 sekund to dorzuce Thread.sleep.

niby w jaki sposob boot ma cokolwiek spowolnic ? sluzy w zasadzie za bootstrap i tyle.
i Boot jest na razie w wersji RC1.

OK. Tego RC1 nawet nie pamiętałem
Bootstrap musi poskanować klasy/jary, odpalić kontekts springowy. Nawet w niedużych aplikacjach jest to widoczne.
2 sekund na restart serwera nie zrobisz łatwo na Spring Boot.


jeden i pół terabajta powinno wystarczyć każdemu
0

Jakie są w zasadzie zalety tego wszystkiego ?

jarekr000000
ale czego? wszystkiego ?
0

@jarekr000000:
Powiedzmy, ze pracujesz z ludzmi ktorzy robia rzeczy w starym stylu, czyli 3 warstwowo, synchroniczne i publiczne co sie da z rzucaniem wyjątkow na prawo i lewo i nieogarnietym DI.

Jak ich przekonac, ze reactive/webflux/ itp. będą korzystne?

jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 4 godziny
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4706
1

Z mojego ostatniego projektu:

  • testowalność, pokazałem jak łatw napisac testy,
  • usability - pokazlem jak łatwo zrobić progress bar sensowny - bez gimnastyki,

... i i tak nie wszystkich przekonałem - mam jednego sceptyka uczulonego na programowanie funkcyjne.

Co do reactive - najpierw musisz mieć projekt gdzie to pasuje, przy czym jeśli masz odpowiednio zrypanych architektów to przysiądą do klienta na etapie omawiania koncepcji i ubiją mu całe usability, tak żeby pod spodem i tak tylko chamski CRUD wystarczal . Potem to już nie ma co wsadzać żadnego reactive.

Co do webflux i po prostu funkcyjnego pisania serwerów - trzeba siać, siać, siać... ja walczę.


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 4x, ostatnio: jarekr000000
0
jarekr000000 napisał(a):

Z mojego ostatniego projektu:

  • testowalność, pokazałem jak łatw napisac testy,
  • usability - pokazlem jak łatwo zrobić progress bar sensowny - bez gimnastyki,

... i i tak nie wszystkich przekonałem - mam jednego sceptyka uczulonego na programowanie funkcyjne.

Co do reactive - najpierw muszi miec projekt gdzie to pasuje, przy czym jeśli masz odpowiednio zrypanych architektów to przysiądą do klienta na etapie omawiania koncepcji i ubiją mu całe usability, tak żeby pod spodem i tak tylko chamski CRUD wystarczal . Potem to już nie ma co wsadzać żadnego reactive.

Co do webflux i po prostu funkcyjnego pisania serwerów - trzeba siać, siać, siać... ja walczę.

W zasadzie to ten webflux ma tak proste API, ze i prostego CRUDa tez latwo tym zrobic.
Ale pewnie tam gdzie jest intensive IO sie sprawdza lepiej.

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)