Programistyczne WTF jakie Was spotkały

Programistyczne WTF jakie Was spotkały
Potat0x
  • Rejestracja:ponad 8 lat
  • Ostatnio:10 dni
  • Postów:370
1
Kopiuj
function cos() {
    //...
}

Nie, nie chodzi o trygonometrię.

isAllSelected (checkboxy)
isExist(...)
YyyDto y = service.setYyyDto(String id)
datepicker1, datepicker2

hauleth
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:8 dni
0

Teraz pracuję nad testami w aplikacji, by były one niezależne od reszty systemu (więc wszystkie zewnętrzne zapytania są mockowane). Co jest w tym takiego ciekawego? No test wygląda mniej więcej tak:

Kopiuj
assert {:ok, credits} = Service.get_credits(user)
assert {:ok, new_credits} = Service.set_credits(user, credits + 1)
assert new_credits - credits == 1

Niby wszystko spoko, ale Service.get_credits/1 oraz Service.set_credits/2 to funkcje wygenerowane z WSDL, więc czemu na bogów testujemy to po stronie klienta, a nie serwisu? I teraz siedzę i piszę te wszystkie stuby jak debil.


Zobacz pozostałe 2 komentarze
hauleth
Czy interfejs działa, tylko, że IMHO to bez sensu w tym przypadku, bo tak jak powiedziałem zarówno Service.get_credits/1 jak i Service.set_credits/2 to funkcje wygenerowane, więc tak naprawdę to testuję, że WSDL, który dostaliśmy jest poprawny (a to przecież nie mój problem jeśli aktualny nie jest) oraz, że wygenerowany kod działa, ale tym się nie powinno zajmować tutaj tylko w bibliotece generującej ten kod.
MarekR22
kodu generowanego się nie testuje, chyba, że nie masz zaufania do generatora (nieważnie po której stronie). Jak dla mnie za mało kontekstu, by dostrzec WTF.
hauleth
@MarekR22: ja to wiem, WTFem jest to, że muszę to zrobić, bo nie mogę usunąć tych testów, bo menago nie pozwala.
AreQrm
To nie programistyczny ale organizacyjny WTF :P
Marooned
Administrator
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 11 godzin
  • Lokalizacja:Poznań
2

ups ;-) ktoś wrzucił na produkcję developerską wersję google maps ;-)

https://www.airport-poznan.com.pl/pl/polaczenia-lotnicze/mapa-polaczen
screenshot-20200222233953.png


somekind
A to nie tak, że wrzucili mapy zanim Google kazało sobie za nie płacić?
Shalom
Nihil novi, wiele stron tak ma, bo google zmieniło warunki korzystania z mapsów i teraz trzeba za to płacić.
Marooned
Chyba od dawna trzeba było płacić, ale od iluś tam wejść na minutę czy jakoś tak. Za to appki na Androida chyba mają za friko (?).
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 6 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10051
2

Kolejny dowód na to że autorzy PHP są orangutanami którzy nie biorą niczego pod uwagę

Kopiuj
function(...$array); // works

ale już to:

Kopiuj
return [1, 2, ...$array];

To już od PHP 7.4 haha :D

Serio, jak można wprowadzić jeden feature po kawałku w różnych wersjach? ;| (podobnie jest z type hintami, array w PHP 5.3, int/string w 7.0 do parametrów, w 7.1 do return-type'ów, w 7.4 do property'sów).

Sarrus
Przyjmij moje gratulacje. Właśnie sam odkryłeś, że PHP projektowały/projektują dzieci w piaskownicy. To wygląda na jakiś eksperyment.
FA
  • Rejestracja:około 5 lat
  • Ostatnio:około 19 godzin
  • Lokalizacja:warszawa
  • Postów:301
7

Słowa kluczewe w c#
screenshot-20200224212553.png

edytowany 1x, ostatnio: _flamingAccount
SA
Wg mnie lepszy jest na szablon projektu kątowego. Syf okrutny te automatyczne tłumaczenia.
FA
Nom, ale jest lepiej, teraz mają ciasteczko i pamiętają że chcesz treści po angielsku, problem jest to ze google linkuje bezpośrednio do polskiej wersji. Jak skończę obecny projekt to napisze, rozszerzenie do przeglądarki będzie przekierowywać na angielski i przy okazji będzie wysyłał opinie tłumaczenia z rakieta 3====D w środku. Może w pracy miedzy taksami uda się ogarnąć :D
somekind
Już jest takie rozszerzenie.
MarekR22
najfajniejsze jest przejmi bo nie do końca jest to po polsku.
Azarien
kompilator Roslyn jest open-source więc można sobie mieszać w składni :]
Marooned
Administrator
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 11 godzin
  • Lokalizacja:Poznań
3

To jest pierwszy rok, gdzie urząd skarbowy odmówił pomocy w rozliczeniu mojego pita. Do tej pory wpadałem tam na kwadrans i jakaś miła pani kazała kliknąć tu i tam i było gotowe. Teraz kazano mi to zrobić samamu przez neta.

Wbiłem na https://epit.podatki.gov.pl/yourpit/current i mym oczom ukazały się 4 możliwe pity, które oczywiście niewiele mi mówiły. Udało mi się jednak odkopać swój sprzed roku i wyszło na to, że mam PIT-37.
Szybkie szukanie potwierdziło, że potrzebuję 37 za umowę o pracę.
screenshot-20200225150258.png

I jakie mam możliwości na tej rządowej stronie?
screenshot-20200225150549.png

Czyli niby sekcja PIT-37, ale mogę złożyć tylko 36 dla prowadzących działalność gospodarczą (której od lat nie mam). Nawet URL brzmi jednoznacznie: https://www.podatki.gov.pl/pit/e-deklaracje-pit/dla-osob-prowadzacych-dzialalnosc-gospodarcza/#PIT-36
Czyli wynika z tego, że nie mogę złożyć 37, a muszę, a w US tego już mi nie zrobią. Co dalej? :D

Dla mnie to jeden wielki WTF (niekoniecznie programistyczny, choć częściowo też).


