Programistyczne WTF jakie Was spotkały

Programistyczne WTF jakie Was spotkały
RE
Moderator
  • Rejestracja:około 18 lat
  • Ostatnio:11 miesięcy
3

@cerrato: w angielskiej wersji jest tak: screenshot-20180622203100.png

Koziołek
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Stacktrace
  • Postów:6821
7

Szlachetna wydajności,
nikt się nie dowie,
jako smakujesz,
aż się zepsujesz*.

* - nie dowie się też debil, który napisał coś takiego:

Kopiuj
sb.append("\n" + getClass().getSimpleName() + ".idNb OldVal: [" + this.getAvtrNb() + "], NewVal: [" + newValues.getidNb() + "]");

i powtórzył to ponad 250 razy w tylko jednym pakiecie.


Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException
Zobacz pozostałe 3 komentarze
vpiotr
Raczej czy na pewno. https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.18.1 Może Java nie generuje StringBuildera do StringBuildera - to by mnie nie zdziwiło.
jarekr000000
Sprawdziłem javacem od jdk 8 do 10, niestety prymityw. Stringi wewnątrz wywołania append skleja sobie osobnym StringBuilderem (oczywiście), ale na koniec robi na tym toString() i dokleja oryginalnym appendem do sb. Czyli niepotrzebna konstrukcja StringBuilder i niepotrzebne wywołanie toString się robi. Cieniasy z tych kompilatorów.
Riddle
A IDE nie umie tego naprawić samo/jednym skrótem?
Koziołek
@TomRiddle: umie, ale i tak to WTF.
Riddle
Pod spodem, chyba od javy 7 taka konkatenacja sama zamienia się na StringBuilder. Tylko konkatenacja w pętlach/przy iterowaniu ma sens dla explicit SB.
wasiu
  • Rejestracja:prawie 21 lat
  • Ostatnio:6 miesięcy
  • Lokalizacja:Poznań
  • Postów:1552
1

W końcu udało mi się stworzyć bardziej złożone zapytanie, w EF Core, w debugerze pokazują mi się wyniki, teraz ładnie powinny się wyświetlać na frontendzie a tam pustka... tylko w konsoli czasami pojawia się:

"Http failure response for (unknown url): 0 Unknown Error" >

Noż ręce mi opadają... liczyłem, że problem zajmie mi wczoraj 30 minut... mam dziś godzinę prawie 20tą.


Full Stack Developer .NET & Angular, Blazor
edytowany 2x, ostatnio: wasiu
Zobacz pozostały 1 komentarz
wasiu
To w wersji 1.0, w wersji 2.0 już jest lepiej. Teraz wyszło 2.1 z lazy loading, to chyba już w ogóle powinno mieć funkcjonalność jak EF 6, które całkiem dobrze się sprawowało.
AF
A umie już robić group by i order by na bazie?
wasiu
W 2.1 doszedł group by na bazie. Będe na dniach robił upgrade z 2.0 to zobaczę jak to działa. Ogólnie jest całkiem spoko w swojej apce mam dynamiczne filtry i wszystko całkiem ładnie działa, chociaż trzeba było się pobawić expressionami. https://blogs.msdn.microsoft.com/dotnet/2018/05/30/announcing-entity-framework-core-2-1/
SO
Ale dalej nie zrobisz many-to-many bez jawnego tworzenia klasy łączącej...
wasiu
O! Faktycznie coś takiego musiałem niedawno robić i też mnie to trochę poirytowało :) Ale też i nie jest to jakiś duży problem zrobienie takiej klasy.
DE
  • Rejestracja:ponad 9 lat
  • Ostatnio:10 miesięcy
  • Postów:1788
7

WTF? Ktoś nazwał funkcję symbolem euro? :O A nie... ta funkcja jest po prostu @deprecated.
Zrzut ekranu 2018-07-05 o 17.34.00.png

vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
4

Jednak są rzeczy na które nas nie stać
screenshot-www.otomoto.pl-2018-07-13-12-21-31.png

jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 9 godzin
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4706
5

Powrót z krótkiego urlopu zawsze dostarcza moc wrażeń na review.

  1. Sąsiedni team zaczął używać BigDecimal jako klucza głównego w domenie. Teraz są naprawdę przygotowani na wielką skalę rozwoju naszego biznesu. Większą niż galaktyczną. Ba!, ponad nawet lokalną gromadę galaktyk (tzw. biznes lokalny), bo BigInteger by na to wystarczył. Są przygotowani na fundamentalne zmiany w strukturze wszechświata i przejście na osbługę niepoliczalnej liczby kredytów ( Japoni, czy Włochom może się przydać...),... albo raczej tak im się wydaje. Muszę ich uświadomić, że komputerowy BigDecimal nadal jest ograniczony przez to fatalne Alef Zero.
  2. Nie ma to jak uświadomić kolejnych programistów o Optionalach.
    Teraz mam takie kwiatki :-)
Kopiuj
 Optional.ofNullable(  remoteObject.getReference()).ifPresent( r -> target.setReferenceId(r.getId()));

Aczkolwiek pierwsza lekcja zaliczona, isPresent i get() nie jest użyty - zawsze to jakiś postęp...
Z drugiej strony problem to oczywiście remoteObject, który ma nulle i nic na to nie poradzimy.

EDIT:
W przypadku drugim
podany kod jest równoważny

Kopiuj
if (remoteObject.getReference() != null) {
   target.setReferenceId(remoteObject.getReference().getId());
}

Tylko, niepotrzebnie bawimy się w Optionale, bo modne. Jeszcze tworzymy sobie jednego w locie (żeby zaraz się go pozbyć, ale to żaden problem, akurat cykle procka nie są u nas problemem, mamy dużo na zbyciu, razem z RAMem).

