Programistyczne WTF jakie Was spotkały

Programistyczne WTF jakie Was spotkały
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 7 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10056
2

PHP 8.2 wyszło 24 listopada, czyli prawie 3 miesiące temu, a w oficjalnej dokumentacji nie ma ani słowa o dodatkowych wartościach: Np wszedł modyfikator /n: https://www.php.net/manual/en/reference.pcre.pattern.modifiers.php a dokumentacja niezaktualizowana. Czy oni są poważni w tym pehapie?

Zobacz pozostałe 5 komentarzy
somekind
@Alley Cat: no nie wiem, Czarny Kot został zaorany, a za zaoranie PHP nikt się nawet nie bierze.
axelbest
Ehhh, kolejne narzekanie na phpa... wrzucone na forum, które jest w phpie pisane, przez forumowicza, który zrobił super-fajne narzędzie do regexp'ow. w php. Czekam aż zaraz ktoś podeśle link do FB (który też jest w php zrobiony), z artykułem z 2011 roku którym jest piękny wywód jakie to php złe. Oczywiscie z javie czy c# takich bledow z dokumentacją nie ma prawda? Prawda? https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8271083 Status: Open | Resolution: Unresolved | Submitted: 2021-07-21 | Updated: 2023-01-11
obscurity
@axelbest: fajnie że rozgrywasz wszystkie strony sporu, możesz się kłócić sam ze sobą
obscurity
@WeiXiao: w sumie ciekawostka - wychodzi że "twórca" php tak naprawdę jest całkiem przeciętnym programistą który nie potrafi zaprojektować języka czy napisać kompilator a jedynie stworzył rozbudowany system szablonów i prosty parser do tego żeby zrobić sobie stronkę domową i śledzić kto ją odwiedza. Osobami które zrobiły z tego "poważny" język są Andi Gutmans i Zeev Suraski którzy przepisali prosty interpreter na kompilator i dorobili do niego jakikolwiek standard. Można się zapisać na kartach historii zaledwie rozpoczynając coś nowego bez planu.
obscurity
Jeszcze ciekawe że na początku php wyglądał jak język szablonowy, bardzo podobny do smarty który potem powstał w php i był przez niego interpretowany. Czyli język szablonowy napisany w C przerodził się w język programowania w którym powstał język szablonowy w nim napisany; musimy pójść dalej.
WhiteLightning
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 8 godzin
  • Postów:3169
1

Czy to oglosznie jest nas serio, ponizej minimalnej: https://justjoin.it/offers/softnice-full-stack-net-developer

Zobacz pozostały 1 komentarz
obscurity
na serio tylko któraś jednostka się pomyliła, podejrzewam że chodzi o stawkę dzienną
WeiXiao
a to nie miał być dzień?
WhiteLightning
Nawet jesli ktos sie pomylil, to wrzucic ogloszenie do sieci i nie sprawdzic?
several
1 000 - 1 500 PLN net/month - B2B Nie no to musi być jakiś żart. Szczególnie jak się spojrzy w wymagania dalej Summary: Senior experience on .NET Core, C#, React JS, Docker, k8s, GCP.
DN
teraz już 'Undisclosed Salary'
LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:około 5 godzin
  • Postów:8406
0

myślę, że to jakaś literówka/nieporozumienie.

  • zabrakło jednego zera? chociaż wtedy 10-15k to też mało, bo szukają kogoś doświadczonego
  • zabrakło jednego zera i informacji, że stawka jest w euro czy usd?
  • stawka jest za dzień?
  • to praca dorywcza, a nie pełen etat?

edytowany 2x, ostatnio: LukeJL
Miang
a firmy wszystkie wątpliwości na korzyść kandydata też rozstrzygają czy od razu /dev/null ?
LukeJL
no nie wiem, ja bym tam nie aplikował, jak napisali maks 1,5 tysiąca na miesiąc, po prostu wydaje mi się, że w tym wypadku zaszło jakieś nieporozumienie.
Schadoow
Duża szansa ze dniowa. Po przemnożeniu przez x21 daje typowe widełki.
several
Jeśli byłaby to dniówka B2B to miałoby to sens.
sultan_kosmitow
  • Rejestracja:ponad 4 lata
  • Ostatnio:prawie 2 lata
  • Postów:10
1

Makra w Rust, ale po zrozumieniu nawet ma to sens. Chyba 1 jezyk ktory robi to dobrze

Zobacz pozostałe 3 komentarze
hauleth
No w makrach zawsze operujesz na AST, taka jest idea.
sultan_kosmitow
owszem, ale w tym miejscu UX jezyka jest okropny
LukeJL
Może to dobrze, bo może odstraszy ludzi przed nadużywaniem makr. To, co się za łatwo robi, to jest nadużywane.
jarekr000000
No właśnie - makra to WTF w C/C++ i podobnych. W nowszych językach są całkiem normalne.
hauleth
@sultan_kosmitow: no bo to są makra. To zawsze będzie abstrakcyjne dla osób, które nie mają doświadczenia. No i zgadzam się z @LukeJL - to należy ich nie używać, bo nadużywanie makr prowadzi właśnie do horrorów.
Manna5
  • Rejestracja:prawie 6 lat
  • Ostatnio:około 10 godzin
  • Lokalizacja:Kraków
  • Postów:639
0

Brat zawołał mnie, że Scratch mu się zepsuł. Okazało się, że niechcący zaznaczył opis klocka. Twórcy Scratcha nie potrafią dać tam user-select: none;?


VA
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 22 godziny
3

Dzisiaj w bitbuckecie zobaczyłem ciekawy komentarz napisany przez leada zespołu w którym mam przyjemność (coraz mniejszą) pracować.
Poruszyłem temat jakichś zmian w kodzie i dołożył swoją odpowiedź o treści:

Długie komentarze mogą prowadzić do błędnych decyzji. Jeśli jest jakiś problem to zaznaczyć ale nie prowadzić tu dyskusji.

Czas pakować mandżur