edytowany 3x, ostatnio: Marooned
Zobacz pozostały 1 komentarz
dzek69
PIT-36 też nie było (15 lutego) i wtedy było obiecywanie do końca przyszłego tygodnia. Skoro już jest PIT-36 to może do końca któregoś kolejnego tygodnia będzie PIT-37 ;) W sumie to PIT-36 też chyba nieaktualny [?], bo na liście jest tylko 2018 przy PIT-36?
hauleth
Pierwszy US w P-ń?
Marooned
Winogrady, nie znam numerka
hauleth
To nie, ten jest na Dębcu.
Marooned
Wczoraj byłem ponownie w US. Okazało się, że jeśli kiedykolwiek miałem DG, to nie da się rozliczyć przez tę stronę i mam to zrobić e-deklaracją (jeszcze nie szukałem co zacz). Czyli jednak taki bubel programistyczny ;)
Koziołek
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Stacktrace
  • Postów:6821
2

Auto-merge to idealne narzędzie dla języków dynamicznie typowanych w czasach CID&D. Przykład z dzisiaj. Mamy dwa zadania, które dotykają tego samego pliku, w którym, co ważne, są zapisane schematy dla graphQL. W obu przypadkach musimy modyfikować tę samą sekcję, dodają różne mutacje. Wygląda to mniej więcej tak:

Kopiuj
defmodule App.Schema do
# …
   mutation do
      @desc "Jakaś tam mutacja"
      field :nazwa, :typ do
# …
      end
  end
end

I teraz jak ja dodałem mutacje i koleżanka dodała swoje mutacje, to po auto-merge wynik był:

Kopiuj
defmodule App.Schema do
# …
   mutation do
      @desc "Jakaś tam mutacja"
      field :nazwa, :typ do
# … moje
      end
  end
   mutation do
      @desc "Jakaś tam mutacja"
      field :nazwa, :typ do
# … jej
      end
  end
end

Czyli zamiast konfliktu mamy dwie takie same sekcje. W czym problem? Otóż w schemacie może być tylko jedna sekcja mutacji (i po jednej na subskrypcje i zapytania). Żaden kompilator tego nie wychwyci, bo język jest dynamiczny i jak babol wyjdzie dopiero po uruchomieniu i to w momencie gdy poleci pierwsze zapytanie.

A co z testami? Testy są, ale w żaden sposób nie dotykają pliku ze schematami, bo traktują go jak zewnętrze API i nakładają mocka, który oczywiście zawsze działa. A co do tego ma CID&D? Na całe szczęście można dzięki temu narzędziu dość szybko przywrócić aplikację do życia.

Morał z tego taki, że jak auto-merge mówi, że jest ok i udało mu się rozwiązać konflikt, to nie oznacza, że jest dobrze.


Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException
Zobacz pozostałe 11 komentarzy
hauleth
Ale to nie ma nic wspólnego z typami. Metaprogramowanie pozwala na różne dziwne rzeczy w wielu językach, a tutaj możnaby to rozwiązać bardzo łatwo: if Module.has_attribute?(__CALLER__.module, :mutation_defined), do: raise("Mutation already defined!") i w generowanym kodzie zwyczajnie dodać nowy atrybut modułu @mutation_defined true i wszystko zadziała bardzo ładnie.
jarekr000000
Odkryłeś własnie, że "typowanie dynamiczne jest dychawiczne"? Jak refaktorujesz w dynamicznym kodzie, to cię bolą włosy w brodzie.
hauleth
@jarekr000000: tylko to nie ma nic wspólnego z typowaniem, bo to metaprogramowanie.
jarekr000000
@hauleth: IMO ma - w takim Haskellu czy Scali tez metaprogramowanie jest (TH, macros), a jednak kompilator wykruje błędy ładnie. Najgorszą, choć niestety częstą karą jest kompletnie niezrozumiały komunikat kompilatora (tu w obu jezykach dużo pracy w ostatnich latach zrobiono, ale nadal straszy - przynajmniej mnie).
hauleth
Nie wiem jak Scala, ale o ile mi wiadomo to Haskell nie ma tak rozbudowanego systemu metaprogramowania. Przy czym tak jak mówię, tutaj nie ma to nic związanego z typami i taki sam problem wystąpiłby w Scali jeśli na coś takiego pozwalałaby. Przy czym tak jak powiedziałem, naprawa tego jest całkiem prosta, bo można bardzo łatwo sprawdzić czy przypadkiem nie generujemy tego samego kodu raz jeszcze. Przykładowo ExUnit.describe/2 to robi
Koziołek
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Stacktrace
  • Postów:6821
6

Kocham mój obecny projekt. Powrót do niewyczerpanego źródła fakapów w wykonaniu naszego, swoją drogą doświadczonego, zespołu. Na froncie mamy reacta osadzonego w gmailu, ale nie to będzie najważniejsze w tej historii. Ogólnie metodyka pracy jest taka, że jak coś nie idzie, to zdzwaniamy się i razem kodujemy problem. Nasz problem wyglądał tak, że chcieliśmy mieć komponent, który będzie zmieniać swój stan w zależności od tego czy delikwent jest zalogowany, czy też nie oraz pobierając dane z GraphQL. Prosta sprawa, ale w jednym miejscu przebieg programu zahaczał o funkcję, której zadaniem było wyczyszczenie informacji o subskrypcjach, aktywnościach itp. duperelach. Normalnie funkcja ta jest wywoływana gdy:

  • użytkownik klika wyloguj;
  • użytkownik zamyka komponent;

Całość wygląda mniej więcej tak:

Kopiuj
function unmount() {
  if (!mounted) {
    console.log("RightSidebar is already unmounted, ignoring unmount()");
   }
  ReactDOM.unmountComponentAtNode(container);
  contentPanelView.close();
  ReactDOM.render(
    <LoginPanel onWindowMessage={prepareOnWindowMessage()} />,
    container
  );

  mounted = false;
}