Dobre wyjście bez null checka istnieje, ale wymagałoby zmiany pola referenceId na Option, w ogóle wywalenie settera i przejście immutables i w ogóle...
ale to taka sobie kilkuletnia aplikacjia, gdzie taka zmiana IMO nie ma sensu. I tak porypane frameworki nie zrozumieją Optiona w domenie.
A może ktoś ma jakieś lepsze rozwiązanie?


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 9x, ostatnio: jarekr000000
Zobacz pozostałe 9 komentarzy
TD
@jarekr000000: WTFy zawsze są, ale ta historia volatile zbyt dobrze o zespole nie świadczy chyba, przynajmniej tak to przedstawiasz. :)
jarekr000000
@tdudzik - jeszcze mi powiesz, że u Ciebie wszyscy wiedzą co robi volatile (teoretycznie jest to możliwe, ale ja to między bajki jakkolwiek).
W0
Formułka od volatile jest na studiach więc całkiem możliwe :)
TD
@jarekr000000: w moim zespole myślę że tak. Chociaż też jest w sumie pytanie co to znaczy "wiedzą" :)
WhiteLightning
I tu najlepsze volatile mamy zarowno w Javie jak i C++. Maja odmienne znaczenie, ale nie kazdy o tym wie :)
nalik
  • Rejestracja:około 9 lat
  • Ostatnio:prawie 2 lata
  • Postów:1039
4

Jankes programista (mid) napisał parę testów automatycznych (nie jednostkowych). Pewien mock działał w innym wątku udając zewnętrzny system. Problem, że mock dynamicznie dostawał polecenia czego ma się spodziewać z głównego wątku. Synchronizacji brak, nic co by niejawnie wstawiło barierę pamięci. I dziwnym trafem jego testy zaczęły zawodzić. O out-of-order execution, memory ordering i instruction scheduling pewnie nie słyszał. Otworzył mi błąd, że w systemie, coś nie działa ;). Poprawiłem mu kod, dodałem synchroznizację, to się oburzył, że wolno będzie działać, podczas gdy sam nawstawiała pół sekundowych sleepów ;D.

edytowany 1x, ostatnio: nalik
MarekR22
jak widzę kod, który jest synchronizowany przez sleep to mam mordercze myśli.
YA
  • Rejestracja:prawie 10 lat
  • Ostatnio:około 12 godzin
  • Postów:2367
7

Post @nalik o Jankesie przypomniał mi sytuację, gdy trzeba było dostosować "framework testowy" do nowej platformy. Przychodzi kolega w poniedziałek i mówi mi, że nie jest pewien co pozmieniał w piątek, ale "nie ma już błędów" i te testy, które dostał do analizy już przechodzą. No to niewiele myśląc powiedziałem "Dodaj do repozytorium i daj do review", patrzę na commita, a tam funkcjonalność wywołania testów z jakiegoś powodu wykomentowana, na co kolega "o k**a! na chwilę zakomentowałem w piątek i zapomniałem odkomentować". Rzecz jasna po odkomentowaniu nastąpił powrót do dalszej analizy :-)

Sarrus
To mi przypomina false positive kiedy w jednym z testów zapomniałem wstawić asercji. Oczywiście był błąd w tym jednym miejscu, którego owy test miał pilnować ;). Odnośnie wpisu: jeżeli kolega stwierdza, że nie wie co zrobił, że zaczęło działać, to powinien pójść i wrócić jak już będzie wiedział.
Shalom
Hmm ale to kolega nie umiał wyświetlić diffa z poprzednią wesją z repo czy jak? o_O Rozumiem że 40 lat temu mógłby nie mieć do tego narzędzi, ale dziś już się da...
YA
Myślę, że każdemu zdarzają się momenty słabszej dyspozycji, mimo że narzędzia są dostępne :)
Koziołek
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Stacktrace
  • Postów:6821
4

Testy jednostkowe to nieskończone źródło różnego typu WTF-ków.

Kopiuj
for (Assent assent : resp.getYYYYResp().getRspn().getAssnt()) {

	if ("40".equals(assent.getXXXRcpt().getValue())) {
		assertEquals("2", assent.getXXXSts());
	}

	if ("39".equals(assent.getXXXRcpt().getValue())) {
		assertEquals("3", assent.getXXXSts());
	}

	if ("1".equals(assent.getXXXRcpt().getValue())) {
		assertEquals("3", assent.getXXXSts());
	}

}

Tu mamy podwójny WTF. Pierwszy to sama konstrukcja, która sprawdza nie wiadomo co, bo nie wiadomo co tak naprawdę znajduje się w liście. No ale... drugi WTF leży w assertEquals. Otóż gettery zwracają elementy JAXBElement<>, które nie za bardzo można porównywać ze zwykłymi stringami. A później zdziwienie, że testy nie działają.


Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException
DA
IntelliJ nie podpowiada że zachodzi equals między obiektami różnych klas?
Koziołek
To asercja więc typami wejściowymi są Object więc analiza kodu nie wiele daje.
DA
Mimo wszystko, mi na przykład pokazuje: https://i.imgur.com/AdfWwCp.png
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 9 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10045
10

Jak myślicie, co w php zrobi taka linijka?

Kopiuj
rename('/home/user/Desktop/file123.jpg', 'wallpaper.jpg');

Tak! Przeniesie ten plik do current working directory. Why? Bo pod spodem rename to jest mv

Kopiuj
$ mv /home/user/Desktop/file123.jpg wallpaper.jpg
edytowany 1x, ostatnio: Riddle
Zobacz pozostałe 37 komentarzy
LS
@Silv samoopisujący się kod :)
Riddle
@Silv: Sama ścieżka nie
Silv
@TomRiddle: z drugiej strony tak mi się nasunęło: co może oznaczać "must match" w zdaniu "The wrapper used in oldname must match the wrapper used in newname"?
Riddle
"Musi odpowiadać". Prawdopodobnie chodzi o to że mają być takiego samego typu.
Silv
A czym jest ten typ?
LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:31 minut
  • Postów:8398