Zobacz pozostałe 80 komentarzy
CP
@obscurity: to że umiem dobrze matematykę to mogę ci zbudować cokolwiek chcesz, a nie że umiem przewidzeć przyszłość, musisz to zrozumieć. Trochę przeginasz...
obscurity
mówiłeś że da się liczyć ruchy do przodu, myślałem że umiesz uniwersalnie
CP
Tak da się liczyć jak masz rzut monetą i rzucisz dwa razy to masz bramkę AND czyli 75% procent na orła i 25% procent na reszkę jak oczekujesz orła, w przeciwnym wypatku odwrotnie :> Ciekawe, że statystyka tylko opłaca się długo dystansowo na krótki odcinku jest g**no warta i można się zawieść np. nigdy nie wygrasz w lotto 1 : 14 mln,czyli 21 razy rzut monetą orła,
CP
tak umiem do przodu liczyć bardzo dużo(5-10 ruchów, do tyłu też ale tam pamiętam wszystkie ruchy jeśli wiem, że to gra), ale nie jestem w stanie pokonać losowości.
CP
@obscurity: ciekawa jest losowość np. taka generowanie sesji jeśli użyje się jakiegoś algorytmu pseudolosowego, przy zebraniu próbek różnych sesji da się przewidzieć przyszłe i przeszłe sesje i się pod daną sesję wpiąć. Znając algorytm hashowania można też dodawać do bazydanych same kolizijne wartości przez co wszystko będzie trafiało do tego samego wiaderka i uwalić wydajność.
orchowskia
  • Rejestracja:około 6 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Zielona Góra
  • Postów:83
2

Coś mi strzeliło do głowy i sobie wziąłem frontendowy task. Zrobić checkbox. Niby prosta sprawa.

Okazało się że trzeba zrobić mikrofrontend z chceckboxem...

Okeej... reszta checkboxów na stronie jest w statycznym webformem(server side rendering) i trzeba to jakoś pożenić. No to eventy przez obiekt window i się komunikujemy ze stroną na której osadzam checkbox żeby zapisać jego stan po kliknięciu przycisku save.

Okeej.. okazuje się że na stronie jest inny mikrofrontend wrzucany tam warunkowo, który zmienia zachowanie całego formularza w taki sposób że nie idzie się wpiąć pomiędzy i trzebaby go poprawić.

Okeej.. szybka pragmatyczna decyzja, chrzanić UX, będziemy zapisywać nowy stan tego checkboxa zaraz po jego zmianie, bez konieczności klikania save.

Pull Request. Każdemu kolejnemu frontasiowi muszę oddzielnie tłumaczyć skąd decyzja, każdy krzyczy że UX zły. Potem przychodzi faza akceptacji stanu rzeczy. Że tak trzeba postąpić.

Ale.. a może notyfikację dodać, a może popup. A może jakaś animację.

Dwa tygodnie implementuję chceckboxa. Bardzo chciałabym być fullstackiem ale to chyba nie dla mnie

Zobacz pozostały 1 komentarz
Sarrus
Rozumiem, że nie da się tego checkboxa dopisać do backendu?
orchowskia
Część jest starym backendem napisanym że tak powiem tradycyjnie bez api restowego, mamy też mikroserwisy. Zespoły muszą być silne i niezależne, więc jest taka biblioteka open components z której korzystamy to działa tak jakbyśmy importowali kontrolkę na inną stronę, reużywalność etc. Idea ogólnie spoko jak się chce zrobić coś więcej niż checkbox moim zdaniem. Dopisanie checkboxa do backendu nie jest możliwe bo wiązałoby się z synchronicznym callem do innego serwisu, czyli nieładnie. Ewentualnie można zrobić event, ale to trochę overkill jak na checkboxa.
orchowskia
@szok: checkbox jest napisany w react 😁
SZ
o ja... no to nieźle...
several
Dwa tygodnie implementuje checkboxa wszystko się zgadza, tak mniej więcej widzę produktywność w nowoczesnym web stacku
Madaoo
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad rok
  • Postów:490
1

Cześć,

Ostatnio zostałem dodany do kolejnego projektu, więc postanowiłem zobaczyć z czym będę miał do czynienia i znalazłem taki katalog:

Kopiuj
.vscode/extensions.json

Co ciekawe, nie jest to przypadkowe wrzucenie, bo przed tym ta sama osoba usunęła z pliku gitignore, by nie commitować katalogu wraz zawartością vscode :D


"Chodzenie po wodzie i tworzenie oprogramowania wg specyfikacji są łatwe, o ile woda i specyfikacja są zamrożone" - Edward V. Berard
Zobacz pozostały 1 komentarz
Xarviel
Przecież ten plik zawiera jedynie listę pluginów, które można zainstalować, ale nie trzeba jeśli ktoś nie chce.
Madaoo
@Xarviel: lepiej sobie stworzyć własne repo z własnymi konfiguracjami, niż w projekcie do którego ma wiele osób dostęp :)
somekind
A może istnieją jakieś ogólnie przydatne pluginy specyficzne dla danego projektu?
Madaoo
@somekind: z przydatnych to był tam pylint, ale inne były zależne od preferencji użytkownika vsc :p
somekind
Ok, chodzi mi po prostu, że zdarzają się rzadkie technologie, które akurat są używane w projekcie, a które wymagają rzadkich wtyczek. Np. jakieś wbudowane edytory dziwnych typów plików.
wojtekxtx
  • Rejestracja:ponad 2 lata
  • Ostatnio:prawie 2 lata
  • Postów:25
4

Ach te tłumaczenia....... tak btw MS to lubi ;)
Zrzut ekranu 2023-03-16 o 14.24.35.png