W sumie nic niezwykłego… o ile użytkownik nie otworzy gmaila po dłuższej przerwie, gdy po stronie serwera zostanie usunięty jego token logowania. W tym momencie z serwera przybywa HTTP 401 i wywoływana jest akcja wylogowania. Tyle tylko, że komponent nie został jeszcze zamontowany, więc powyższy kod powinien zostać zignorowany. Nie był. Siedzieliśmy we dwóch nad kodem GQL dla komponentu i przy okazji produkując powyższą funkcję. Co jest źle? Cóż JS nie jest jeszcze na tym etapie, że jak go prosisz, by zignorował wszystko po zalogowaniu zdania z prośbą, to on to zrobi. Zapomnieliśmy o pewnej małej rzeczy:

Kopiuj
function unmount() {
  if (!mounted) {
    console.log("RightSidebar is already unmounted, ignoring unmount()");
    return;
   }
  ReactDOM.unmountComponentAtNode(container);
  contentPanelView.close();
  ReactDOM.render(
    <LoginPanel onWindowMessage={prepareOnWindowMessage()} />,
    container
  );

  mounted = false;
}

Co ciekawe wyszło nie przy wygaśnięciu logowania, ale przy pracy na kilku środowiskach naraz.


Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException
Zobacz pozostały 1 komentarz
jarekr000000
Nie widze WTF. Taki błąd to normalne jak korzystasz z podjęzyków, które mają instrukcje return do tego połaczoną z instrukcją (tfu) if . To po prostu się musi stać co jakiś czas.
Koziołek
Uwielbiam poetykę @jarekr000000 „podjęzyki”.
jarekr000000
No dobra, pisałem ostatnio troche w Scali, więc się zmorissowałem, (żeby było śmieszniej to scala te wszystkie imperatywne ficzury nadal ma ).
KamilAdam
Ciekawe że drabinka if-return po zastąpieniu match-case staje się walidną funkcyjną konstrukcją
jarekr000000
Dobry pattern matching na ADT nie jest zły. Nie widziałem może tu jeszcze syfu, bo 80% kodu w scali, ktory obrabiam, to moj kod, a ja mam inne metody na zaśmiecanie.
LS
LS
  • Rejestracja:prawie 9 lat
  • Ostatnio:prawie 5 lat
  • Postów:85
14

Zastanawiałem się, co mi się tak mój kombajn przycina i dziwnie buczy.
Okazało się, że zostawiłem dzisiaj na ok. 3h otwartego małego gifa na kompie, co najwyraźniej poskutkowało przeogromnym memory leakiem. :o

title

Zobacz pozostałe 3 komentarze
LS
LowSkiller
@axelbest: Najs! :) @MarekR22: Tak, animowany ;) @Czitels: W sumie już trochę go mam, kiedyś wydawał się mega maszyną i nazwa została. :D
axelbest
A weź podrzuć tego gifa tutaj.
MarekR22
Jak mój "kombajn" się zestarzał, to go przemianowałem na "snopowiązałka" :)
LS
LowSkiller
@axelbest: To był bardzo znany śmieszkowy gif ze starszym panem, który wrzuca "Mój komputer" do "Kosza" i nagle znika mu monitor. W ramach jakichś śmieszków na czacie z kumplami z pracy tego szukałem :D
axelbest
Ogólnie mema znam, tylko chciałbym u siebie na dokładnie tym samym pliku sprawdzić ten leak.
GS
  • Rejestracja:ponad 8 lat
  • Ostatnio:8 dni
  • Postów:1265
4

WTF na czasie

https://coronavirus.jhu.edu/map.html
Strona z przypadkami koronawirusa na świecie. Z jakichś powodów kliknięcie na Francji powoduje przeniesienie na Karaiby

screenshot-20200317124049.png

Zobacz pozostały 1 komentarz
baant
moze coś tam należy do francji (nie wiem, nie chce mi sie sprawdzać). Ciekawostka: Francja i jej terytoria znajdują się w największej ilości stref czasowych ze wszystkich krajów: 12.
Marooned
Pewnie na Gujanę Francuską (strzelam)
GS
Chodzi raczej o wyspę Saint Barthelemy, która faktycznie należy do Francji.
Koziołek
@baant: to w ilu leży to jedno, ale to, że do tych wszystkich terytoriów latasz z Air France lotami regionalnymi, to inna sprawa. Jak chcesz tanio polecieć do Ameryki Południowej, to lot do Gujany jest najlepszą opcją.
GS
Już poprawili. Zresztą na tej stronie niezbyt aktualne informacje, tu jest chyba lepiej: https://www.youtube.com/watch?v=qgylp3Td1Bw
FA
  • Rejestracja:około 5 lat
  • Ostatnio:około 19 godzin
  • Lokalizacja:warszawa
  • Postów:301
6

Dlaczego? Po co? Naprawdę? Folder nazywa się test
screenshot-20200318132838.png

Update. Rozpoczęcie instalacji naprawiło problem WTF?

edytowany 3x, ostatnio: _flamingAccount
WE
A spróbuj utworzyć folder o nazwie con
E9
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 13 godzin
  • Postów:216
6

Integruje nasz system z jakimś systemem bankowym, biorę sobie swaggera, generuje klasy i takie coś mi się rzuciło w oczy w wygenerowanym kodzie

Kopiuj
public enum SomeProperty {
    TRUE(true),
    FALSE(false);

    private Boolean value;

    SomeProperty(Boolean value) {
      this.value = value;
    }
}

I nie, to nie jest reużywany enum w wielu miejscach, jest SomePropertyX, Y, Z które wygląda identycznie. Rozumiem, że trzeba było owrappoawć booleana jakby w przyszłości doszła 3 wartość "MAYBE"?