13

robię sobie kalendarz w JavaScript więc rozgryzam / przypominam sobie szczegóły dotyczące dat. Obiekt Date w JS jest przesiąknięty złą sławą, bo jest on inspirowany obiektem Date z Javy (w końcu skądś JavaScript ma swoją nazwę, nie jest nazywany JavaScript bez powodu), więc są WTFy.

I tak wg JavaScript mamy 118 rok:

Kopiuj
var date = new Date();
console.log(date); // 2018-07-29T17:20:44.724Z> 
console.log(date.getYear()); // 118 (WTF)

(dobra, już znalazłem na MDN, że getYear jest przestarzałe i żeby używać getFullYear ale i tak WTF. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getFullYear

Nie mówiąc już o sztuczkach tego typu, że żeby się dowiedzieć, ile dany miesiąc ma dni, trzeba utworzyć datę, która będzie reprezentowała zerowy dzień kolejnego miesiąca (czyli jeśli chcesz wiedzieć, ile dni ma marzec, to tworzysz datę "zerowego kwietnia" https://stackoverflow.com/a/1184359
Trochę jak na tym memie z Parks & Rec: https://imgur.com/gallery/nfbpv )

Co to do tworzenia dat, też trzeba pamiętać, że miesiące są numerowane od zera i można stosować sztuczki, np. MDN nas uczy, że:
, if values are greater than their logical range (e.g. 13 is provided as the month value or 70 for the minute value), the adjacent value will be adjusted. E.g. new Date(2013, 13, 1) is equivalent to new Date(2014, 1, 1), both create a date for 2014-02-01 (note that the month is 0-based
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

No ale rezultat jest taki, że ciężko tym operować. Nie jestem w stanie utworzyć obiektu daty dla danego dnia :/ Chcę utworzyć datę pierwszego kwietnia, to wrzucam 2018, wrzucam 3 (0 - styczeń, 1 - luty, 2 - marzec, 3 - kwiecień) i wrzucam i 1 (pierwszy), a się wcale nie robi i wyskakuje mi 31 marca. Ale to już kwestia chyba strefy czasowej.

Kopiuj
new Date(2018, 3 /* numeracja od zera */, 1);
2018-03-31T22:00:00.000Z

Więc jak skonwertować to do UTC? Hmm, jest coś takiego jak metoda getUTCDate! Czy to to? Hmmm, zobaczmy:

Kopiuj
new Date(2018, 3 /* numeracja od zera */, 1).getUTCDate(); 
31 // WTF!!!?

Co pisze MDN?
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getUTCDate

The getUTCDate() method returns the day (date) of the month in the specified date according to universal time.

WTF. Przecież date to date a day to powinien być day. Co ciekawe funkcja getUTCDay (której i tak nie potrzebuję, bo chciałem całą datę) też istnieje, ale nie zwraca dnia miesiąca, tylko dzień tygodnia: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getUTCDay

WTF WTFem pogania. Ciekawe czy w Javie też tak jest.


Zobacz pozostałe 21 komentarzy
Marooned
A co oznacza ten 118 rok? Ile minęło od 1900 czy jak?
LukeJL
tak, bo w XX wieku ludzie mówili i pisali potocznie tylko 2 ostatnie liczby. Np. rok '95 zamiast 1995. Tylko komuś wyobraźni zabrakło do tego, że kiedyś XX wiek się skończy i ktoś pisząc język w 1995 dalej przyjął takie nazewnictwo.
Koziołek
@LukeJL: no nie do końca. To jest trochę pozostałość po pierwszych komputerach, które miały bardzo mało pamięci. Przyjęto więc konwencję, że daty 50-99 oznaczają wiek XX, a 00-49 wiek XXI. Następnie w pierwszych implementacjach COBOLa zmieniono sposób zapisu czasu na ilość X od 1 stycznia 1900 0:0:0.000 i odpowiednio przycinano. W efekcie powstał potworek :(
LukeJL
a potem był problem, bo w 2000 roku komputery miały przestać działać (Y2K problem) i wszyscy dygali przed tym, jak teraz dygali przed RODO. Każda firma chciała się przygotować na rok 2000.
Koziołek
A ja do dziś żałuję, że za młody byłem, bo Y2K był bardziej dochodowy niż RODO.
stivens
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 9 godzin
4

Nie wiem czy to dobry temat, ale klikajac w odnosniki jednego z tematow na 4p trafilem na to:

screenshot-20180729204338.png


λλλ
Zobacz pozostałe 10 komentarzy
cerrato
jestem w stanie uwierzyć, że ten antykwariat powstał w jeden dzień ;)
LukeJL
ta strona wygląda jakby była robione maks w 1,5 godziny XD
LukeJL
szczególnie, że to wszystko gotowce - Wordpress, slider, wtyczka do mętów ciała szklistego...
YA
Mnie zadziwia kolorystka belgijskiego antykwariatu i animacja tych kropek i kresek, WTF? Co to ma wspólnego z antykwariatem? Ach, wrażenie robi też wysoka pozycja strony po wpisaniu w googlach "belgijski antykwariat".
fasadin
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
1

Docker... a raczej Docker CLI na windowsa

  1. uzyj do logowania swojego maila
  2. odpal komende ktora dzialala Ci wczesniej na linuxie
  3. dostajesz Unable to find image 'postgres:latest' locally, zaraz po tym dostajesz unauthorized: incorrect username or password
  4. https://github.com/docker/hub-feedback/issues/935#issuecomment-300361781
  5. robisz reloga na ID
  6. Dziala
  7. ???????
E9
Docker na Windowsie to jedne wielkie gowno. Zawsze gdy mam jakiś błąd to przed sprawdzeniem w googlu najpierw leci restart..
Koziołek
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Stacktrace
  • Postów:6821
4

W nawiązaniu do postu @LukeJL. Mamy sobie taki oto test:

Kopiuj
@Test
public void floodGenerator() {
    Date db = new Date(1984, 0, 21);
    Set<String> generated = new HashSet<String>();
    for (int i = 0; i < 1000; i++) {
        generated.add(
                sut.generate(db, "M")
        );
    }
    System.out.println(generated);
    Assert.assertEquals(1000, generated.size());
}

Ma on za zadanie sprawdzić ile czasu zajmie wygenerowanie wszystkich numerów PESEL dla danej płci i daty urodzenia. Ma to nam podpowiedzieć jak dużo kolizji będziemy mieć w testach wydajnościowych. Trochę dupa-debug, ale nieważne.

Sam generator PESEL ma taki oto fragment:

Kopiuj
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(birthDt.getTime());
int yyyy = cal.get(Calendar.YEAR);
int MM = cal.get(Calendar.MONTH) + 1;
int dd = cal.get(Calendar.DAY_OF_MONTH);

if (yyyy < 1800 || yyyy >= 2400) {
    return "";
}

Pytanie ile numerów PESEL zostanie wygenerowanych?


Oczywiście 0. Bo Date w konstruktorze dodaje sobie 1900 do daty.


Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException
DQ
Ciekawe jest to, że w JavaDoc'u jest napisane "@param year the year minus 1900."
Koziołek
Jest też dopisek w dokumentacji run with param -Dmaven.test.skip=true, ale to u nas :D
MarekR22
to +1900 do roku to jest spadek po API C, więc problem powinien być znany.
Koziołek
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Stacktrace
  • Postów:6821
2

BYŁO W INNYM WĄTKU, ALE TO BYŁ ZŁY WĄTEK

Z serii spłodziłem potwora.

Importy statyczne w Javie są jakie są. Niektórzy lubią inni nienawidzą. W połączeniu z klasami wewnętrznymi można sobie za ich pomocą spaść z rowerka albo bardzo ułatwić pisanie czytelnego kodu. czy to opcja pierwsza czy druga sami oceńcie:

Kopiuj
import static pl.firma.produkt.generator.loadui.configuration.ComposedRunConfigurationProvider.MergedRunConfiguration.MergedRunConfigurationBuilder.aMergedRunConfiguration;

Co ciekawe w samym docelowym kodzie:

Kopiuj
static RunConfiguration merge(RunConfiguration left, RunConfiguration right) {
    int order = left.compareTo(right);
    return aMergedRunConfiguration()
            .withActive(pickOne(order, left.isActive(), right.isActive(), def.isActive()))
            // .... 
            .build();
}

Nazewnictwo jest jeszcze do poprawy, ale to pikuś.

#spłodziłempotwora


Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException
cerrato
Moderator Kariera
  • Rejestracja:około 7 lat
  • Ostatnio:około 17 godzin
  • Lokalizacja:Poznań
  • Postów:8753
2

Raben - wielka, poważna, bogata, międzynarodowa firma spedycyjna.
Ale przycisków na stronie jakoś ogarnąć nie umieją ;)

screenshot-20180807163243.png


Zobacz pozostałe 3 komentarze
dzek69
Powiem tak - znajdź mi dowolną wielką firmę, a znajdę Ci gdzie mają skopany css na stronie ;)
cerrato
Wyzwanie przyjęte. Jak nie zapomnę to coś ci dam do analizy :D
axelbest
Jeden raben powie tak, a inny powie nie
vpiotr
CSS wymyślili jacyś prawie programiści co nie umieją programować w XMLu...
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:8 minut
3

Zmieniłem pracę.
jenkins master
WTF1: ostatni zielony build 2017-09-01 22:00
WTF2: ostatni zielony ma numer #51 a najświeższy #117
liczba buildów na develop 511 (bardzo mało)

I tak sobie myślę albo zostanę tutaj zbawcą, albo zmienię pracę po okresie próbnym.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
vpiotr
Zapytaj się czy można wyłączyć jenkinsa skoro się nie sprawdza. Jeśli powiedzą że tak, to odejdź :)
robertwadowski
robertwadowski
właśnie jest po to okres próbny, a miało być tak pięknie ... :D
jarekr000000
Miałem to. W stylu: 5 miesięcy temu był ostatni zielony build i był to jeden jedyny zielony build w ciągu roku. Zrobiłem różne rzeczy, ale najważniejsze to : a) wizualizację buildów w postaci ekranu z lampkami widocznego w pokoju - po zepsuciu od razu było widać, ze zdjęciem bohatera (maile itp. często nie działają) b) wywaliłem testy, które się ciągle psuły (głównie selenium), był płacz ale pomogło
vpiotr
@jarekr000000: In time, you will help them accomplish wonders
Haskell
  • Rejestracja:ponad 9 lat
  • Ostatnio:10 miesięcy
  • Postów:4700