Zobacz pozostałe 5 komentarzy
EH
@LukeJL: visual studio domyślnie jest rozprowadzane z kilkoma językami w tym polskim, nikt cię nie zmusza do używania polskiego i nie jest to zależne od języka systemowego. W vcs domyślnie nie ma polskiego ale mechanika jest ta sama. Nikt cie nie zmusza więc nikt się o nic nie prosił.
Manna5
Microsoft tłumaczy wszystko, również komunikaty o błędach w WSH (Windows Script Host, skrypty VBScript) i konsoli IE 8 są po polsku.
somekind
Microsoft jest pojebany. Ale na szczęście IDE póki co jeszcze nie trzeba mieć po polsku.
Sarrus
Ja już się nauczyłem, żeby zmieniać pakiet językowy na angielski przy instalacji.
LukeJL
IDE po polsku by się nawet nie nazywało IDE, tylko ZŚR (Zintegrowane Środowisko Rozwoju)
WeiXiao
  • Rejestracja:około 9 lat
  • Ostatnio:około 7 godzin
  • Postów:5108
3

@jarekr000000: a taką architekturę znasz?

The mystery was solved a few years later when we began the WorldsAway project, still consulting to Fujitsu but in a role that was much more hands-on. Our initial plan had been to work from the Fujitsu Habitat code, back porting the client to Macs and Windows, and cleaning up their server (80 users, yeesh). When we took apart their code, we finally figured out what had been puzzling us all that time: they had lost the architecture. In spite of all the information we gave them, we had completely failed to communicate how things worked. Their guys hadn’t understood the whole client-server concept, which for that day and place was somewhat exotic, so they just implemented what they knew, which was a terminal-mainframe architecture. Their “client” was basically a fancy, highly specialized graphics terminal; all the real work was done on the server. For example, when you issued a command to an object, instead of sending a command message to the object on the server, the client would send the X-Y coordinates of your mouse click. The server would then render its own copy of the scene into an internal buffer to figure out what object you had clicked on. Not only was this extremely inefficient, but the race conditions inherent a multi-user environment meant that it also sometimes just got the wrong answer. It was amazing…

http://habitatchronicles.com/2004/04/you-cant-tell-people-anything/

edytowany 1x, ostatnio: WeiXiao
Zobacz pozostałe 2 komentarze
loza_prowizoryczna
Czyli mówisz że wsparcie protokołu RDP dotarło na polskie uczelnie? Ale ten postęp przyśpiesza.
obscurity
no to było kilkanaście lat do tyłu, a ten klient o którym mowa to w zasadzie RDP wynalezione od nowa
loza_prowizoryczna
Popatrz na to z innej strony - dzięki takiemu podejściu klient mógł być odpalony nawet na ziemniaku. Guglarze od Android Auto też tak to rozwiązali.
obscurity
@loza_prowizoryczna: to akurat bardzo dobrze, nie wyobrażam sobie aktualizować ciągle auta, albo czekać na aktualizację oprogramowania przy co drugim podpięciu telefonu
loza_prowizoryczna
@obscurity: No i bezpieczeństwo - konteneryzacja wirusów, malware, spyware, pornware. Coś jak oglądanie demek z mks_vira.
KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:dzień
  • Lokalizacja:Silesia/Marki
  • Postów:5505
9

U mnie w legacy kodzie klasycznie. Generowanie id bazodanowego po stronie backendu:

Kopiuj
  private def getNextBatchId() = run {
    bcpms_btch_refs.map(_.btch_id).max.result
  }.map(_.getOrElse(0) + 1)

Na szczęście tylko dla logów biznesowych wiec żadne dane klienta się nie tracą.
BTW nawet to działało przez prawie 4 lata bo aplikacja nie była używana z wystarczająco dużym obciążeniem. Ale ostatnio obciążenie wzrosło i getNextBatchId generuje duplikaty

UPDATE
Wersja z typem zwracanym żeby było lepiej widać że ten kod z założenia powinien działać wielowatkowo

Kopiuj
  private def getNextBatchId: Future[Int] = run {
    bcpms_btch_refs.map(_.btch_id).max.result
  }.map(_.getOrElse(0) + 1)