edytowany 1x, ostatnio: Emdzej93
Zobacz pozostałe 39 komentarzy
E9
Co do użycia czegoś takiego w kontekście wywołania usługi z wieloma parametrami - faktycznie, to może mieć uzasadnienie. Jednak tutaj użycie tego jest inne, w wygenerowanym kliencie jest metoda DupaResponse postDupa(String charset, String language, String contentType, String accept, String..., DupaRequest request). I wspomniany enum jest wykorzystywany jako pole w DupaRequest. Tak więc nadal uważam, że opakowanie tak użytego booleana w enuma to jest WTF ;)
Koziołek
@Emdzej93: niech zgadnę, pod spodem jest SOAP, ze zdefiniowanym WSDLem. Jeżeli tak, to raczej wynika z samej technologii, która zapewne w schemie widzi taki DupaRequest jako typ i potem go mapuje go na pałę bez wnikania w szczegóły.
E9
W SOAPie faktycznie by mnie to nie zdziwiło, w tym przypadku to jednak był REST.
Koziołek
@Emdzej93: może to SOAP po migracji?
E9
@Koziołek: W sumie, współpracowaliśmy z tym klientem już wcześniej i wiem jaki stack technologiczny jest wykorzystywany w tej organizacji. Dam sobie rękę uciąć, że cała logika w środku gada SOAPem i tylko publiczne API jest tłumaczone na RESTa. Tak więc takie translacje SOAP - REST faktycznie mogły pewne cuda wyczarować.
Freja Draco
Freja Draco
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 3 lata
  • Postów:3394
6

Pierwszy raz w życiu używałam natywnych suwaków z HTML5.
W teorii świetna sprawa, używasz wbudowanego rozwiązania i nie musisz go sobie własnoręcznie rzeźbić z 2-3 innych elementów.

W praktyce CSS-owy koszmar. Przypomniały mi się stare "dobre" czasy kompletnego braku kompatybilności przeglądarek :p
Szybciej bym to sobie chyba z div-ów zrobiła :p


PerlMonk
Chcesz powiedzieć, że w HTML5 gorzej się posuwa?
Freja Draco
Freja Draco
@PerlMonk: Posuwa się nawet szybciej, ale trudniej osiągnąć oczekiwany efekt.
Anna Lisik
@Freja Draco: n/c. Ogarnij się.
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:mniej niż minuta
11

WTF słabo wyszkolonego testera (zapewne nowy nabytek).

Dostałem buga, że instalator na MacOS nie działa.
Not to proszę o logi, wytłumaczyłem skąd je wziąć itp.
WTF 1: Dostałem logi i z nich wynika, że gość włączył instalatora w trybie UI i albo nie konturował instalacji (nie nacisnął "continue") albo wyeksportował logi przed pojawieniem się problemu, bo odtwarzam co do literki logi jeśli instlacja się rozpocznie i nie jest kontunowana.
Dałem mu więc linię poleceń, że wszystko powinno pójść automatem i zapisać wszystkie logi w pliku:

Kopiuj
sudo installer –pkg "MyInstaller.pkg" -verbose -target / > /path_to_log/logs.txt 2>&1

WTF 2 Mimo, że już od tygodnia wymieniamy emaile, a te logi mają ~2kB to wgrał te logi na sharepoint tak, że nie mam dostępu. Jak mu zwróciłem na to uwagę, to wgrał to znowu na share point ale tym razem do takiej domeny, że sharepoint nawet nie przyjmuje mojego email.

No to błagam by wysłał to po prostu jako załącznik do email.

WTF level expert, bo dostałem dwa logi, które zawierają dokładnie to samo (dwie próby instlacji), w których jest to:

Kopiuj
Sorry, try again.
installer: invalid option –pkg
Usage: installer [-help] [-dominfo] [-volinfo] [-pkginfo] [-allowUntrusted] [-dumplog]
                 [-verbose | -verboseR] [-vers] [-config] [-plist]
                 [-file <pathToFile>] [-lang <ISOLanguageCode>] [-listiso]
                 [-showChoicesXML] [-applyChoiceChangesXML <pathToFile>]
                 [-showChoicesAfterApplyingChangesXML <pathtoFile>]
                 -pkg <pathToPackage>
                 -target <[DomainKey|MountPoint]>

Tak gość uruchomił komendę nie z tego katalogu, gdzie jest plik instalacyjny i nie sprawdził co wylądowało w tym pliku.
Oczywiście, do emaila dołączony był jeszcze screenshot w jaki sposób uruchomił te komendy.

Ręce opadają.


**Update:** Jak w końcu dostałem logi to się okazało, że jakaś zależność została zainstalowana w nieobsługiwanej wersji, co było wyraźnie opisane w ekranie powitalnym. Bug z instalatora MacOS nie pokazywał mojego komunikatu błędu, który dostarczyłem zgodnie z instrukcją od Apple. Żeby zapobiec takim problemom to dopisałem do instalatora obejście bug-a Apple, tak że komunikat jest wyraźnie prezentowany użytkownikowi na wczesnym etapie.

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 3x, ostatnio: MarekR22
Sunnydev
na kolejny raz będzie wiedział co robić xD (jeśli ma świadomość co robi źle ofc)
cerrato
no ale taki błąd powinien bardzo przeciętnie uświadomiony użytkownik ogarnąć, a nie że poległ na nim "zawodowy" tester... masakra.
Sunnydev
no masakra, ale jednak ktoś go dopuścił do tej pracy co mnie jeszcze bardziej dziwi.
Freja Draco
Freja Draco
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 3 lata
  • Postów:3394
2

Jak nie ukrywam jestem reakcyjnym anty-obiektowcem i niereformowalną wsteczniarą, która utknęła na etapie programowania imperatywnego.

No więc biorę sobie wczoraj na tapetę piękny obiektowy skrypt-demo obrazujący, jak w rozszerzeniu do chrome zrobić skrinszota.
Skrypt, elegancja-francja:

  • 50 linijek kodu,
  • jeden obiekt,
  • 2 właściwości,
  • 3 metody,
  • 7 tabów - maksymalny poziom zagnieżdżenia instrukcji kodu.

Ten sam skrypt, robiący dokładnie to samo po "zbarbaryzowaniu" go przeze mnie do postaci imperatywnej:

  • 16 linijek kodu,
  • jedna funkcja,
  • 3 taby - maksymalny poziom zagnieżdżenia instrukcji kodu.