3

Bardzo pracowitych ludzi mam w dziale:

Kopiuj
IF {ID} = 1 THEN "ZC"
ELSE IF {ID} = 2 THEN "ZK"
ELSE IF {ID} = 3 THEN "SC"
ELSE IF {ID} = 4 THEN "SCF"
ELSE IF {ID} = 5 THEN "SCL"
ELSE IF {ID} = 6 THEN "R-m P"
ELSE IF {ID} = 7 THEN "TN"
ELSE IF {ID} = 8 THEN "UM"
ELSE IF {ID} = 9 THEN "JC"
ELSE IF {ID} = 10 THEN "TP"
ELSE IF {ID} = 11 THEN "ZLM"
ELSE IF {ID} = 12 THEN "LA"
ELSE IF {ID} = 13 THEN "PT"
ELSE IF {ID} = 14 THEN "PZ"
ELSE IF {ID} = 15 THEN "ZB"
ELSE IF {ID} = 16 THEN "R-M PF"
ELSE IF {ID} = 17 THEN "UM"
ELSE IF {ID} = 18 THEN "F+U"
ELSE IF {ID} = 19 THEN "ZC"
ELSE IF {ID} = 20 THEN "ZK"
ELSE IF {ID} = 21 THEN "SC
ELSE IF {ID} = 22 THEN "SCF"
ELSE IF {ID} = 23 THEN "SCL"
ELSE IF {ID} = 24 THEN "R-m P"
ELSE IF {ID} = 25 THEN "TN"
ELSE IF {ID} = 26 THEN "UM"
ELSE IF {ID} = 27 THEN "JC"
ELSE IF {ID} = 28 THEN "TP"
ELSE IF {ID} = 29 THEN "ZLM"
ELSE IF {ID} = 30 THEN "LA"
ELSE IF {ID} = 31 THEN "PT"
ELSE IF {ID} = 32 THEN "PZ"
ELSE IF {ID} = 33 THEN "ZB"
ELSE IF {ID} = 34 THEN "R-M F"
ELSE IF {ID} = 35 THEN "UM"
ELSE IF {ID} = 36 THEN "F+U"
ELSE IF {ID} = 37 THEN "Europe"
ELSE IF {ID} = 38 THEN "BU"
ELSE IF {ID} = 39 THEN "FI"

