Bezpieczne języki programowania

Bezpieczne języki programowania
SB
  • Rejestracja:ponad rok
  • Ostatnio:3 miesiące
  • Postów:37
0

Mam takie pytanie: o co chodzi z bezpieczeństwem pamięci (memory safe) w językach programowania?
Rząd Stanów Zjedn. uznaje następujące języki za bezpieczne:

Go
Rust
C#
Swift
Java
Ruby
Python
Delphi/Object Pascal
Ada

(źródło https://readwrite.com/the-nsa-list-of-memory-safe-programming-languages-has-been-updated/
https://media.defense.gov/2023/Apr/27/2003210083/-1/-1/0/CSI_SOFTWARE_MEMORY_SAFETY_V1.1.PDF)

Dlaczego C/C++ są niebezpieczne a Python (czyli w zasadzie język skryptowy a nie klasyczny język programowania) jest podobno napisany w C już jest bezpieczny?
Z kolei Java to mi jako użytkownikowi kojarzy się z niebezpieczeństwem i grami Java na zabytkowe Nokie, wyłudzającymi SMS-y 😀
Jak widzę że program na PC wymaga wgrywania Javy to unikam jak ognia.

lion137
  • Rejestracja:około 8 lat
  • Ostatnio:4 minuty
  • Postów:4884
3

Python jest w napisany w C, ale jest warstwą nad C, i nie zrobisz w nim przepełnienia bufora.


Manna5
  • Rejestracja:prawie 6 lat
  • Ostatnio:dzień
  • Lokalizacja:Kraków
  • Postów:639
4

Z kolei Java to mi jako użytkownikowi kojarzy się z niebezpieczeństwem i grami Java na zabytkowe Nokie, wyłudzającymi SMS-y

W bezpieczeństwie języka nie chodzi o to, czy można w nim napisać wirusa, tylko o to, jak łatwo można w nim zrobić błąd ułatwiający shakowanie systemu który piszemy.


Spine
  • Rejestracja:prawie 22 lata
  • Ostatnio:20 minut
  • Postów:6628
3

@Manna5: Tutaj chodzi też o problemy z zarządzaniem pamięcią, co prowadzi do crashy i innych nieprzewidzianych sytuacji.

Bezpieczne języki pamięci pomagają minimalizować ryzyko błędów zarządzania pamięcią i związanych z nimi luk bezpieczeństwa, które stanowią poważne zagrożenie w aplikacjach produkcyjnych i systemach krytycznych. Wybór języka bezpiecznego pamięciowo zmniejsza ryzyko błędów i ułatwia tworzenie niezawodnego, odpornego na ataki oprogramowania.


🕹️⌨️🖥️🖱️🎮
SB
  • Rejestracja:ponad rok
  • Ostatnio:3 miesiące
  • Postów:37
0

A tak spytam z ciekawości, które z tych bezpiecznych języków są warte nauki, mają dobrą dokumentację i kompilują się do Windowsowego EXE (oraz dla Linuxa), jednocześnie nie wymagają potem dogrywania od użytkowników dodatków?

Bo ja jako użytkownik różnych programów nigdy nie lubiłem gdy trzeba dograć np. Javę.

Python to inna sprawa bo to to przydatne na co dzie narzędzie i na pewno uważam że Pythona warto się uczyć i mieć go zainstalowany, tylko zmieniam domyślne skojarzenie dla plików py na edytor żeby przypadkiem czegoś dziwnego nie uruchomić.

edytowany 1x, ostatnio: SiedemBoleści
stivens
  • Rejestracja:ponad 8 lat
  • Ostatnio:około godziny
3

Crash programu to tam pikus. Taki niepozorny stack/buffer overflow moze(* mogl) doprowadzic do przejecia stosu wywolan i zmienic flow programu

https://en.wikipedia.org/wiki/Return-oriented_programming


λλλ
lion137
  • Rejestracja:około 8 lat
  • Ostatnio:4 minuty
  • Postów:4884
0

@SiedemBoleści Warto, w jakim sensie? Dla przyjemności, biznesowo?


SL
  • Rejestracja:około 7 lat
  • Ostatnio:7 minut
  • Postów:866
0
SiedemBoleści napisał(a):

A tak spytam z ciekawości, które z tych bezpiecznych języków są warte nauki, mają dobrą dokumentację i kompilują się do Windowsowego EXE (oraz dla Linuxa), jednocześnie nie wymagają potem dogrywania od użytkowników dodatków?

Praktycznie wszystko. Golang to największy pewniak, który pójdzie na wszystkim. Rust podobnie, możliwe, że wymagane jest doinstalowanie vc++ runtime redistributable (co jest wymagane też dla C++). C# chyba też pozwala na kompliację w trybie AOT tak, że wynikiem jest .exe/binarka

SB
  • Rejestracja:ponad rok
  • Ostatnio:3 miesiące
  • Postów:37
0

Dodaj cytat.. Warto, w jakim sensie? Dla przyjemności, biznesowo?.

Ja zawodowym programistą to nie jestem i nie planuję być ale mam różne pomysły znam trochę Pythona i niewiele C++ ale Python bardziej mi się podoba.
Ale skoro to jest polskie forum to chyba "biznesowa" opcja też by wielu
zainteresowała żeby tworzyć większą konkurencje dla programistów z USA i Chin 😀

edytowany 3x, ostatnio: SiedemBoleści
Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:39 minut
0
SiedemBoleści napisał(a):

A tak spytam z ciekawości, które z tych bezpiecznych języków są warte nauki, mają dobrą dokumentację i kompilują się do Windowsowego EXE (oraz dla Linuxa), jednocześnie nie wymagają potem dogrywania od użytkowników dodatków?

Bo ja jako użytkownik różnych programów nigdy nie lubiłem gdy trzeba dograć np. Javę.

od dawna preferowaną opcją jest dystrybuowanie javy wraz z aplikacją. wybierasz dystrybucję javy darmową do użytku komercyjnego (np. https://adoptium.net/ ) i instalujesz oraz aktualizujesz wraz z własną apką. tak działają np. ide od jetbrainsów (aczkolwiek oni idą dalej i mają własny friendly fork javy).

javę możesz skompilować do natywnej apki (czyli np. bez kompilacji jit) za pomocą https://www.graalvm.org/latest/reference-manual/native-image/ ale to raczej przygoda dla znawców javy.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 2x, ostatnio: Wibowit
WeiXiao
  • Rejestracja:około 9 lat
  • Ostatnio:około 13 godzin
  • Postów:5108
1
slsy napisał(a):

chyba też pozwala na kompliację w trybie AOT tak, że wynikiem jest .exe/binarka

JITowa wersja to też .exe, a na dodatek możesz zrobić single file publish który będzie zawierał w sobie dotnet runtime :P

edytowany 1x, ostatnio: WeiXiao
dalbajob
  • Rejestracja:prawie 2 lata
  • Ostatnio:3 miesiące
  • Postów:149
0
SiedemBoleści napisał(a):

Bo ja jako użytkownik różnych programów nigdy nie lubiłem gdy trzeba dograć np. Javę.

Wgrywania Javy do odpalenia aplikacji desktopowej też nie lubię (patrz Minecraft). Ale jest masa aplikacji które nie są takimi programikami, które ty jako użytkownik końcowy, bezpośrednio odpalasz u siebie. Np. backend dla aplikacji webowej.

Przy wdrażaniu takiego backendu dogrywanie Javy to nie problem, bo albo robisz to raz na dany serwer, albo wdrażasz aplikację skonteneryzowaną. No i robią to deweloperzy, a ty jako użytkownik końcowy nie musisz nic robić poza uruchomieniem swojej przeglądarki.

Wibowit
Wgrywania Javy do odpalenia aplikacji desktopowej też nie lubię (patrz Minecraft). - serio minecraft wymaga osobnej instalacji javy? nie ma javy w środku?
dalbajob
Na Windowsie pewnie tak, ja to pod Linuchem instalowałem i trzeba było dociągać ręcznie i odpalać jar
pvw
  • Rejestracja:ponad 17 lat
  • Ostatnio:21 dni
  • Lokalizacja:Kraków
1
SiedemBoleści napisał(a):

Mam takie pytanie: o co chodzi z bezpieczeństwem pamięci (memory safe) w językach programowania?
Rząd Stanów Zjedn. uznaje następujące języki za bezpieczne:

Go
Rust
C#
Swift
Java
Ruby
Python
Delphi/Object Pascal
Ada

(źródło https://readwrite.com/the-nsa-list-of-memory-safe-programming-languages-has-been-updated/
https://media.defense.gov/2023/Apr/27/2003210083/-1/-1/0/CSI_SOFTWARE_MEMORY_SAFETY_V1.1.PDF)

Dlaczego C/C++ są niebezpieczne a Python (czyli w zasadzie język skryptowy a nie klasyczny język programowania) jest podobno napisany w C już jest bezpieczny?
Z kolei Java to mi jako użytkownikowi kojarzy się z niebezpieczeństwem i grami Java na zabytkowe Nokie, wyłudzającymi SMS-y 😀
Jak widzę że program na PC wymaga wgrywania Javy to unikam jak ognia.

irytujace sa bardzo sugestie negatywne na temat Java wsrod osob, ktore nie maja pojecia o Java 😀

Java's Safety Aspects
Java is considered one of the safer languages and was designed with security in mind from the start. Here’s how it stacks up:

Memory Safety: Java uses an automatic garbage collector, reducing risks of memory leaks and pointer-related vulnerabilities, such as buffer overflows. It also doesn’t allow direct memory access (like C/C++), which eliminates many risks.
Type Safety: Java’s static typing catches many potential errors at compile time. Type safety is enhanced by strong type-checking.
Sandboxing: Java runs code within the Java Virtual Machine (JVM), isolating applications in a sandbox, which restricts unauthorized access to the system.
Concurrency Safety: Java’s concurrency features (like synchronized blocks and the java.util.concurrent package) provide tools for writing concurrent code safely. However, they require proper use, as concurrency issues are still possible if not carefully managed.
Security Updates: Java has an extensive history of updates focused on security, particularly in the corporate and web application domains.


https://rozwoj-oprogramowania.pl
If You think of MS-DOS as mono, and Windows or macOS as stereo, then Linux is Dolby Pro-Logic Surround Sound with Bass Boost and all the music is for free
Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:39 minut
1
pvw napisał(a):

Sandboxing: Java runs code within the Java Virtual Machine (JVM), isolating applications in a sandbox, which restricts unauthorized access to the system.

to powinno wylecieć z materiałów o javie. ten sandboxing nigdy nie działał dobrze, a dodatkowo w przygotowaniu jest wywalenie sandboksa:
https://openjdk.org/jeps/486 JEP 486: Permanently Disable the Security Manager

Non-Goals
It is not a goal to provide a replacement for any of the Security Manager's functionality, in particular the ability to sandbox Java code.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:3 minuty
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
6

jeden i pół terabajta powinno wystarczyć każdemu
Manna5
Jak w związku z dużym zapotrzebowaniem na oprogramowanie zatrudnia się ludzi o mniejszych umiejętnościach albo ludzi którzy pracują tylko i wyłącznie żeby jak najszybciej działało i dostać pieniądze, nawet ze świadomością że nie ma pewności że program jest bezpieczny (chociaż się do tego nie przyznają), jeżeli jest podejrzewają off-by-1 to losowo dopisują -1/+1 aż "zadziała" zamiast zrozumieć w pełni działanie programu, nie testują go wystarczająco dużo itd. Oczywiście czasami to też wina pośpiechu tj. krótkich terminów niepozwalających na odpowiednią jakosc.
jarekr000000
@Manna5: ludzie są zawsze mniej więcej tacy sami -> robią błędy - nie da się tego jeszcze wyeliminować. Jak mimo to niektórzy decydują sie na pisanie w języku, który jest jednym wielkim polem minowym - to jest to już sabotaż.
superdurszlak
Często zespoły nawet nie próbują wymóc większego nacisku na jakość - a jednocześnie mając okazję by coś załatać tego nie robią. A jak ktoś się wyłamie, to potrafią jeszcze zbić po łapach. Tu nawet nie potrzeba C, by się władować w pole minowe.
WeiXiao
  • Rejestracja:około 9 lat
  • Ostatnio:około 13 godzin
  • Postów:5108
0
jarekr000000 napisał(a):

https://xeiaso.net/shitposts/no-way-to-prevent-this/CVE-2024-9632/

fresh:

https://old.reddit.com/r/cpp_questions/comments/1getghf/us_state_told_our_company_to_not_develop_in_c/

I am working for a US cyber security company and the state told our company to change our application's language which already has been developed by C++, because it's an unsafe language. This is a 3-years requirement.

This decision made me think about my career. Is C++ considered a bad language now?!

Note: Our team says we should pick Rust but it's not confirmed

edytowany 1x, ostatnio: WeiXiao
obscurity
  • Rejestracja:około 6 lat
  • Ostatnio:dzień
0
WeiXiao napisał(a):

This decision made me think about my career. Is C++ considered a bad language now?!

a kiedyś nie był? Tylko szaleńcy i hobbiści w nim piszą, trzeba być zwariowańcem żeby pisać w c++ cokolwiek innego niż program rysujący choinkę. Zwłaszcza odkąd są bezpieczniejsze alternatywy z tym samym performancem


"A car won't take your job, another horse driving a car will." - Horse influencer, 1910
WeiXiao
  • Rejestracja:około 9 lat
  • Ostatnio:około 13 godzin
  • Postów:5108
0
Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:39 minut
3
WeiXiao napisał(a):

A comparison of Rust’s borrow checker to the one in C#

nie czytałem całości jakoś uważnie, ale odnosząc się do https://em-tg.github.io/csborrow/#why-does-nobody-seem-to-be-talking-about-this

Why does nobody seem to be talking about this?

Maybe I’m bad at searching for these things, but these changes to C# seem to have gone completely under the radar in places where you read about memory safety and performance. Maybe it’s just because the language additions have happened super slowly, or maybe the C# and Rust communities have so little overlap that there aren’t enough people who program in both languages to notice the similarities. Maybe there’s something that makes C#’s ref subset so unusable that people just ignore it (I’ll admit to only having played around with it a bit, so far).

Here’s my theory: C# already had an equivalent to all of these things in its “unsafe” subset, so when introduced, ref-safety changes were typically framed as “bringing the performance of safe code closer to that of unsafe code,” which is arguably the opposite perspective of Rust’s “bringing the safety of high-performance code closer to that of high-level languages.” Perhaps that framing makes people miss that although the two languages are pushing in opposite directions, they might actually be getting closer together.

jak z samego artykułu wynika, refy z c# są biedne w porównaniu do rusta jeśli chodzi o możliwość wyrażania lifetime'ów. borrow checker w ruście jest po to, żeby móc całkowicie zrezygnować z gc, a tymczasem w c# refy mają ustawione lifetime'y na sztywno (co je mocno ogranicza) i integrują się z gc, co zwiększa ich możliwości (przybliża do możliwości rusta). ograniczeniem refów w c# jest np. to, że nie da się ich użyć w kodzie typu async.

największą praktyczną różnicą między refami z c#, a borrow checkerem z rusta jest to, że refy w c# to nisza, a borrow checker w ruście to podstawa całego kodu. jedynym sposobem, żeby wyłączyć borrow checkera w ruście jest kod unsafe. tak czy siak, mimo niszowości, refy z c# wyglądają na ciekawy bajer.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
obscurity
  • Rejestracja:około 6 lat
  • Ostatnio:dzień
0
Wibowit napisał(a):

ograniczeniem refów w c# jest np. to, że nie da się ich użyć w kodzie typu async.

od c# 13 można używać refów w async i asynchronicznych iteratorach


"A car won't take your job, another horse driving a car will." - Horse influencer, 1910
edytowany 1x, ostatnio: obscurity
Wibowit
  • Rejestracja:prawie 20 lat
  • Ostatnio:39 minut
0
obscurity napisał(a):
Wibowit napisał(a):

ograniczeniem refów w c# jest np. to, że nie da się ich użyć w kodzie typu async.

od c# 13 można używać refów w async i asynchronicznych iteratorach

ale tylko lokalnie, więc przerzucanie danych poprzez yield i async boundary musi się odbyć bez refów:
https://devblogs.microsoft.com/dotnet/csharp-13-explore-preview-features/#ref-and-unsafe-in-async-methods-and-iterators

ref and unsafe in async methods and iterators

Prior to C# 13, iterator methods (methods that use yield return) and async methods couldn’t declare local ref variables, nor could they have an unsafe context.

In C# 13, async methods can declare ref local variables, or local variables of a ref struct type. These variables can’t be preserved across an await boundary or a yield return boundary.

In the same fashion, C# 13 allows unsafe contexts in iterator methods. However, all yield return and await statements must be in safe contexts. These relaxed restrictions let you use ref local variables and ref struct types in more places.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 5x, ostatnio: Wibowit
obscurity
  • Rejestracja:około 6 lat
  • Ostatnio:dzień
2
Wibowit napisał(a):

ale tylko lokalnie, więc przerzucanie danych poprzez yield i async boundary musi się odbyć bez refów

racja, jednak wydaje mi się że to było / jest głównym powodem braku zainteresowania refami w C#, jednak większość kodu w c# jest / staje się asynchroniczna bo async szerzy się wirusowo i tego refa praktycznie nigdzie się nie dało używać co wydaje mi się że jest odpowiedzią na pytanie autora artykułu

image


"A car won't take your job, another horse driving a car will." - Horse influencer, 1910
Wibowit
wydaje mi się że to było / jest głównym powodem braku zainteresowania refami w C# - pożyjemy, zobaczymy :) obstawiam, że refy i tak zostaną niszowe.
obscurity
raczej tak, pozostaną tylko tam gdzie ma to sens w niektórych specyficznych libkach, w zwykłym "biznesowym" kodzie ludzie nie są zainteresowani nawet podstawową optymalizacją złożoności kodu, a jeśli większość czasu aplikacji jest tracona np na zapytaniach sql to i tak bez sensu
Wibowit
w zwykłym "biznesowym" kodzie ludzie nie są zainteresowani nawet podstawową optymalizacją złożoności kodu +1. smutne, acz prawdziwe.
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)