A teraz wracam polować na dinozaury :p

p.s. Jak był uprzejmy zwrócić mi uwagę @Wibowit 22, mówiąc o oprogramowaniu imperatywnym, miałam na myśli proceduralne.


edytowany 1x, ostatnio: Freja Draco
Zobacz pozostałe 6 komentarzy
Freja Draco
Freja Draco
@Miang: Kamieniami? No coś ty? Dinozaury łapie się na wabia. Bierzesz patyk, piszesz nim na ziemi: GOTO i czekasz, aż same przyjdą :p
Shalom
Piękny obiektowy kod, 7 poziomów zagnieżdżenia -> pick one. Po prostu przerobiłaś gówniany kod na lepszy, OOP nie ma nic do tego.
xxx_xx_x
@Freja Draco: Jak masz młotek to wszystko wygląda jak gwóźdź, zamykanie sie tylko na jedną metodę programowania jest zwyczajnie głupie.
Miang
z drugiej strony jak masz same młotki różniące sie kolorami to mozesz wszystko robić tym w swoim ulubionym kolorze
xxx_xx_x
@Miang: jak najbardziej, byle dobierać narzędzie do zadania
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
11

Nie do końca programistyczny ;)
Potrzebowałem dziś zresetować hasło w windowsie i jak sie okazuje, MS nie przewiduje takiej możliwości, o ile zawczasu nie wygenerowało sie jakiegoś magicznego pendrajwa na konkretnym systemie i użytkowniku którego planujecie resetować. Są niby jakieś livecd/liveusb które potrafią, ale próbowałem i coś nieszło, pewnie brak kompatybilności z nowym windowsem.

Finalnie trzeba było zrobić to metodą bliźniaczo podobną do tej której używało się 25 lat temu -> https://i.imgur.com/fqjnK.gif
Za pomocą jakiegoś linuxa z USB (ale nie jestem pewien czy nawet ta windowsowa konsola odzyskiwania systemu nie pozwoli tego zrobić...) podmieniamy sobie utilman.exe na cmd.exe i startujemy w trybie awaryjnym z opcja Wyłącz usługę wczesnej ochrony przed złośliwym kodem. Wchodzimy do ekranu logowania, klikamy na ikonkę "ułatwienia dostępu" która to ułatwia nam dostęp, odpalając nam zamiast utilmana root shella z którego możemy wygodnie ustawić hasło. "User friendly".


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
Zobacz pozostałe 22 komentarze
KA
@Afish kwestia w tym że póki nie jest to zabezpieczenie na poziomie szyfrowania - czyli metody matematycznej opartej na liczbach pierwszych i matematycznie po prostu brak możliwości podejrzenia danych bez znajomości hasła to te hasło pod windows bez szyfrowania tak samo nie chroni jak hasło pod linux bez szyfrowaniem tylko, że linux to szczerze przyznaje i używając chroot nie musisz podawać żadnego hasła.
KA
@Afish Takie hasło bez szyfrowania chroni przed rodziną, ale nie przed FBI czy kimś z livecd. Chciałbyś mieć hasło, które Cię nie chroni przed FBI? Dlatego używaj szyfrowania gdziekolwiek jesteś i nie ufaj specom od M$. Prawdziwy obraz sytuacji masz tylko w systemie UNIX i języku C - tam widzisz czarno na białym jak wygląda rzeczywistość.
AF
Mówisz o kompletnie innej sprawie.
KA
@Afish to może to zostawmy bo ja nie wiem o czym mówię a o czym Ty. Mi się wydaje że Ty korzystasz z systemu M$ a ja Linux i dlatego nie możemy się dogadać.
AF
Wydaje mi się, że to nie jest kwestia systemu, jakiego używam (a jest to też Linux). Chciałbyś mieć hasło, które Cię nie chroni przed FBI — nikt tu nie rozpatrywał tego typu zabezpieczeń, tu była rozmowa o resetowaniu hasła. To ma być na tyle trudne, żeby użytkownik mógł w spokoju wyjść do toalety, bez obawy, że znajomy z biura w minutę je wyczyści i nie zostawi śladów, a jednocześnie na tyle bezpieczne, żeby zresetowanie hasła zablokowało dostęp do niektórych krytycznych danych i żeby nie mógł tego trywialnie zrobić każdy zwykły współużytkownik maszyny.
Freja Draco
Freja Draco
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 3 lata
  • Postów:3394
2

T-mobile właśnie skasowało mi darmowe minuty i wiadomości.

Od jakichś 10 lat używam taryfy rodzina 20 za 20 zł miesięcznie i przez te lata praktycznie tyle właśnie płaciłam co miesiąc, ale od ostatniego doliczyli mi kilka zł za kilkanaście minut rozmowy. Cóż, chyba będę po prostu dopłacać te kilka złotych co miesiąc, bo przejrzałam aktualne taryfy i (jeśli nie zgodzę się na spamy reklamowe i fakturę elektroniczną) najtańsza z nich kosztuje... 55 zł / miesiąc.

Kurde, a myślałam, że w epoce szerokopasmowych połączeń i 5G usługi powinny być tańsze niż 10-20 lat temu :p


edytowany 2x, ostatnio: Freja Draco
Zobacz pozostałe 4 komentarze
BraVolt
Chyba w Plus (Plush) same rozmowy no limit są za 9,99 zł na miesiąc. Ja potrzebuję gigaaaaaaabajty internetu na poziomie prawie nielimitowanym, dlatego płacę za no-limiet co miesiąc 25 zł w Orange
Freja Draco
Freja Draco
@BraVolt: Dzięki za info :)
Marooned
Ja po ~15 latach w Erze (w tym ostatnie lata abonament biznesowy) przejrzałem na oczy i od roku jestem szczęśliwym klientem Plusssz za 25zł/m-c z tak gigantycznym pakietem internetu (no dobra, 15GB to nie 100GB ;-) ale mi styka), że przestałem w ogóle o tym myśleć i nawet w domu często jadę na GSM, bo WiFi coś szwankuje (>10 letni router chyba powoli do wymiany). Facebook, Messenger, Instagram, WhatsApp nie zużywają transferu, na YouTube jest 10GB extra, a płacę połowę tego co w Erze. Dla mnie no brainer. No i wspieram Solorza zamiast Niemców, więc też w teorii na plus.
Marcin.Miga
@Marooned: Czyżbyś był Poznaniak? Ja też mam Plusza za 25 i styka (nawet na "kopie zapasowe z Internetu" :) )
Marooned
Dopiero od dekady, więc nie wiem, czy się liczy.
TO
  • Rejestracja:około 7 lat
  • Ostatnio:około 2 miesiące
  • Postów:33