Zaglądali do kufrów, zaglądali do waliz, nie zajrzeli do d**y - tam miałem socjalizm. Czesław Miłosz
Zobacz pozostałe 4 komentarze
cerrato
ale w sumie to switch dużo się od tych if'ów nie różni :P
Haskell
Zdecydowanie się różni, ponieważ mamy krótszy kod i od razu widzimy, że wszystkie wyniki zależą od jednej zmiennej. Jest czystsze schludniejsze, łatwiej się czyta. Poza tym doczytaj mój komentarz do końca, bo podałem kolejne rozwiązania, które diametralnie zmieniają postać rzeczy, o ile można/warto je zastosować.
LP
Jest dodatkowy smaczek w tym kodzie: wartości wyjściowe nie są unikalne - dwa różne ID mapują się na ten sam output. Bez szerszego spojrzenia na kod optymalizacja tego fragmentu mija się z celem. Najprawdopodniej wymagana jest tutaj ortogonalna optymalizacja - gruntowna zmiana architektury. Wnioskuję że w tym projekcie jest wiele takich miejsc, warto byłoby te wszystkie problemy rozwiązać za pomocą rozwiązania systemowego a nie łatania małych części kodu w kilku miejscach.
cerrato
@lubie_programowac: dobrze, że napisałeś "smaczek" a nie "błąd" ;)
Haskell
@lubie_programowac: masz rację, ten kod to wynik złego rozwiązania w innym miejscu. Jak oglądałem to wczoraj to po godzinie słania WTF zdecydowałem o zaoraniu całości, bo poprawianie tego to byłaby rzeźba w brązie. Niestety niektórzy programiści są nieuleczalnie pracowici i co najgorsze później tłumaczą się pośpiechem...
IH
  • Rejestracja:ponad 6 lat
  • Ostatnio:dzień
  • Postów:103
21

screenshot-20180810164500.png

WhiteLightning
  • Rejestracja:prawie 14 lat
  • Ostatnio:2 dni
  • Postów:3168
2

GOG -> nieopatrznie na wakacjach zalogowalem sie na swoje konto z innego kraju. Teraz nie jestem w stanie wybrac PLN jako waluty bo mam do wyboru tylko EUR i USD bo strona "mysli" ze jestem za granica chociaz wrocilem...

stivens
moze inkantacja Globalnego Otwarcia Gotfryda pomoze :D
Michał Sikora
Michał Sikora
  • Rejestracja:około 7 lat
  • Ostatnio:prawie 4 lata
  • Lokalizacja:Kraków
  • Postów:834
6

Może nie do końca programistyczny, ale WTF.

Aplikacja, którą obecnie rozwijamy korzysta z urządzeń mobilnych w roli pośrednika pomiędzy backendem a urządzeniem Bluetooth LE. Swego czasu biznes sobie zażyczył, żeby była możliwość monitorowania nieporządanych zachowań - jeżeli ktoś wchodzi w interakcję z tym urządzeniem bez udziału backendu, to powinniśmy mieć możliwość identyfikacji takich zdarzeń. Wymaganie rozsądne, więc zabraliśmy się za opracowanie rozwiązania.

Jak się okazało, zadanie wymagało dużo głębszych zmian i nie było ówcześnie do zrealizowania. Musieliśmy zatem opracować nowy protokół komunikacyjny, który by nam na to pozwalał. W skrócie korzystaliśmy z AESa wynegocjowanego z udziałem backendu i urządzenia BLE. Do detekcji złośliwych zachowań chcieliśmy użyć pewnych metadanych, które są generowane po każdej akcji i są dla niej unikalne w czasie.

Mimo że nie miało to sensu, to niemieccy spece od bezpieczeństwa rzekli "Schmetterlinge und Pfannkuchen dürfen nicht skaten", co mniej więcej tłumaczy się na "Metadane muszę być szyfrowane, bo tak". To nam trochę zabiło ćwieka, bo co prawda nowy protokoł szyfrował istotną komunikację po BLE, ale backend nie był przygotowany pod odszyfrowanie wiadomości. Poinformowaliśmy o tym dział bezpieczeństwa. W odpowiedzi otrzymaliśmy sugestię, która rozwiała wszelkie wątpliwości. Mamy szyfrować metadane i wysyłać je na backend razem z kluczem szyfrującym.

Rozwiązania oczywiście nie zaimplementowaliśmy, tylko zaktualizowaśmy naszą propozycję, żeby się jednak dało odszyfrować. Niemniej, niemiecka myśl techniczna wiecznie żywa.