run/result to są metody z Slica biblioteki do pisania typowanego SQLa.
Co do btch_id to bazodanowcny w ramach oszczędzania nazw w bazie nie zapisują prawie samogłosek, a ktoś wymyślił że encje bazodanowe mają być zgodne z tym co w bazie jest :(
Za to prefiks bcpms_ podpada pod smerfny antypattern :D


Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
edytowany 1x, ostatnio: KamilAdam
Zobacz pozostałe 34 komentarze
Miang
@Wibowit: no sekwencja tak, chodzi o to że to baza ma podać albo nadać identyfikator a nie jeden z kilku być może klientów bazy ma kombinować
WeiXiao
@Krolik: Bo skąd niby mam wiedzieć patrząc na ten kod, że ta funkcja może być wywołana przez więcej niż jeden wątek? z kontekstu - backend = webówka = wiele połączeń = itd itd dopóki @KamilAdam nie dodał dodatkowego opisu, to nie, nie było widać że to kod idący do bazy pierwsze zdanie: Generowanie id bazodanowego po stronie backendu:
Wibowit
@WeiXiao: nie tego Królika przywołałeś :p
loza_prowizoryczna
A mówili - nie róbcie UUIDów bo wolne. A tak rzucili by KSUIDem i można by iść na kawę.
KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:dzień
  • Lokalizacja:Silesia/Marki
  • Postów:5505
3

Umie ktoś rysować? czy sklejać memy?
taki mem mi się widzi:

Dzięki statycznemu typowaniu wiesz jaki jest typ zwracany z funkcji.
Typ zwracany z funkcji u mmnie w legacy:
Seq[(Int, Int, Seq[(Int, Int, Option[String])])]

Wyjaśnienie dla nie Scalowców - () to tuple, a [] to generyki. A Seq to sekwencja czyli ogólnie kolekcja


Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
edytowany 1x, ostatnio: KamilAdam
Zobacz pozostałe 23 komentarze
WeiXiao
@KamilAdam: nieportowalne na .NET nie chodził o type erasure / niereifikowalne generyki?
Wibowit
@WeiXiao: popatrz do tego pdfa https://www.scala-lang.org/old/sites/default/files/pdfs/2011-06-03-snet.pdf jest tam slajd, gdzie w scali.net użyto niegenerycznych kolekcji z c#, czyli import system.collections.ilist i tym podobne. wymazywanie typów działało w scali.net, ale oczywiście nie było kompatybilne z reified generics: Currently, the backend erases type params and args (“generics”) as when emitting Java bytecode. > not nice with other languages, we miss on their generic APIs. > we’ll throw a party after closing that bug. pewnie tej imprezy nigdy nie było.
Potat0x
Umie ktoś rysować? czy sklejać memy? https://i.imgur.com/UVqQDSw.png Mam nadzieję, że pomogłem :D
TheWypierdzisty
TheWypierdzisty
Śmieszne, że nie ma żadnej logiki dla której zostały podjęte takie środki w postaci takiej dziwnej plątaniny obiektów.
KamilAdam
@Potat0x: dziękuję. @TheWypierdzisty: Komuś nie chciało się tworzyć DTO dla rezultatów zwracanych ze Slicka, i konwersji żeby można było uzywać case class w Slicku
KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:dzień
  • Lokalizacja:Silesia/Marki
  • Postów:5505
5

Gdy zastanawiasz się co jeszcze można skopać w Scali trafiasz na:

Kopiuj
    for {
      _ <- someFuture.map {
        _.someMethod
      }
      result <- Future {
        someCode
      }
    } yield result 

Kod napisali seniorzy, ale fullstacki :(

Wyjaśnienie dla nie scalowców

ogólnie kod zawiera mnóstwo nadmiarowości

  1. jednoczesny for i map dla tego samego future
  2. utworzenie future dla operacja nie IO żeby zaraz dalej dostać się do wartości

A można by to ogarnąć albo jednym map

Kopiuj
    someFuture.map { someValue =>
      someValue.someMethod
      someCode
    }

albo jednym for

Kopiuj
    for {
      someValue <- someFuture
    } yield {
      someValue.someMethod
      someCode
    }

UPDATE jeśli kiedyś zobaczą to prawilni programiści Scali to: tak, wiem, nie powinno się używac future tylko IO, ale future to naprawde najmniejszy problem tego kodu :(


Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
edytowany 2x, ostatnio: KamilAdam
Zobacz pozostały 1 komentarz
Miang
ale mi to przypomina to nad czym sie kiedyś wytrząsała, rzucenie wyjątki i natychmiastowe zlapanie
Qbelek
Czemu zamiast future powinno być io skoro napisałeś, że metoda opakowana w future nie wykonuje żadnego io?
Miang
że future ma sens tylko dla IO ?
LukeJL
Nie wiem, jak się to ma do scali (i szczerze mówiąc nie rozumiem kodu z posta), ale ogólnie future/promise to abstrakcja dla przyszłej wartości, więc nie musi to być związane z IO. Po prostu zwykle apki czekają na input i są tym inputem sterowane, ale już np. w jakiejś grze z dużą ilością symulacji (np. budowanie miasta, walka z CPU) dużo się dzieje bez jakiejkolwiek akcji użytkownika, więc tu też jest pole do użycia promisów, coś jak await EnemyClose. Chociaż wtedy można by się zastanowić, czy nie jest tak, że zdarzenia w grze są w pewnym sensie wirtualnym inputem.
chalwa
  • Rejestracja:około 7 lat
  • Ostatnio:około rok
  • Postów:109
0

.NET Framework 4.7.2

Kopiuj
IEnumerable<string> parameters = new List<string>(new[]{"1234"});
var text = string.Format("some message{0}<", parameters);

Jaką wartość przyjmie text po wykonaniu metody Format? Czy będzie to "some message1234<" tak jak założył autor? :D
Otóż odopowiedź to:

Kopiuj
"some messageSystem.Collections.Generic.List`1[System.String]<"

Dlaczego tak jest? Zajrzyjmy do dokumentacji M$:

Kopiuj
public static string Format(string format, object arg0)

This method uses the composite formatting feature to convert the value of an expression to its string representation and to embed that representation in a string. In performing the conversion, the method uses culture-sensitive formatting or a custom formatter. The method converts arg0 to its string representation by calling its ToString(IFormatProvider) method or, if the object's corresponding format item includes a format string, by calling its ToString(String,IFormatProvider) method. If these methods don't exist, it calls the object's parameterless ToString method.

Nawet komentarz wskazuje co ta metoda robi : "Replaces one or more format items in a string with the string representation of a specified object."

No cóż, kolejny bug do backlogu.

edytowany 1x, ostatnio: chalwa
Zobacz pozostałe 13 komentarzy
Sarrus
To jest błąd, który każdemu chyba czasem się zdarza. Tylko tego typu błędy wyłapuje się w pierwszych testach. A przynajmniej powinno.
chalwa
Dobra, po 3 godzinach dodawania zależności się poddałem, a przeoranie interfejsów w tym projekcie to pewnie będzie miesiąc roboty i regresja. Gdzie ja trafiłem?
opiszon
Przynajmniej płacą dobrze?
chalwa
Heh, to chyba ta mityczna praca z pasji.
somekind
A wystarczyło nie robić żadnych List ani IEnumerable, a po prostu przekazać tablicę.
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 7 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10056
3

Jak ktoś mi powie że "front jest tak samo poważną technologią jak inne" to go wyśmieję.

Dostaję taki stack trace, i bądź tu mądry żeby wykminić gdzie jest błąd. Oczywiście żaden z plików wymienionych w stacktrace'ie nie jest zmieniony.

Na pewno to jest jakiś błachy błąd, przez nie uwagę; ale to że stack trace nie pokazuje dokładnego miejsca gdzie jest ten błąd moim zdaniem to kpina.

screenshot-20230609185907.png

Zobacz pozostałe 8 komentarzy
WeiXiao
@Riddle: porównywanie frontu do C++ jest niepoważne w obu przypadkach chodzi o przemielenie literek, ale może ja mam po prostu wyższe standardy i oczekiwania
WeiXiao
które spełniają się w pewnych sytuacjach (zwłaszcza jeśli chodzi o performance) i dbają też o backwards compatibility, i muszą ogarniać też kompilację na wielu systemach. tak, i to backwards compatibility sprawia że nie mogą mieć lepszych komunikatów błędów, no bankowo. zwłaszcza jeśli chodzi o performance ty chyba nie piszesz performance kompilatorów, prawda?
Xarviel
Przecież w tym wypadku to przeglądarka odpowiada za stacktrace, wiec czepiajcie się przeglądarki.
dzek69
Niemożliwe, minifikowany kod jest nieczytelny do debugowania, któż by pomyślał ;) Jak mi się java wyrzyga to też nic czytelnego w tym nie znajduję. Anyway, nawet jak stack trace jest spieprzony to tutaj to jest proste do znalezienia i bez tego, raczej za często <pre> się nie renderuje, więc prościej w całej aplikacji znaleźć <pre. A jak nie to inaczej - Typography, który renderuje w środku listę <ul> w dodatku w formie siedzi, co też może zawężać poszukiwania. Jak znasz projekt to z palcem w nosie znajdziesz w minutę.
CZ
Może jest taki stack trace po prostu i błąd jest na samym dole :P
KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:dzień
  • Lokalizacja:Silesia/Marki
  • Postów:5505
6

Kategoria mokowanie danych na Frontendzie:
Ostatnio prawie zamockowaną wersję wydaliśmy na produkcję. Frontend zamopował prawdziwymi danymi. Potem te dane zostały dodane do bazy danych, ale frontend ich nie czytał, ale wszystko było w porządku bo to te same dane. A potem lekko się zmieniły w bazie i było zdziwienie czemu czasem działa a czasem nie XD


Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
loza_prowizoryczna
Ale za to jaka wydajność!
KamilAdam
Wydajnośc niesamowita, myślę że więcej rzeczy powinniśmy przenieść tak na front. Nocny import danych mógłby podmieniać pliki na froncie, puszczać pipeline frontendowy i podmieniać produkcję
loza_prowizoryczna
Ale po co podmieniać, stawiasz dwa kontenery i nimi żonglujesz. Jak wydajność nie daje rady to 80% idzie przez kontener mockowy, jak narzekają na spójność to przez standardowy. I tak przez dwa/trzy lata.
rafal95p
  • Rejestracja:około 2 lata
  • Ostatnio:ponad rok
  • Postów:157
1

Kolega poprosił mnie o napisanie skryptu wykonującego poniższe:

  • parsowanie danych z wystawionego JSONa (3 typy informacji)
  • wyświetlenie tego na UI jako podgląd (kod HTML)

Więc zrobiłem:

  • do każdego typu informacji po 3 funkcje (parsowanie, generowanie UI, robienie czegoś jeszcze)
  • na wypadek problemów z pobraniem danych (fetch -> JSON pod URLem) wydzieliłem mu funkcję, którą sam miał sobie uzupełnić (dodać jakiś komunikat dla usera, że URL nie działa, zadzwoń do admina czy coś)

Generalnie wyszło fajnie, funkcje są niezależne i można je rozbudowywać bez ryzyka, że całość się posypie. Więc później patrzę jak to wdrożył u siebie:

  • dodał w kilku miejscach pętle for
  • zrobił dużą funkcję, która zawierała ciała 3 mniejszych funkcji, całość pod switch/case (czyli pod każdym case siedzi około 10 linijek kodu)
  • usunął kod obsługi błędu, czyi brak funkcji displayError()
  • ta duża funkcja liczy ponad 60 linijek z czego połowa łamie zasadę DRY (aż się prosi by wydzielić)
  • część mojego kodu zakomentował
edytowany 1x, ostatnio: rafal95p
rafal95p
Chociaż tyle, że napisał for (let index=0...) zamiast for (let i=0...)
Koziołek
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Stacktrace
  • Postów:6821
4

W dużym skrócie firma klienta zajmowała się web scapingiem różnych stron z artykułami naukowymi, prawnymi itp. Idea była taka, że użytkownik loguje się na platformie i potem podaje dane dostępowe do serwisu X, my pod spodem wykorzystujemy jego login i hasło, żeby dobrać się do danych w serwisie X, a następnie całość ładnie prezentujemy w naszym serwisie. Głupie? Nie do końca, bo to jest integracja kilku źródeł danych i np. prawnicy potrzebują mieć dostęp zarówno do przepisów, jak i np. prasy branżowej bez konieczności przeskakiwania pomiędzy stronami. Bardziej ogólnym problemem jest brak API w różnych portalach. Pomyślcie o tym, jak o czymś w rodzaju wielkiej czytelni, gdzie macie dostęp i do kodeksów i do gazet i do opracowań.

WTF 1 - nie używamy API

Na moje pytanie, dlaczego nie używać API w serwisach, w których takowe jest, odpowiedź brzmiała – bo nie. Trzeba by było płacić i biznes się nie spina.

WTF 2 - loginy i hasła użytkowników

Trzymane plain textem, bo potem jakoś to selenium musi wstawić do formularza. Kto by tam się przejmował drobnostkami typu szyfrowanie. Na moją sugestię, by to przynajmniej szyfrować, padła odpowiedź „jesteśmy w chmurze i nikt tego nie ukradnie”.

WTF 3 - dostawcy

Każdy portal, do którego się logowaliśmy miał inaczej rozwiązane logowanie i pod spodem działał w inny sposób. Były apki w Reactie, były w Angularze, było też renderowanie HTMLa co każde żądanie. I tu właśnie historia @rafal95p przypomniała mi trzeci wtf, tego projektu. Każdy portal był obsługiwany osobną metodą. Taką jebitnie wielką metodą, która ogarniała logowanie i różne „ciekawe zachowania” tego konkretnego źródła danych. Metodę wybierał jebitny IF, który starał się dopasować odpowiednią metodę na podstawie URLa, który wywoływaliśmy.
Zasugerowałem, żeby to podzielić na moduły i każdy osobno wdrażać, testować itp. Stwierdzono, że nie, bo obecnie jest OK i łatwo to wszystko utrzymać. 6 tygodniu później wyleciałem z projektu. Po kolejnych dwóch tygodniach okazało się, że „łatwość utrzymania” powoduje, że nie da się dodać nowego źródła, bo jest za dużo konfliktów w kodzie i nikt nie wie, jak to ogarnąć. Trzeba było pociąć na moduły…

WTF 4 - scraping

Odbywał się z użyciem Selenium i WebDriverów, co bardzo obciążało maszyny. Zasugerowałem użycie HTTPClient przynajmniej tam, gdzie nie ma SPA pod spodem. O dziwo przeszło i było jedno wielkie wow, że można ograniczyć liczbę używanych maszyn o połowę. Potem jednak ktoś odkręcił cały temat, bo „nie możemy przepchnąć wszystkich ciasteczek”. Czytaj, trzeba napisać mapper, który zamieni ciasteczka selenium, na ciasteczka HTTPClient.


Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException
Zobacz pozostałe 2 komentarze
Koziołek
@WeiXiao: ponieważ API jest stabilniejsze niż HTML i w dodatku nie musisz się martwić o to, że scrapowany zacznie używać narzędzi do blokowania tego typu działań.
WeiXiao
@Koziołek: ale jakby... co to ma do rzeczy w sytuacji gdy nie stać cię na korzystanie z tego API?? to samo pytanie do @ledi12
ledi12
Dlatego napisałem, że w takim przypadku można ręcznie spróbować wyciągać endpointy o ile scrapowana aplikacja wszystkiego nie ukrywa. Jeśli to nie zadziała no to zostaje selenium. Wszystko zależy od kontekstu :P Generalnie chciałem wcześniej podkreślić, że w przypadku wyboru api vs selenium, api zawsze jest lepszym wyborem.
Koziołek
@WeiXiao: koszty API są niższe niż koszty selenium. O jakieś 2-3 rzędy wielkości. Przy selenium na jednej maszynie na AWS nie odpalisz więcej niż 8-10 sesji. Przy API możesz utrzymywać setki sesji. Tam było wszystko robione tak, żeby źródłowe portale broń boże nic nie wiedziały.
WeiXiao
@Koziołek: no to z tym szczegółem to co innego ;)
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 7 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10056
2

To chyba bug w Riderze. Fajniej się go używa jak się przywykło do IDE od JetBrains, ale nadal jest mega zbugowany.

screenshot-20230718181954.png

edytowany 1x, ostatnio: Riddle
LukeJL
a może błąd był gdzieś w kodzie, który miał sprzątać po testach? Że testy przeszły, a potem dopiero wszedł błąd?
Riddle
@LukeJL: Po restarcie już działa normalnie.
Haskell
  • Rejestracja:ponad 9 lat
  • Ostatnio:11 miesięcy
  • Postów:4700
10

Pewnie zastanawialiście się jak rozwiązano system losowego przydziału spraw sędziom, który ma zapewniać bezstronność wydziału sprawiedliwości? Ten dokument wiele wyjaśnia i mam nadzieję będzie dla Was przykładem jak wdrożyć wymagania biznesowe w praktyce.

image


Zaglądali do kufrów, zaglądali do waliz, nie zajrzeli do d**y - tam miałem socjalizm. Czesław Miłosz
Wibowit
poprawcie mnie jeśli coś nie zrozumiałem, ale (liczba_dodatnia mod 3) + 1 to zawsze liczba między 1, a 3, więc kandydat na pozycji 5 nie mógł być wybrany (inaczej mówiąc: szansa na wybranie kandydata numer 5 wynosi dokładnie 0). skąd się to mod 3 wzięło?
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 7 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10056
0

W c# Exception nie ma konstruktora (Exception)? ;| Jest tylko (string message,Exception)? O co kaman.

edytowany 1x, ostatnio: Riddle
Zobacz pozostałe 9 komentarzy
Riddle
Jest konstruktor Exception(), w którym można nie podać message'a. Jeśli przyjmiemy Twój argument , to konstruktora () też nie powinno być.
Riddle
Nie sądzę że jest jakiś sensowny powód czemu nie ma tego konstruktora, oprócz tego że po prostu go nie dodali.
WeiXiao
catch (Exception e) { throw new DomainException(e); } mapowanie każdego wyjątku na wyjątek domenowy?
Riddle
Jezu, to catch (SocketException e) { throw new DomainException(e); }
WeiXiao
Jeżeli chodzi o customowe wyjątki, to jak najbardziej możesz tak zrobic, bo to ty definiujesz ich konstruktory. Co do standardowych, to ciekawe czemu nie zdecydowali się dodać takiego - czy faktycznie nikt nigdy nie zgłosił się z taką potrzebą, bo przecież to łatwo obejść, a mapowanie wyjątków to dość rzadka praktyka bez dodawania kontekstu? idk Możesz otworzyć issue i ci odpowiedzą ;) https://github.com/dotnet/runtime
B1
  • Rejestracja:ponad 5 lat
  • Ostatnio:około 3 godziny
  • Postów:376