6

Zbiór WTFów: https://shitcode.net/

purrll
  • Rejestracja:około 5 lat
  • Ostatnio:ponad 4 lata
  • Lokalizacja:Kuala Lumpur
  • Postów:241
0

str.islower()
Return True if all cased characters in the string are lowercase and there is at least one cased character, False otherwise.
str.isupper()
Return True if all cased characters in the string are uppercase and there is at least one cased character, False otherwise.

Kopiuj
ch_a = "Sasdneuneijmirjioeweij"
ch_b = "Seaxviijererijwrjnwija"

print(any(ch.isupper() for ch in ch_a))    // True
print(any(ch.islower() for ch in ch_b))    // True

&&

Kopiuj
str = "Sasdneuneijmirjioeweij"
print (str.isupper())                            // False
str = "Seaxviijererijwrjnwija"
print (str.islower())                            // False

Bython.


Zobacz pozostałe 3 komentarze
purrll
Piekielnie nieczytelny jest dla mnie ten Python. Dzięki @grski. Nie poradziłbym sobie bez Twojej pomocy :-)
Riddle
@purrll: Może gdybyś wpisał all(ch.isupper() for ch in ch_a) ??
IK
Jakiego wyniku spodziewałbyś się dla any(ch.isupper() for ch in ch_a), any(ch.islower() for ch in ch_b), str.isupper() i str.islower() jeśli nie tego, który dostałeś i dlaczego?
superdurszlak
@iksde: bo Python jest hurr durr zły i pewnie any oznacza co innego, niż wszędzie indziej i to co podpowiada słownik/zdrowy rozsądek ;)
hauleth
@purrll: dalej nie potrafię dojść co jest tutaj WTFem…
Korges
  • Rejestracja:prawie 5 lat
  • Ostatnio:około 9 godzin
  • Postów:551
3

Konstrukcja tabeli w bazach danych po 100 kolumn, nazwa każdej kolumny skrótowce 6 literowe: NUMCHQ, DATREG, DATREJ, GUICHA itp, do tego wszystko w typie CHAR. Brak kolumny odpowiedzialnej za ID, mnóstwo stałych w kolumnach, klucz kompozytowy składający się z 6-10 kolumn (w zależności od tabeli). Wtedy też dowiedziałem się że CHAR na bazie sam dopisuje spacje do długości kolumny np NUMCHQ(32): "1234567890 .", i szukanie po findBy...() nie ma sensu, trzeba trimować kolumny na bazie albo jeszcze inne kombinacje...
Wkładając normalnie jakiś string, przy zapisie zostaną dodane spacje, przy wyciąganiu, trzeba je trimować.

edytowany 3x, ostatnio: Korges
Zobacz pozostałe 10 komentarzy
cerrato
Wiem, jak działa CHAR, ale zastanawiałem się, czy chodzi właśnie o to, czy może np. SQL jest już nowy, który tego nie wymaga, ale nadal stosują rozwiązanie legacy bo tak było zawsze. A może stosowanie tego typu rozwiązania wynika z jakiejś logiki zaszytej w aplikacji?
AF
To nie jest rozwiązanie legacy, to standard. To tak, jakbyś pytał, czy short w c# ma już rozmiar 64 bitów, bo teraz mamy więcej pamięci. @wloochacz dobrze mówi.
cerrato
@Afish: ale jak podlinkowałem wyżej - niekoniecznie w obecnych czasach stosowanie VARCHAR jest mniej wydajne. Dlatego chciałem dopytać, czy takie ograniczenie na dane w bazie wynika z naleciałości z minionych lat, czy mimo wszystko jest jakoś uzasadnione.
AF
Jest uzasadnione, bo to są zupełnie inne typy. Inaczej działają, inaczej powodują fragmentację, inaczej są zdefiniowane przez standard. Zapytałeś A czy wiesz, z czego to dodawanie spacji wynika?, to nie jest pytanie a czy twórcy aplikacji wybrali CHAR z powodu wydajności, czy były inne przesłanki. Twoje pytanie (jeżeli rzeczywiście takie miałeś na myśli) raczej sugeruje nieznajomość baz danych. Jeszcze mówisz czy może np. SQL jest już nowy, który tego nie wymaga, ale nadal stosują rozwiązanie legacy bo tak było zawsze — stosuje, bo tak mówi kontrakt.
cerrato
w sumie masz rację, moje pierwsze pytanie było trochę nieprecyzyjnie sformułowane.
Freja Draco
Freja Draco
  • Rejestracja:prawie 7 lat
  • Ostatnio:ponad 3 lata
  • Postów:3394
6
Freja Draco napisał(a):

T-mobile właśnie skasowało mi darmowe minuty i wiadomości.

No to się zdziwiłam. Napisałam tam do nich w zasadzie tylko po to, żeby sobie jadu trochę upuścić, a oni mnie przeprosili, napisali, że już naprawili problem i wystawili fakturę korygującą 8-O


Marooned
Warto rozmawiać - Magdalena Ogórek
Marooned
Administrator
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 11 godzin
  • Lokalizacja:Poznań
1

Właśnie trafiłem na kawałek kodu z września 2018 z komentarzem // todo: this code is written for temporary basis and will be removed before UAT ;-)