Zobacz pozostałe 3 komentarze
Azarien
@Michał Sikora: przesyłanie szyfrogramu wraz z kluczem to byłoby skramblowanie. co w niektórych zastosowaniach jest wystarczające.
Michał Sikora
Michał Sikora
Oni chcieli, żeby te dane szyfrować (nie skramblować). Pomijając to, że jawne przesyłanie wystarczyłoby, żeby tutaj spełniać swoją funkcję.
vpiotr
@Michał Sikora: Mamy szyfrować metadane i wysyłać je na backend razem z kluczem szyfrującym. - czyli każdy podsłuchując transmisje może je odszyfrować? Jeśli tak, to jest to zaciemnianie danych (scrambling) a nie szyfrowanie. A to że użyliście AESa nie ma znaczenia - liczy się efekt końcowy.
Michał Sikora
Michał Sikora
Przeczytaj jeszcze raz, kto i co powiedział, bo chyba nie zrozumiałeś.
vpiotr
Aaa, ok, my bad.
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 4 godziny
4

Jednym z większych WTF-ów Gita jest, że można bardzo łatwo niechcący stworzyć sobie lokalną branczę o nazwie origin/master.

Zobacz pozostałe 13 komentarzy
Azarien
alternatywnie mógłbym zrobić git branch -D master / git checkout master ale to dwie komendy zamiast jednej.
Riddle
To branchy feature/TASK-145 też ma się nie dać tak prost robić? Przecież ktoś może sobie dodać remote'a feature :/
Azarien
@TomRiddle: a po co ma się dać? uważam że / nie powinno być dozwolonym znakiem w nazwie brancza. wyobraź sobie że w filesystemie możesz tworzyć pliki z ukośnikiem w nazwie i jaki chaos to by powodowało.
Riddle
@Azarien: No racja, slash w nazwie faktycznie głupi pomysł.
LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:31 minut
  • Postów:8398
4

Dzisiaj przez przypadek odkryłem, że w JS pętla for..i służąca do iteracji po kluczach obiektu pozwala na iterację po null czy undefined, czyli po czymś co nie ma sensu i co powinno się wykrzaczyć (bo lepiej "fail fast" niż potem ma łazić gdzieś błąd),

Kopiuj
for (let k in null) console.log("aaaa"); // nie pojawi się nic, ponieważ null nie ma kluczy

Czyli w zasadzie ukrywanie błędów, bo wtedy coś będzie null czy undefined (zamiast być obiektem) a my nawet tego nie wiemy.
Szczególnie, że w innych sytuacjach JS ładnie zgłasza błąd, kiedy potraktujemy null czy undefined jak obiekt (np. próba dostępu do właściwości null czy undefined kończy się rzuceniem wyjątku).

Co prawda nowsze Object.keys() się ładnie wykrzacza jak się poda null czy undefined, jednak dalej nie wykrzacza się, jak podamy mu liczbę albo boolean

Kopiuj
Object.keys(null); // ładnie się wykrzaczy
Object.keys(false); // []
Object.keys(10); // []

Może to i ma jakiś sens (liczby nie są w JS obiektami, ale mogą być czasem traktowane jak obiekty, oraz mają odpowiedniki w obiektach np. new Number(10) tworzy liczbę, która jest obiektem), ale to tylko sprawia, że ten język staje się coraz bardziej zamotany. Mówi się o tym, że JS ma słabe typowanie ale ja bym raczej powiedział, że ma chaotyczne typowanie i nigdy nie wiesz, na jaką niespodziankę trafisz.

Np. konwersja nieznanej wartości foo do stringa. Kiedyś używałem foo.toString(). I było dobrze. Dopóki nie natrafiłem na null czy undefined. Wtedy był błąd.

TypeError: Cannot read property 'toString' of null

Więc nauczyłem się, żeby nie robić foo.toString tylko zacząłem się używać tricku z niejawnym przymuszaniem:

Kopiuj
foo + '';

Który każdą wartość zamieniał ładnie na string.

I przez długi czas tak to zdawało egzamin. Potem jednak pojawiły się Symbole w ES6. I ku mojemu zdziwieniu ten kod:

Kopiuj
const s = Symbol();
s + '';

rzucał wyjątkiem TypeError: Cannot convert a Symbol value to a string. I co robić? Jak konwertować stringi? Wtedy przeszukałem MDNy i zorientowałem się, że można konwertować wartości (w tym symbole) do stringa w ten prosty sposób

Kopiuj
String(foo);

i to działa chyba na wszystkim. Proste i logiczne. Nie wiem czemu na to nie wpadłem wcześniej.

Ale trzeba oczywiście wspomnieć o tym, że String(foo) to nie to samo co new String(foo). Ten pierwszy tworzy stringa, ten drugi tworzy obiekt String, czyli coś, czego w 99% ( albo i więcej) przypadków nie będziemy potrzebować, a co może nam tylko zaburzyć porównania, bo jak porównujemy z == to jest równe, a jak z === to nie jest.

Kopiuj
String("foo") == new String("foo"); 
String("foo") !== new String("foo"); 

co jest zresztą logiczne. Bo new String("foo") to obiekt więc czemu ma być równe === stringowi? Ale mimo wszystko mylące, błędogenne.


edytowany 6x, ostatnio: LukeJL
dzek69
for - tu mnie zaskoczyłeś i faktycznie wstyd; konwersja poprzez + "" - nie zaleca się tak robić - żeby castować, zawsze jawnie piszemy: String(), Boolean(), Number()/parseInt() (niektórzy zastępują dwa ostatnie przy pomocy ~~"123.56"); new String() vs String raczej też powinna być znana jak ktoś zamierza coś więcej niż skrypt w jQuery zrobić i pojawia się to na rozmowach technicznych.
LukeJL
To, że coś jest znane, nie zmienia faktu, że jest to WTF ;) ten język został źle zaprojektowany.
KR
w wielu językach null jest równoznaczny z pustą listą/obiektem więc foreach na nullu mnie specjalnie nie dziwi
john_klamka
  • Rejestracja:prawie 9 lat
  • Ostatnio:prawie 5 lat
  • Postów:177
7