6

Strona Capgemini, tu się BE z FE w ramach kontraktu założyli kto bardziej uprzykrzy życie kandydatowi. Nie dość że trzeba wybrać 10 opcji żeby pokazały się oferty dla Krakowa, to trzeba scrollować w bok a po każdym kliknięciu wybierajka się chowa zamiast umożliwić jakiś multiselect xD

screenshot-20230727103750.pngscreenshot-20230727104114.png

KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:dzień
  • Lokalizacja:Silesia/Marki
  • Postów:5505
4
Kopiuj
    case 
      when lvl=8 then lvl_8
      when lvl=7 then lvl_7
      when lvl=6 then lvl_6
      when lvl=5 then lvl_5
      when lvl=4 then lvl_4
      when lvl=3 then lvl_3
      when lvl=2 then lvl_2
      when lvl=1 then lvl_1
    end 

A wy jaką dziś zbrodnię w legacy popełniliście?


Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
edytowany 1x, ostatnio: KamilAdam
ccwrc
Gdzie zbrodnia? Przypuszczam, że dla 8 leveli w np. SQL sam bym taką popełnił.
KamilAdam
Przy ilu levelach należy przestać?
ccwrc
Tego nie wiem. To zależy od wymagań, warunków początkowych, estymacji na przyszłość i ograniczeń języka. Tego mi brakuje w twoim poście.
somekind
To ktoś jeszcze w SQL na poważnie pisze?
ccwrc
Nie wiem. Mi przyszedł na myśl także scenariusz: gra, 8 leveli, pamięć ograniczona do 48kB - wtedy wiele konstrukcji nieeleganckich jest wręcz wymaganych wliczając w to sławne GOTO. Kwestia wieku ;)
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 4 godziny
  • Lokalizacja:Wrocław