Zobacz pozostałe 3 komentarze
Marooned
Kto by tam testował soft w banku, nie? ;)
somekind
Jak masz tylu klientów, to nie potrzebujesz testerów.
KR
u nas w firmie z tego powodu nie wolno zostawiać TODO w kodzie bo kod juz dojrzal na tyle ze znajdujemy jeszcze TODO sprzed lat
xxx_xx_x
A TODO nie służy do tego by napisać gówniany kod i napisać wiarygodne usprawiedliwienie? :P
vpiotr
Ja przed UAT mialem ostatnio serie komunikatow w rodzaju "this should never happen"...
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 6 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10051
6

W PHP jest funkcja o nazwie: sodium_crypto_box_keypair_from_secretkey_and_publickey().

Trochę przydługa xd

edytowany 1x, ostatnio: Riddle
PerlMonk
  • Rejestracja:około 6 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Warszawa 🐪
  • Postów:1719
4

Nie sztuka uciec gdy w dupie sztuciec. 🐪🐪🐪
Koziołek
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Stacktrace
  • Postów:6821
3

@TomRiddle, @PerlMonk: co wy tam wiedzie o długich nazwach:
https://github.com/dotnet/roslyn/blob/master/src/Compilers/CSharp/Portable/BoundTree/BoundTreeRewriter.cs#L100 → BoundTreeRewriterWithStackGuardWithoutRecursionOnTheLeftOfBinaryOperator
https://gist.github.com/thom-nic/2c74ed4075569da0f80b → Lista długich nazw ze Springa


Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException
Wibowit
Combosy takie, że nie idzie się połapać jak połączyć wyrazy. Ale z drugiej strony łączenie nazw klasy zewnętrznej i wewnętrznej w jedno to oszustwo. W kodzie źródłowym nie musisz tego składać do kupy.
Shalom
HasThisTypePatternTriedToSneakInSomeGenericOrParameterizedTypePatternMatchingStuffAnywhereVisitor <3
Marcin.Miga
  • Rejestracja:prawie 17 lat
  • Ostatnio:około 18 godzin
  • Postów:2792
7
purrll
Idąd logiką pewnego portalu w krajowym internecie - na biednego nie trafiło.
MarekR22
"o znalazłem bug-a, wrzucę go szybko na produkcję nikt się nie zorientuje" .... "ups, a teraz idziemy na zakupy"
Berylo
myslalem ze Biedroń coś odwalił jak przeczytałem link
WhiteLightning
  • Rejestracja:prawie 14 lat
  • Ostatnio:4 dni
  • Postów:3168
4

Urzedowo programistyczne WTF. Potrzebowalem rozliczyc podatek od dywidendy z USA, (do zaplaty mniej wiecej tyle ile kosztuje 0.5 l zwyklej wodki typu Wyborowoa). Kosztowalo mnie to caly wieczor. Jest sobie system Twoj E-pit ktory ladnie wszystko automatycznie wylicza, ale tylko na podstawie innych dokumentow PIT, wiec jak sie mialo umowe o prace ladnie wyliczy PIT - 37, spoko. ALE w Pit 37 nie ma mozliwosci zeby to dopisac, wiec trzeba zmienic na Pit 36. Na stronie jest nawet opcja konwersji do pit 36 ktora po kilku minutach sie wywala, w inspekcie strony leci jakis not found. No dobra, sciagam pierwszy lepszy program, jakies E-pity, a tam nie ma opcji zeby jakkolwiek dodac ten moj ogromny przychod, bo pola wyszarzone i nie ma opcji ktora mi to pozwoli zrobic. Instaluje E-deklaracje. Nie cierpie tego programu za nieprzyjaznosc i sposob w jaki jest robiona walidacja, czyli chcialbys wypelnic sobie w dowolnej kolejnosci pola, to jestes terroryzowany komunikatami ze nie wolno bo sie cos nie zgadza. No i trzeba jakies wynalzki typu Adobe-air czy Adobe Reader instalowac. Po prostu mozna sie poczuc jak w jakies zalosnej komedii.

Zobacz pozostałe 17 komentarzy
somekind
A co zaliczasz do socjalu?
czysteskarpety
czysteskarpety
500+ matka plus, emerytura plus, 13 emerytura :)
BraVolt
1500+ na wspieranie właścicieli wynajmujących mieszkania. Wkrótce ruszą dopłaty.
BraVolt
@Potat0x: 1500+ to nie żart, to forsowana mocno propozycja tarczy antywirusowej (5.0, 6.0 czort wie której). Rynek nieruchomości siadł, będą go wspierać między innymi tym 1500+
KR
Moderator
  • Rejestracja:prawie 21 lat
  • Ostatnio:około 19 godzin
  • Postów:2964
10

Ponieważ za licencje trzeba płacić niemało, nasi klienci często próbują wyciskać z serwerów ile się da. I tak, mamy tam takie ustawienie kontrolujące liczbę wątków w pewnej puli. Domyślnie ustawione na coś zbliżonego do liczby rdzeni. Klient stwierdził, że więcej wątków będzie szybciej, więc ustawił tam 1000. Następnie przyleciał do naszego supportu, że system mu działa niestabilnie (problemy z niedostateczna ilością pamięci).

Support oczywiście sprawdził konfigurację i nakazał zmniejszyć liczbę wątków do rozsądnej wartości. Na to klient zaprotestował, bo "gdy jest mniej wątków to działa za wolno i się nie wyrabia z naszym obciążeniem i macie to poprawić tak aby działało z 1000 wątków". Ech. Współczuję ludziom z pomocy technicznej.

grski
Nie możecie po prostu powiedzieć panie puknij się pan w czoło?
KR
Klient nasz pan. :) W sumie dzięki niemu znaleźliśmy, że mamy bardzo specyficznego buga jak jest za dużo wątków. Natomiast trochę WTF, że dla klienta ważniejsze jest aby było szybko niż stabilnie, i to jeszcze na produkcji.
Sarrus
  • Rejestracja:prawie 14 lat
  • Ostatnio:3 dni
  • Postów:2512
8