Zmieniła się pewna procedura w firmie i trzeba było odzwierciedlić to w kodzie. Za taska zabrał się nie kto inny jak sam PRINCIPAL SENIOR TECH LEAD ARCHITECT. Zmiana nie była wymagająca, ale unit testy już go przerosły. Zamiast zmodyfikować 2 (dwa!) testy, odpowiedzialne za ten fragment kodu, zwyczajnie je usunął. Oczywiście nikt nie mógł zareagować, bo jego nie dotyczą code review.... FML.

Zobacz pozostałe 15 komentarzy
Michał Sikora
Michał Sikora
Typowy niemiecki programista nie wyróżnia się raczej jakoś specjalnie. Klepacz jak każdy inny. Da się z nim nawet porozmawiać i przekonać, że nie trzeba pisać kodu jak dziadowie. Za to niemiecki architekt tudzież specjalista w swojej dziedzinie już wykazuje się ponadprzeciętnym zabetonowaniem.
jarekr000000
Ogólnie z architektami jest problem, to zwykle goście co wiedzą jak zrobić teraz dobrze system, który zrypali 8 lat temu. I nie kumają, że teraz mają zrobić zupełnie inny system. Germańscy sa tylko nieco statystycznie gorsi, bo często mają wybuchową mieszankę europejskiego poczucia wyższości połączonego z tradycyjnym niemieckim bałaganem.
LukeJL
ale czy ci architekci programują dalej, czy oglądają świat z "wieży z kości słoniowej"? Bo jeśli to drugie, to w sumie nic dziwnego, że są słabi. Do nauki architektury oprogramowania trzeba jednak mieć doświadczenie w programowaniu.
jarekr000000
Powiedziałbym, że najgorsze doświadczenia mam właśnie z programującymi... tych z wieży łatwo zignorować totalnie. Np. tacy jedni dostali puste repo (init project -spring boot - hello world) do audytowania i przeglądania - i po pół roku (ostatnio) chyba zaczęli coś podejrzewać... , ale pół roku spokoju jednak było.
Michał Sikora
Michał Sikora
Spotkałem się z dwoma rodzajami archytektów. Pierwsi, co przemawiają do nas szaraków z ambony i trzeba po nich potem poprawiać rozwiązania. Drudzy zatrzymani gdzieś w Javie 6 i piszą lekki kod na 200 klas i 30 pakietów do robienia połowy jednego zadania dobrze. Najgorsze, że po tych drugich nie można poprawiać, bo inaczej runęłyby fundamenty programowania.
Koziołek
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Stacktrace
  • Postów:6821
2

Numer NRB, ktokolwiek widział ktokolwiek wie.

W dzisiejszym odcinku mały WTF, który dużo mówi o tym dlaczego dokumentacja jest potrzebna. Zacznijmy jednak od podstaw. Numer NRB identyfikuje wasze konta w banku. Sposób jego generowania jest opisany w normie PrPN-F-01102, ale normę mało kto czytał. Wśród programistów zapewne niewielu ma pojęcie o istnieniu tej normy. Lecz przyjrzyjmy się historii kolegi K.

K. jest młodym programistą i ostatnie 4 godziny spędził próbując rozkminić następujący fragment kodu:

Kopiuj
nrb = "";
        for (i = 0; i < 24; i++) {
            nrb += String.valueOf(r.nextInt(10));
        }
nrb = nrb + "252100";

Numer NRB ma 26 cyfr w tym 2 kontrolne na początku. Po co zatem dodatkowe 252100? Co więcej zalicza się je do wyliczania sumy kontrolnej! I tu właśnie potrzebna jest dokumentacja, która odeśle do normy. Brak dokumentacji, 4 godziny w plecy.


Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException
Zobacz pozostałe 3 komentarze
PA
Ale zaraz, bo zmienna nrb sugeruje, że mamy numer rachunku bankowego, który wg. normy w polskim systemie ma 3 człony C-sumę kontrolną, A-numer rozliczeniowy jednostki organizacyjnej banku, B- numer rachunku klienta, WTF jest dla mnie to, (ze pewnie wynika gdzieś z kontekstu kodu, że jest tam liczona/sprawdzana suma kontrolna), że junior nie sprawdził jak to się robi, a rozkminial to z kodu...
Koziołek
@Panczo: junior może i sięgnął do wikipedii gdzie masz opisany format, ale nie ma tam opisanego sposobu wyliczania sumy kontrolnej, a na to, żeby poszukać w bazie norm mało kto wpadnie.
PA
Ja to chyba już stary jestem, bo zawsze zaczynam szukać od "oficjalnych" dokumentów...
MarekR22
Powinno być POLISH_CODE = "2521" oraz NO_CHECKSUM = "00" poza tym napisałbym całą funkcję tak, by obsługiwała dowolny kraj i opakował ją funkcją specyficzną dla polski. Swoją drogą doskonała okazja by przekonać młodego, że magic numbers to samo zło.
vpiotr
Autor tego kodu powinien przeprosić juniora. Poza tym jak widzę hasło "Polska Norma" to już mi się odechciewa dalej czytać. https://pl.wikipedia.org/wiki/Mi%C4%99dzynarodowy_numer_rachunku_bankowego
hurgadion
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 6 lat
  • Lokalizacja:www
  • Postów:259
0

może nie WTF, ale zaskakujące zagadnienie... przy imporcie jednego wiersza danych w Excelu do tablicy otrzymujemy tablicę dwuwymiarową (jeden z wymiarów to oczywiście 1)... która jest tak naprawdę jednowymiarowa... ale można uroczo napisać piękny kod:

Kopiuj
tbl = Application.Transpose(Application.Transpose(tbl))

i otrzymujemy naprawdę jednowymiarową tablicę, i dosłownie, i w przenośni... takich kwiatków jest więcej... :)