6

screenshot-20230728011619.png

Zobacz pozostałe 6 komentarzy
somekind
To strona rezerwacji biletów WizzAir, dane te wprowadza się po wybraniu trasy, daty i zalogowaniu się na konto, więc nie mam jak dać linka.
cerrato
Ok, Wizzair jest wystarczającym wyjaśnieniem ;)
G8
W Stanach i UK i pewnie we wszystkich krajach anglojęzycznych zip code i adres nie zawierają takich znaków, nie ma takiego zapisu. Pewnie nikt nie dostosował walidatora formularzy do warunków polskich
Miang
jeszcze lepiej jak walidator jest zrobiony na pole nazwisko bez skonsultowania się chociażby z listą nazwisk danej firmy ;) i zdziwienie że nazwisko to może być więcej niż jedno słowo
somekind
W Stanach i UK i pewnie we wszystkich krajach anglojęzycznych zip code i adres nie zawierają takich znaków - śmiechłem. https://www.mjt.me.uk/posts/falsehoods-programmers-believe-about-addresses/
G8
  • Rejestracja:około 3 lata
  • Ostatnio:około rok
  • Postów:2000
2

W Wirtualnej Polsce pracują bardzo dobrzy programiści. Uparli się, żeby utrudnić ludziom korzystanie z AdBlocka. To, co chcieli (chyba) osiągnąć:

  • gdy Adblock jest włączony: komunikat że trzeba wyłączyć i blokada strony
  • gdy Adblock jest wyłączony, pokazanie strony + reklam