Ja miałem przypadek, gdzie firma wdrażająca nasz system, oszczędzała na sprzęcie. W efekcie musiałem optymalizować coś co optymalizacji nigdy nie potrzebowało, bo serwer radził sobie gorzej niż laptop.
W podobnym temacie koledzy aktualizowali jeden z modułów. Po tej zmianie zaczęły się problemy z pamięcią. Pierwsza myśl to jakiś wyciek, ale nie. Okazało się, że "serwer" na którym to stało miał 1 GB pamięci RAM. Czasem przetwarzamy na starcie dość spore ilości danych więc tyle to moduł jeden potrafi sam zeżreć...

Zobacz pozostałe 2 komentarze
KA
1GB RAM XD to moja komórka ma więcej
Sarrus
@Azarien To jest .NET więc jeżeli pamięć jest dostępna to ją wykorzystuje. Przy ładowaniu, jak tam jest wszystko mielone, to .NET nie traci czasu na odpalanie GC. Po zakończeniu operacji GC jest odpalany i zużycie pamięci spada. Tak więc nie jest to wina modułu. A przynajmniej nie zawsze ;)
Azarien
"aktualizowali jeden z modułów. Po tej zmianie zaczęły się problemy z pamięcią" - piszesz że zaktualizowali moduł. co tu ma .NET do tego…
Sarrus
Starasz się udowodnić, że popełnili błąd czy co? W skrócie dodawali nową funkcjonalność do modułu i to wymagało więcej danych, co zwiększyło zużycie pamięci. Ta nadwyżka wystarczyła żeby losowo wywalało procesy w systemie.
Azarien
Ten 1 GB RAM był prawdopodobnie zupełnie uzasadniony w czasie kiedy serwer był stawiany. Jeśli wejdzie więcej RAMu to mamy quick fix i wszyscy zadowoleni. Widziałem niestety projekt w którym każdy programista mógł skompilować aplikację lokalnie na swoim kompie i trwało to kilka razy szybciej niż na oficjalnym build serwerze. No ale zasady były takie, że na testy powinien (a na produkcję musiał) iść build z serwera. Przez co ludzie czasami czekali godzinę na builda. Prośby o lepszy build serwer trafiały na wzruszenie ramion…
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:mniej niż minuta
1

Home office powoduje, że używam intensywnie Remote Desktop (RD) (z MacOS na Windows, ale to nieważne).
Zauważyłem ciekawego bug-a.

Normalnie jak RD jest podłączony i zdalna maszyna długo nie jest w użyciu, "ekran" na zdalnym komputerze ulega zablokowaniu zgodnie z ustawieniami. RD pokazuje ekran blokady tak jakby siedzieć bezpośrednio przy komputerze i trzeba podać hasło, by odblokować zdalny komputer. Nie jest to zaskoczenie, choć wygodniej by było polegać na blokowaniu ekranu komputera, z którego się użytkownik łączy. Samo połącznie RD nie jest zerwane i nie wymaga ponownego uwierzytelnienia.

Jednak z drugiej strony wczoraj/dziś stał się coś takiego:

  1. korzystałem ze zdalnej maszyny (przez VPN)
  2. wróciłem do lokalnej maszyny (RD w tle zalogowany)
  3. Odłączyłem VPN (klient RD próbuje odzyskać połączanie)
  4. Uśpiłem lokalną maszynę
  5. 12h później, przywróciłem lokalna maszynę
  6. włączyłem VPN
  7. Przełączyłem się na klienta RD, który odzyskał połączanie do maszyny zdalnej

EFEKT:
Jestem zalogowany do zdalnej maszyny bez podawania hasła. Ekran się nie zablokował (coś mrugnęło jak taki ekran). Żadnego ekranu blokowania, podawania hasła lub użytkownika, stan poprzedniej sesji się nie zmienił.

IMO to jest bug po stronie Windows.
Tyle, że jest pytanie: czy bugiem jest to, że automatyczne blokowanie ekranu się włącza?
Czy może jako bug, należy traktować to, że blokowanie ekranu nie włącza się po 12 godzinach, jeśli był problem z połączaniem?

Osobiście wolałbym wersję 1.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 2x, ostatnio: MarekR22
Zobacz pozostały 1 komentarz
MarekR22
ja nie używam zapamiętywania haseł (tych ważnych). Zresztą, nawet jakby to była prawda popatrz na scenariusz. Jeden z tych dwóch scenariuszy jest niekonsystentny z drugim.
PA
To może to, ale dotyczy windowsa: Starting with Windows 10 release 1903 in April 2019, and with Windows Server 2019, Microsoft changed the way NLA works. Now, the authentication mechanism caches the client’s login credentials on the RDP host so that it can quickly log the client in again if it loses connectivity. https://nakedsecurity.sophos.com/2019/06/06/microsoft-dismisses-new-windows-rdp-bug-as-a-feature/
MarekR22
@Panczo: poprawiłem opis, połączanie RD faktycznie nie wymaga ponownej weryfikacji użytkownika, ale RD pokazuje ekran blokady (wygaszacza ekranu) w pierwszym scenariuszu i nie pokazuje go w drugim.
AF
W pierwszym scenariuszu masz normalną nieaktywność w systemie, w drugim masz reconnect to session. To drugie można konfigurować (jak długo, z jakiej maszyny itp), to nie jest bug, tylko tak to ma działać. Jak Ci przeszkadza, to zmień ustawienia w terminal services i ogranicz czas na ponowne połączenie, czy co tam Ci pasuje.
Marooned
wygodniej by było polegać na blokowaniu ekranu komputera, z którego się użytkownik łączy no nie, bo administrator zdalnej maszyny nie wie, jakie masz ustawienia - może masz "nigdy nie wygaszaj" i ogarnia kwestie bezpieczeństwa po swojej stronie - kwadrans nieaktywny? Blokujemy dla bezpieczeństwa, bo nie wiemy, co tam zaszło (może ogląda jutuba, a może do firmy włamali się zamaskowani hakerzy z latte w ręku).
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)