fasadin
jaka funkcja pobierasz ten jeden wiersz? GetRow() czy GetRows(1), bo jezeli to drugie to nie dziwie sie czemu tablica dwuwymiarowa. Reszta to co napisales to oczywista oczywistosc (ale tez niekoniecznie bo zalezy jak tablice sa w danym jezyku zaimplementowane)
hurgadion
generalnie tablice są zaimplementowane w VBA nie najlepiej, żeby nie powiedzieć topornie... ;) a wciska się elementy Arkusza do tablicy dość wygodnie, nawet bez potrzeby GetRow... tbl = Range("A1:A10").Value
Michał Sikora
Michał Sikora
  • Rejestracja:około 7 lat
  • Ostatnio:prawie 4 lata
  • Lokalizacja:Kraków
  • Postów:834
4

Backend dostał prikaz integracji "biblioteki" z bliźniaczego projektu. Teraz zagadka. Kto jest odpowiedzialny za poniższy kawałek kodu?

  1. Stażysta bootkampowicz.
  2. Hinduska siła robocza.
  3. #germanskiprogramistaarchitekt 30 lat doświadczenia.
Kopiuj
public class SimpleTenantSpecific implements TenantSpecific {
  private TenantType tenant;

  public SimpleTenantSpecific() {
  }

  public SimpleTenantSpecific(TenantType tenant) {
    this.tenant = tenant;
  }

  public void setTenant(TenantType tenant) {
    if (this.tenant != null && this.tenant != tenant) {
      throw new IllegalStateException("Tenant must not be changed once it is set. Old value: " + this.tenant + ", New value: " + tenant);
    }
    this.tenant = tenant;
  }

  public TenantType getTenant() {
    return tenant;
  }

  @Override public boolean isActivatedFor(TenantType tenant) {
    if (this.tenant == null) {
      throw new IllegalStateException("Tenant needs to be set before method might be called");
    }
    return this.tenant == tenant;
  }
}

Co ciekawe, nie ma miejsca w kodzie, gdzie pusty konstruktor, byłby wywołany bez natychmiastowego użycia settera zaraz po nim. Moim zdaniem brakuje tylko tego, żeby zapewnić niemutowalność i zabezpieczyć się przed nullami.

Kopiuj
public TenantType getTenant() {
  if (tenant == null) {
    throw new IllegalStateException("Tenant needs to be set before method might be called");
  }
  return tenant;
}
edytowany 1x, ostatnio: Michał Sikora
Zobacz pozostały 1 komentarz
Michał Sikora
Michał Sikora
Odpowiedź poprawna. Ale na co komu jawadok dla settera? Przecież to setter jak każdy inny. Za to jest jawadok dla metody z interfejsu. Check if the given tenant is supported by this class / component. @return <code>true</code> if the functionality is available for the given tenant, <code>false</code> otherwise.
Michał Sikora
Michał Sikora
Aby się lepiej żyło wszystkim w klasie nie brakuje również dokumentacji dla konstruktorów.
LukeJL
czy mi się wydaje, czy ten kod nic nie robi, a jest opakowanym w klasę wrapperem na zmienną TenantType tenant;?
Michał Sikora
Michał Sikora
Gorzej. Ten kod robi za dużo jednocześnie nie robiąc nic. Ale w skrócie to tak. Taki wrapper do rozszerzania, który rabuje kompilator z jakiegokolwiek bezpieczeństwa.
LukeJL
może ktoś specjalnie to zrobił z lenistwa (nie chciało mu się pracować nad taskiem, więc zaczął z nudów się tak bawić w owijanie zmiennej), albo chciał sobie zabezpieczyć miejsce pracy na przyszłość (bo jak każdy moduł tak wygląda, to autor kodu będzie pewnie jedyną osobą, która ogarnia projekt).
Michał Sikora
Michał Sikora
  • Rejestracja:około 7 lat
  • Ostatnio:prawie 4 lata
  • Lokalizacja:Kraków
  • Postów:834
3

Przeglądania kodu na backendzie ciąg dalszy.

Kopiuj
public Optional<Parcel> getParcel(ParcelIdentity parcelId) {
  Optional<ParcelEntity> parcelEntityOpt = entityRepository.findByParcelId(parcelId.getStr());
  return parcelEntityOpt.isPresent() ? Optional.of(parcelEntityOpt.get().getDomainObject()) : Optional.empty();
}

I tak praktycznie wszędzie gdzie jest Optional użyty. Popełnił junior bootkampowicz, więc nie będę się znęcał. Natomiast przyklepał programista ze stażem > 5 lat.

edytowany 1x, ostatnio: Michał Sikora
john_klamka
ale nulla nie dostaniesz! :P
robertwadowski
robertwadowski
i w dodatku ternary operator jest, tak więc full wypas :D
somekind
Dziwne te optionale w Javie.
jarekr000000
Niedawno takie kwiatki miałem, ale już się poprawiło, w dwóch rzutach. Okazało się, że rada nie używaj isPresent nie wystarcza, bo powstaje wtedy zwyrodnienie drugiego rodzaju. Ale po kolejnej iteracji jest już ok.
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:8 minut
1

Nie ma to jak rozwiązać prosty problem nadania wątkowi nazwy, w zakręcony nieczytelny i mistyczny sposób:
https://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx
Oczywiście jak brakuje jakiejś flagi to się kończy niezłapanym wyjątkiem :/.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
jarekr000000
Exception oriented programming?
Koziołek
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Stacktrace
  • Postów:6821
3

Najczęstsza przyczyna NPE? Co zabawne zdarza się od czasu do czasu, bo ktoś coś inaczej skonfiguruje.

Kopiuj
log.log("SqlSession initialized with env=" + sqlSessionFactory.getConfiguration().getEnvironment().getId());

Getter train has no breaks

Getter train has no breaks


Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException
john_klamka
null conditional operator to the rescue
Koziołek
Kotlin po prostu. Względnie w Vavr.io i Try
Shalom
Albo Optional i map map map ;)
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)