Niestety chyba coś nie pykło bo w praktyce jest tak:

  • gdy Adblock jest wyłączony - komunikat o konieczności wyłączenia AdBlocka i blokada strony
  • gdy Adblock jest włączony - czysta strona bez reklam

Mi to pasuje, ale dobrych tam mają speców.

edytowany 1x, ostatnio: gajusz800
opiszon
U mnie są reklamy bez Adblocka, żadnych komunikatów, strona działa. Może kwestia ciastek i ciebie?
G8
W trybie incognito tak samo. Może kwestia dodanych filtrów
B1
ja mam uBlocka zawsze i WP działa u mnie tak że w 80% przypadków działa normalnie bez reklam, a w 20% mam ten komunikat, ale po odświeżeniu już działa normalnie bez reklam.
G8
Bo musisz jeszcze dodać skrypt blokujący wykrywacza AdBlocka
KamilAdam
  • Rejestracja:ponad 6 lat
  • Ostatnio:dzień
  • Lokalizacja:Silesia/Marki
  • Postów:5505
1

Myślicie że to na powaznie czy jakiś dziwny żart?

July 17, 2023

Dear FizzBuzzEnterpriseEdition Repository Maintainer,

Subject: Cease and Desist – Copyright Infringement

I write to you on behalf of Oracle Corporation ("Oracle"), an American multinational computer technology corporation headquartered in Redwood Shores, California.

It has recently come to our attention that the code in your repository, FizzBuzzEnterpriseEdition, on the platform GitHub, contains code which infringes upon the proprietary software of Oracle Corporation. Our concern revolves around specific sections of the repository which use Oracle's copyrighted code without permission.

The unauthorized and improper use of our copyrighted software not only infringes our rights under the United States Copyright Act (17 U.S.C. § 101 et seq.) but also violates the terms of the GNU General Public License under which Oracle's code is licensed. Such unauthorized use can expose users, developers, as well as owners to serious legal risks including but not limited to both civil and criminal penalties.

Oracle respects and encourages the collaborative nature of open-source projects, but it is critical that the rights associated with our intellectual property are maintained and enforced.

Thus, we formally demand that you immediately cease and desist all use of Oracle's copyrighted code within the FizzBuzzEnterpriseEdition repository, and certify in writing that such use has ended. We further demand that all instances of Oracle's copyrighted code be removed from the repository, from your systems and from any other places where it might reside.

We expect you to respect our rights in this matter and take prompt action to rectify this situation. Failure to comply with this cease and desist order could result in legal proceedings. Oracle reserves all rights and remedies available to it, including seeking monetary damages, injunctive relief, and an order that you pay court costs and attorney’s fees.

This letter does not constitute an exhaustive statement of Oracle’s rights, remedies, claims or defenses, all of which are expressly reserved.

We hope it will not be necessary to resort to legal action and that you will immediately cease the use of Oracle’s copyrighted materials.

Please provide written confirmation of your compliance with this cease and desist order within 10 business days from the receipt of this letter.

Yours sincerely,

Maximillian Coderight
Senior Vice President of Litigation
Oracle Corporation

cc: Legal Department
Oracle Corporation

https://github.com/EnterpriseQualityCoding/FizzBuzzEnterpriseEdition/issues/652


Mama called me disappointment, Papa called me fat
Każdego eksperta można zastąpić backendowcem który ma się douczyć po godzinach. Tak zostałem ekspertem AI, Neo4j i Nest.js . Przez mianowanie
edytowany 1x, ostatnio: KamilAdam
PR
Jeśli nawet, to świetny ruch marketingowy!
somekind
Wreszcie ktoś o nich usłyszy.
stivens
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 5 godzin
3

λλλ
edytowany 1x, ostatnio: stivens
somekind
Zrozumiałem tylko Oracle, więc zaplusowałem.
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 7 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10056
2

Typy "nullable" w c# są bardzo dziwne, np w funkcji

Kopiuj
void Function(string? value) {}

value może być nullem, albo stringiem.

Ale jak widzę, nawet jak nie ma string?:

Kopiuj
void Function(string value) {}

To nadal funkcja może być string, albo może być null :|

Różnica jest taka że jeśli mamy typ deklarację argumentu string?, to musimy się do niego odnieść value?. albo value!., no bardzo fajnie. Ale czemu deklaracja (string value) też może dostać null? :| Mega słaby design.

edytowany 3x, ostatnio: Riddle
Zobacz pozostałe 25 komentarzy
G8
@somekind: to jeszcze chyba gorszy syf niż automatyczny migrator kodu na null safety albo mieszanie jednego z drugim. I czemu nie da się ich pozbyć? Wchodzi nowa wersja języka z obowiązkowym sound null safety. Stare projekty albo migrować albo używać tam starszej wersji
somekind
I nikt by tej nowej wersji nie używał, bo nie byłoby ani bibliotek, ani firmy nie miałyby kasy na migrację swojego kodu do nowych zasad. Za to to, co jest teraz, gdzie nullowalność jest tylko podpowiedzią, jest rozsądnym etapem przejściowym.
G8
Gdyby było tak jak piszesz, to wszyscy by zostali przy .net 4.5 bo tu nawet nie było migracji starych projektów, a trzeba było pisać wszystko od nowa. Migracja na null safety może być nawet za pomocą odpowiedniego toola bo 95% kodu może być zmigrowane automatycznie, tak jak to zrobił Google w swoim Dart
somekind
trzeba było pisać wszystko od nowa - bynajmniej. Migracja na null safety może być nawet za pomocą odpowiedniego toola - być może, tylko najpierw trzeba mieć język, który nie pozwala na nulle.
obscurity
  • Rejestracja:około 6 lat
  • Ostatnio:około 8 godzin
1
Riddle napisał(a):

Różnica jest taka że jeśli mamy typ string?, to musimy się do niego odnieść value?. albo value!., no bardzo fajnie. Ale czemu deklaracja (string value) też może dostać null? :| Mega słaby design.

Nie może, musisz we właściwościach projektu ustawić

Kopiuj
<Nullable>enable</Nullable>

wszystkie nowe projekty mają to ustawione domyślnie, w starych projektach musisz samemu przestawić. Wyłączone ustawienie zostało dla kompatybilności wstecznej.
No i jest to tylko warning, dlatego żeby nadal można było używać starych bibliotek które nie mają określonego nullability. We własnym projekcie możesz / powinieneś ustawić WarningsAsErrors żeby przestało się kompilować:

Kopiuj
<WarningsAsErrors>Nullable</WarningsAsErrors>

a dobrą praktyką jest traktowanie wszystkich warningów jako errorów, zazwyczaj warningi są ważniejsze niż się wydaje i powodują wiele runtime errorów


"A car won't take your job, another horse driving a car will." - Horse influencer, 1910
edytowany 2x, ostatnio: obscurity
Riddle
Administrator
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 7 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10056
0
obscurity napisał(a):
Riddle napisał(a):

Różnica jest taka że jeśli mamy typ string?, to musimy się do niego odnieść value?. albo value!., no bardzo fajnie. Ale czemu deklaracja (string value) też może dostać null? :| Mega słaby design.

Nie może, musisz we właściwościach projektu ustawić

Kopiuj
<Nullable>enable</Nullable>

wszystkie nowe projekty mają to ustawione domyślnie, w starych projektach musisz samemu przestawić. Wyłączone ustawienie zostało dla kompatybilności wstecznej.
No i jest to tylko warning, dlatego żeby nadal można było używać starych bibliotek które nie mają określonego nullability. We własnym projekcie możesz / powinieneś ustawić WarningsAsErrors żeby przestało się kompilować:

Kopiuj
<WarningsAsErrors>CS8600;CS8602;CS8603;CS8625</WarningsAsErrors>

a dobrą praktyką jest traktowanie wszystkich warningów jako errorów, zazwyczaj warningi są ważniejsze niż się wydaje i powodują wiele runtime errorów

No, jak mówiłem są arugmenty ku temu. Ale to, że masz syngatury (string? value) oraz (string value) , i one obie mogą dostać nulla, pod względem design'u języka, to jest po prostu mega bieda.

Moim zdaniem, powinno być tak, że jeśli włączasz <Nullable> to deklaracja (string value) przestaje akceptować null, i powoduje to błąd kompilacji. To byłby dobry design. Zepsułoby to backwards-compatibility, co wyjaśnia czemu zdecydowano się na gorszy design - czyli że (string value) nadal akceptuje null (tylko że pokazuje warning).

edytowany 1x, ostatnio: Riddle
Zobacz pozostałe 5 komentarzy
Riddle
@obscurity: A jak zrobię record Value (string value);, zdeserializuje jsona do niego (który nie ma pola, i domyślny Json serializer wrzuci tam null), i potem przekażę tego null z Value.value do funkcji która przyjmuje (string value), to niby też się nie skompiluje? Myślę że się skompiluje normalnie i zadziała.
obscurity
@Riddle: powinieneś dostać błąd deserializacji jeśli nie zdefiniowałeś wartości domyślnej, ale to zależy od serializera i jego ustawień. W sumie nie sprawdzałem. Tak jak mówię - te znaki zapytania i wykrzykniki to tylko adnotacje i hinty dla kompilatora, nie mają zazwyczaj znaczenia w runtime, trochę jak w typescript niestety
SA
znak zapytania w string? to tylko adnotacja do typu, nie prawdziwy typ co jest meh, można było dodać po ludzku jakiś typ dla Optionala i ludzie by się w końcu przyzwyczaili, serializery by obsługiwały etc. ale zamiast tego wyszedł jakiś ulep i nic dziwnego, że ludzie mają mindfucka.
obscurity
@Saalin: dla value type'ów masz Nullable<>, dla reference type'ów nie dało się tego wprowadzić bez zrywania kompatybilności wstecznej. Kompilator mógłby robić niejawną konwersję w wielu miejscach ale c# jest używany też w interop i skompilowany kod musi dobrze gadać z natywnymi libkami
somekind
Tego po prostu nie da się ogarnąć bez zrobienia nowego języka.
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)