Programistyczne WTF jakie Was spotkały

Programistyczne WTF jakie Was spotkały
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:2 minuty
0

Fail z karta miejską jaki ja doświadczyłem w Krakowie.

  1. Płacąc kartą musisz wpisać PIN DWA RAZY!
  2. Jeśli pomylisz się przy wprowadzaniu PIN-u to automat staje się bezużyteczny. Obsługa kart jest realizowana przez osobny moduł (w tej samej obudowie), który ma blokadę na wprowadzanie karty do szczeliny. Na czas kiedy masz się komunikować z tym modułem, główny ekran pokazuje jakąś wiadomość blokującą, jednak gdy, pomylisz się podczas wprowadzania pinu (masz zrobić to dwa razy), to kartę wyciągniesz, ale już jej nie włożysz, a ekran blokady nie zniknie (nadal czeka na realizację płatności) i nie da się nic zrobić (czekałem z 5 minut, ale nic się nie zmieniło).

Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około godziny
2

WTF elektroniczne: lampka LED-owa na 230V za 3 złote.
Lampka po podłączeniu okazała się że mruga, w rytm 50-hercowego prądu zmiennego. Myślę sobie, coś schrzanili z prostownikiem.
Rozkręcam, oglądam, i...
... cała lampka jest po prostu mostkiem Graetza zbudowanym na czterech diodach świecących.

Zobacz pozostałe 12 komentarzy
wesoledi
Działa? Działa :D "Genialne" po prostu :D Przynajmniej masz tanią obudowę. Dowal kondensator, może migotanie zniknie :D
Marooned
A w którym miejscu chcesz ten kondensator? :>
wesoledi
A to już by trzeba było spytać konstruktora tego 'wynalazku' gdzie by najlepiej było go umieścić :P
Koziołek
@Marooned no i... naładowanie będzie co prawda trwało trochę czasu, a i pewno pole grawitacyjne w okolicy się delikatnie zmieni... ale who cares...
Johnny_Bit
  • Rejestracja:około 22 lata
  • Ostatnio:ponad 8 lat
  • Lokalizacja:Kielce
0

Takie małe WTF optymalizacji zużycia pamięci...

Siedzę sobie i obrabiam / czyszczę skany rysunków w Gimpie. Skany przy 600 DPI karki A4 - ok 5000x7000px, wszystkie w trybie RGB i takich mam jednocześnie otwartych z 10.
Do tego myzyczka leci w tle z audaciousa - podobne to do winampa
A pomaga mi w pracy firefox - ot 2 zakładki z Profilami kolorów, nic nadzwyczajnego.

Komp zaczyna zamulać - "Oho, pewnie za dużo pootwieranych rysunków. Ale sprawdzę"...
Zużycie pamięci wg htop:
firefox-bin: 65%
audacious: 15%
gimp-2.8: 19%

Moja reakcja: Jakim cudem program graficzny z cięzkimi rysunkami zajmuje mi w pamięci 20% a zwykły odtwarzacz mp3 niewiele mniej? Do tego firefox 19 to super krowa... tylko czemu...


HAKGER - 50% Complete
DS
Mi foobar (nie mogę znaleźć sensownej alternatywy dla niego pod linuxem) czasami zajmuje ~4GB, gdy jest uruchomiony kilkadziesiąt godzin w jednej instancji.
MO
to na pewno przez to że javowy-gc ssie :D
DS
@madmike: thx, tego nie testowałem, generalnie problem polega nie tyle na dostosowaniu funkcji (tych nie używam wiele, ot, trochę skrótów klawiaturowych i tagowanie + wsparcie dla last.fm, chociaż z tym teraz nie ma problemu już raczej) a na prędkości działania, foobar nawet via wine z playlistą na 20k+ pozycji działa płynnie, wyszukiwanie na liście jest natychmiastowe (o ile jest w .fpl), przestestuję i sprawdzę, dzięki.
mcoder
  • Rejestracja:około 12 lat
  • Ostatnio:prawie 5 lat
  • Postów:117
0

C++/WinAPI

Pod jednym przyciskiem zapisuje napisy do dwuwymiarowej tablicy znaków (szNames[64][128] - max. 64 napisy, każdy po max. 128 znaków), a w drugim przycisku odczytuje i dostaje krzaki. Po ponad godzinie zrobiłem szNames zmienną globalną (wcześniej była lokalną w procedurze obsługi okna) i działa.


<sup>_</sup>
ShookTea
Poprawcie mnie, jeśli się mylę, ale skoro zmienną lokalną z jednej procedury wykorzystujemy w innej procedurze, to jest to po prostu głupi błąd programisty, a nie żaden WTF (no, chyba że dla ewentualnego czytającego kod).
Patryk27
To nie jest WTF - po prostu zmienne lokalne inicjowane automatycznie przez kompilator są usuwane pod koniec funkcji :P
Sarrus
Proponuję utworzyć nowy wątek pt. Mój największy fail i przenieść kilka postów z tego wątku
mcoder
Zapis do zmiennej i odczyt z niej jest w jednej i tej samej procedurze obsługi okna. It's strange for me why my variable gets corrupted.
somekind
@Sarrus, popieram. Pierwszym opisanym failem będzie brak możliwości przenoszenia postów w Coyote.
mcoder
Robiłem kiedyś Popup menu w C++/WinAPI i utworzyłem je sobie na początku procedury, a potem używałem uchwytu, który się po prostu zepsuł. Gdy tworzyłem menu zaraz przed wyświetleniem, a potem usuwałem działało super. Chyba sobie zacznę zapisywać takie rzeczy, żeby potem nie siedzieć ponad godzinę nad jednym głupim błędem.
Sarrus
Załóż temat - pokaż kod. Zaiste ciekawe jest to co piszesz.
Azarien
każdy komunikat to osobne wywołanie procedury okna. zmienna lokalna która nie jest static nie jest zachowywana pomiędzy wywołaniami funkcji.
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
0

Takie dwa WTF-y, które mi się przypomniały:

  1. spokojnie poprawiam sobie mój kompilator - wszystko działa, generuje poprawny plik wyjściowy - jest perfekt.
    Kompiluję go korzystając z drugiego stopnia optymalizacji (wcześniej było domyślne -O1; kompilowałem korzystając z FPC 2.6.0 na Win32) - i nagle zonk: crash w którejś części mojego parsera.
    Szybki check wszystkiego co mogłoby spowodować taki błąd - kod wygląda dobrze, nie powinno być żadnych null-pointerów itp.
    Wyłączam optymalizacje całkowicie, i znowu crash - tym razem w innej części.
    Zrobiłem wielkie WTF, po czym włączyłem znowu pierwszy stopień optymalizacji - zaczęło działać.
    Czyli:
    brak optymalizacji = nie działa
    -O1 = działa
    -O2 (oraz wyższe) = nie działa
    Był wieczór, więc wyłączyłem Lazarusa i darowałem sobie dokładne szukanie błędu; ostatecznie gdzieś pomiędzy kolejnymi commitami musiałem go poprawić, bo jak sobie o tym WTF-ie przypomniałem parę dni późnej, wszystko było ok.
    Wciąż jednak nie wiem, co naprawiłem, bądź co we FPC zostało zepsute ;P

  2. jeżeli zmienna jest alokowana w rejestrze, na początku funkcji wartość tego rejestru jest wrzucana na stos, a pod koniec zdejmowana.
    Czyli jeżeli jeżeli mamy np.dwie zmienne zachowane w rejestrach eb3 oraz es3, funkcja wygląda w uproszczeniu tak:

Kopiuj
add(stp,1)
push(es3)
push(eb3)
// skompilowane ciało funkcji
pop(eb3)
pop(es3)
sub(stp,1)

Jednak wprowadzając szybkie poprawki (korzystając z dobrodziejstw pętli for..in oraz Ctrl+C Ctrl+V), omyłkowo wkleiłem taki kod pod koniec generatora:

Kopiuj
For Symbol in SymbolList Do // each symbol
 if (Symbol.Typ = lsVariable) Then // if variable
  With Symbol.mVariable do
   if (MemPos > 0) Then // if allocated in register
    PutOpcode(o_pop, ['e'+Typ.RegPrefix+IntToStr(MemPos)]);

Przez co skompilowana funkcja wyglądała tak:

Kopiuj
push(es3) // wrzucenie na stos `stringa`
push(eb3) // wrzucenie na stos wartości `boolean`
// ciało funkcji
pop(es3) // pobranie ze stosu wartości `string` do rejestru
pop(eb3) // pobranie ze stosu wartości `boolean` do rejestru

Jak widać, do rejestru es3 typu string pobierana zostawała wartość boolean, co skutkowało błędem maszyny wirtualnej.
Odnalezienie tego zajęło mi dwa dni, i od tego czasu już nie kopiuję bezpośrednio nawet małych kawałków kodu :P


edytowany 2x, ostatnio: Patryk27
msm
W takim razie od FPC do GCC jest bliżej niż myślałem.
Patryk27
GCC również stara się naprawić kod za programistę po włączeniu optymalizacji? :D
msm
W GCC również mi się zdarzyło że kod działał po włączeniu optymalizacji, a bez optymalizacji nie ;].
Olamagato
Do p.2: Twoje copy-paste kosztowało 2 dniówki, copy-paste programisty pracującego dla Ariane kosztowało kiedyś cztery satelity Cluster i nowiutką rakietę Ariane-5. :)
Azarien
problem z Ariane był skomplikowany, ale można go streścić jednym słowem: kasa.
siararadek
  • Rejestracja:ponad 17 lat
  • Ostatnio:prawie 9 lat
0

Znalazłem dzisiaj w kodzie metodę z 21 parametrami wejściowymi.

Kopiuj
        public virtual ActionResult StoreProductBrowse(int? categoryId,
                                               string searchPhrase, string searchByName, string searchByDesc,
                                               string searchByMan, string uniqueUrl, int? searchByPriceFrom,
                                               int? searchByPriceTo, bool? isOtherBranch,
                                               bool advancedSearch = false, bool searchDesc = false,
                                               bool searchByNameSel = false, bool searchByDescSel = false,
                                               bool searchByManSel = false, bool searchByPriceSel = false,
                                               WebSiteDto webSite = null, int page = 1, int numberToShow = 10,
                                               int? skipToPage = null, byte presentationType = 0, int webSiteId = 0)

Chryste Panie, jak można było to tak napisać. Jak na ten moment rekord w kodzie. Do tej pory znalazłem kilka z 14 i 15, ale to było już zbyt mocne.

somekind
Ja tam używam NDependa, u nas rekord to na razie 22, ale nie wszystkie binarki są podpięte do raportu, więc może być więcej.
siararadek
Ja bym się bał odpalić ten program do mojego projektu, bo by jeszcze uznał, że większość kodu nadaje się tylko na śmietnik.
vpiotr
Widziałem kiedyś podobną funkcję. Wtedy, po 7 latach komercyjnej pracy z Delphi uznałem że jednak można spartolić kod w tym języku. A to niełatwe... Zasada zdaje się z M$: "funkcja powinna mieć maksymalnie 3 argumenty, jeśli ma więcej - pomyśl nad zmianą". Moja prywatna zasada: jeśli funkcja ma więcej niż 3 argumenty, w tym dwa lub więcej domyślne - zamień argumenty na strukturę z opcjonalnymi atrybutami.
ShookTea
  • Rejestracja:około 12 lat
  • Ostatnio:prawie 6 lat
  • Lokalizacja:Wrocław
  • Postów:629
0

To nie jest programistyczne, ale na pewno wielkie WTF.
Mój znajomy przesiadł się 3 lata temu na Windows 7 i chciał tam zainstalować taką swoją ulubioną grę (City Life). Okazuje się jednak, że ta gra robi dość ciekawe efekty na tym systemie - po instalacji żąda ponownego uruchomienia komputera, a gdy się to zrobi, wywala się pełno błędów, zaś system nie włącza się do końca, lecz wyświetla informacje o próbie naprawy. Okazało się, że te próby się nie udały i trzeba było przywrócić system z kopii zapasowej.
Poszperałem później w internecie i znalazłem sposób - przed ponownym uruchomieniem komputera trzeba było zainstalować jakąś łatkę. Zainstalowałem mu więc grę i wszystko działało.
Teraz zmierzam do meritum sprawy: Kolega zadzwonił do mnie przedwczoraj i powiedział, że ma mało pamięci (zgaduję, że chodzi o dysk twardy) i strasznie mu muli komputer. Zaproponowałem mu, że za kilka dni do niego przyjadę i mu sformatuję komputer. Kolega odinstalował sobie tą grę razem z łatką, a następnie zainstalował bez łatki, zrestartował komputer, znowu wywalił się błąd, przywrócił kopię zapasową i zainstalował grę z łatką. Dzisiaj do mnie zadzwonił i powiedział, że sam sobie sformatował komputer.


Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
0

Kolejny WTF sprzed paru minut związany z FPC:
Mam taki prosty kod (również fragment z mojego kompilatora):

Kopiuj
  Procedure Search(const Namespace: TNamespace);
  Var Symbol: TGlobalSymbol;
  Begin
   For Symbol in Namespace.SymbolList Do
    if (Symbol.Typ = gsType) and (Symbol.Name = TypeName) Then
    Begin
     Result := Symbol.mType;
     Exit;
    End;
  End;  

Jest to część funkcji służącej do szukania globalnych deklaracji typów w danej przestrzeni nazw; jak widać - kod przeszukuje listę symboli szukając typu o określonej nazwie, po czym zwraca go (tutaj Result odnosi się do procedury nadrzędnej, tak aby nie było zdziwienia, że "co - w jaki sposób procedura coś zwraca?!" :P).
Poprawnie działa to przy wyłączonych optymalizacjach oraz -O1, lecz dla testu włączam -O2, kompiluję i staram się skompilować jeden mały pliczek...
... i crash! Prosto na tym ifie (precyzyjniej: wykrzaczało się gdzieś na porównywaniu stringów).
Pierwsza myśl: pewnie nulll-pointer - sprawdzam, i nie - to nie to.
Następne kilkanaście myśli poprowadziło mnie do takiej formy kodu:

Kopiuj
   For Symbol in Namespace.SymbolList Do
   Begin
    Writeln(Symbol.Name);
    if (Symbol.Typ = gsType) and (Symbol.Name = TypeName) Then
    Begin

I... to zadziałało - kod przestał się crashować na porównywaniu Symbol.Name = TypeName i działał poprawnie.
Wyniki: nie mam pojęcia dlaczego (nie chce mi się tego specjalnie debugować od strony assemblera), lecz Writeln spowodowało, że ten kod zaczął działać (aby było zabawniej, pisząc Writeln(Symbol.Typ); powracałem do punktu wejścia, czyli błędu).
Koniec końców problem rozwiązałem za pomocą funkcji AnsiCompareStr, lecz niemniej zaklasyfikowałbym to jako bug we FPC - może jak znajdę trochę wolnego czasu, to przyjrzę się temu bliżej :P


msm
Magic ;). A ten symbol.Typ jest jakiego hm, typu? Writeln ma jakieś specjalne zachowania dla czegoś? W takim C gdybyś zrobił const char *c = &quot;%s&quot;; printf(c); to też by miało prawo nie działać ;]. A jeśli jesteś pewien że to bug to go zgłoś może, będzie go ktoś mógł naprawić.
Patryk27
Symbol.Typ to enum (gsConstant, gsVariable, gsFunction, gsType); FPC umożliwia wyświetlanie enumów bezpośrednio za pomocą Writeln (wyświetlana jest nazwa enumu tak, jak w kodzie) - całkiem przydatna konstrukcja ;) Odnośnie zgłoszenia - 400 KB-owego kodu im nie wyślę, jak znajdę nieco więcej wolnego czasu, to postaram się odnaleźć przyczynę błędu i to zgłosić.
Azarien
możesz spróbować to zgłosić, ale żeby ostudzić ci zapał wiedz, że zespół FPC potrafi przez kilka lat zastanawiać się, czy zgłoszony bug jest rzeczywiście bugiem czy może ficzerem ;-)
vpiotr
Robiąc "Writeln" "dotykasz" zmiennej w inny sposób, przez co zmieniasz działanie optymalizatora. Sprawdź: a) ASM dla obu przypadków b) czy kontener (jeśli niestandardowy) SymbolList ma dobrze zrobione wyliczenie i inicjalizację tego wyliczenia c) czy oba łańcuchy są tego samego typu.
Marooned
Administrator
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 6 godzin
  • Lokalizacja:Poznań
0

Nie do końca programistyczne.

Wczoraj w mojej skrzynce pojawiła się koperta od dostawcy Internetu. Data wysyłki na kopercie to 25 kwietnia. Inotel informuje w nim, że z dniem 1 maja, to jest dzisiaj, wyłącza jakąś tam usługę (akurat nie korzystam) e-backup i do dziś należało zgrać wszystkie dane aby nie przepadły.
Czyli generalnie gdybym z tego korzystał miałbym aż kilka godzin na zgranie danych.
Uroczo.


vpiotr
Przechowując dane gdzieś w sieci de facto pozbywasz się (nie wprost) prawa do decydowania o nich. Dając kilka godzin i tak byli "łaskawi". Owszem, uroczo...
Marooned
To fakt. Raz zawierzyłem dyskowi internetowemu (Bitcasa). Straciłem bezpowrotnie 74865 plików (akurat mało istotnych dla mnie, dlatego nie uroniłem łzy). Tłumaczyli się używaniem wersji beta bla bla... Obecnie tylko Dropbox, Copy etc - czyli kopia na dysku.
0

Wszytko mówiąca nazwa i opis błędu.
http://www.dba-oracle.com/t_ora_24344_success_with_compilation_error.htm

ORA-24344: Success with Compilation Error

ORA-24344 tells you there is a problem somewhere in your code.

Azarien
tak było na Commodore 64: jedyny błąd to SYNTAX ERROR :-)
Marooned
MS Office kiedyś wypluwał error Błąd wykonania polecenia nie wystąpił.
n0name_l
Proba uruchomienia opery na archu z wylaczonymi Xami: "Cannot open display, error: success" ;)
unikalna_nazwa
  • Rejestracja:około 14 lat
  • Ostatnio:ponad 9 lat
1

Gmail spokojnie przyjmuje spoofowane maile i umieszcza je w skrzynce odbiorczej mimo że po wybraniu "Pokaż oryginał" wyraźnie widać:

Received-SPF: fail (google.com: domain of powiadomienia@payu.pl does not designate 2a01:5e0:36:5001::20 as permitted sender) client-ip=2a01:5e0:36:5001::20;
Authentication-Results: mx.google.com;
spf=hardfail (google.com: domain of powiadomienia@payu.pl does not designate 2a01:5e0:36:5001::20 as permitted sender) smtp.mail=powiadomienia@payu.pl

Nie miałem problemu z wysłaniem do siebie zespoofowanego maila o identycznym wyglądzie jak informacja o wpłacie na payu.
Nigdzie nie ma najmniejszego ostrzeżenia a wiadomość dodatkowo została oznaczona jako ważna "głównie ze względu na słowa zawarte w wiadomości"

Dodam że nie jeden przedmiot do tej pory wysłałem tylko na podstawie takiego maila, bo nie chciało mi się logować do allegro żeby sprawdzić wpłatę - dzisiaj postanowiłem sprawdzić czy nie za bardzo ufam "systemowi" i okazało się że właśnie tak jest

Jak dla mnie porażka roku :O

Bonusowo - w gmail nie można niepostrzeżenie ustawić przekazywania poczty. Po włączeniu przekazywania przez tydzień pokazywana jest informacja w widocznym miejscu że poczta jest przekazywana żeby użytkownik był tego w pełni świadom.
Ale uzyskując chwilowy dostęp do konta google można za to napisać jednolinijkowy skrypt w google apps script który będzie robił dokładnie to samo i już bez żadnego ostrzeżenia, potwierdzenia ani nawet śladu w ustawieniach konta


Pół giga extra na dropboxie? Pół giga extra na dropboxie! Tyle wygrać! >>Klik here<<
edytowany 5x, ostatnio: unikalna_nazwa
Azarien
Jeśli ktoś (ja ;-)) używa czytnika np. Outlooka, to przez pół roku może nie zaglądać na stronę gmaila, i nie widzieć co tam się dzieje...
Marooned
Google Apps script - ciekawe, nie słyszałem o tym wcześniej.
n0name_l
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 4 lata
  • Postów:2412
0

Protokol UDP zawstydza poczte polska, potrafi gubic pakiety na lokalnej maszynie bez dostepu do internetu ;)
user image

unikalna_nazwa
to pewnie żeby się nie rozleniwiać przy obsłudze i nie mówić "u mnie działa" ;)
RE
a jak wygląda program?
n0name_l
Inicjalizacja + zwiekszenie buforow wysylkowego/odbiorczego. Klient wysyla w petli 100000 pakietow po 1B, po czym wysyla bajt zerowy jako znacznik konca, serwer w petli nieskonczonej odbiera bajty, kiedy napotka znacznik konca sprawdza przez nastepne 2 min dostepnosc do odbioru (taka mam wartosc 2xmsl) i konczy dzialanie.
Demonical Monk
Istnieje coś takiego jak bufor i potrafi się przepełnić ;>
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około godziny
0

Chciałem zoptymalizować obliczenia zmiennoprzecinkowe.
Napisałem krótki programik mierzący czas (w ms) wywołania funkcji.

Kopiuj
int main()
{
	clock_t start = clock();
	int wynik = funkcja_która_coś_długo_liczy();
	// printf("%d\n", wynik);
	clock_t stop = clock();
	printf("wynik %d czas %ld\n", wynik, stop-start);
}

Efekt programu:
wynik 381742 czas 0
Mimo że program wykonuje się kilka sekund, czas wykonania zawsze pokazuje zero.

WTF?

Okazuje się, że kompilator zastosował coś, co wydawało mi się w C++ niedopuszczalne: leniwą ewaluację.
funkcja_która_coś_długo_liczy() wykonuje się dopiero gdy jej wynik jest potrzebny (w printf), a oba wywołania clock() wykonują się natychmiast jedno po drugim.
Żeby zmierzyć rzeczywisty czas, muszę użyć zmiennej wynik wewnątrz pomiaru, np. odkomentować linijkę z dodatkowym printf.

Mimo że widzę co się dzieje, nadal nie rozumiem jak to w C++ może być dopuszczalnym zachowaniem.
Visual 2012.

edytowany 3x, ostatnio: Azarien
HO
Debug czy release?
Olamagato
W sumie taka agresywna optymalizacja choć jest wkurzająca w tym przypadku, to może mieć czasem sens. Możliwe, że kompilator "wywęszył", że funkcje clock i ta Twoja są wg niego zupełnie niezależne, więc sobie zmienił kolejność obliczania. Może spróbuj wyjąć deklarację zmiennej wynik przed pierwsze wywołanie clock, a wewnątrz pozostaw tylko przypisanie - może to wyłączy tę "optymalizację". Ewentualnie zastosuj modyfikator volatile (lub const) do deklaracji zmiennej wynik.
Azarien
volatile pomogło.
0

Win8 co chwilę gasiła mi monitor i musiałem go odblokowywać.
W opcjach zasilania miałem ustawione wszytko dobrze, i nic mi to nie dawało.
W końcu poszukałem na googlach i oto co znalazłem:

This was way trickier than I expected. You need to alter one registry value:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Power\PowerSettings\7516b95f-f776-4464-8c53-06167f40cc99\8EC4B3A5-6868-48c2-BE75-4F3044BE88A7]\Attributes

Value Data = 2 (0x00000002)

After that, go back to your power settings in "Power Options" - "Advanced Power Settings". Now go to the "Display" item and a new option appears. It says "Console lock display off timeout" set this value and everything will be good.

Jakim trzeba być sadystą, lub co trzeba ćpać, żeby coś takiego wymyślić?

edytowany 1x, ostatnio: Marooned
siararadek
  • Rejestracja:ponad 17 lat
  • Ostatnio:prawie 9 lat
0

Pracuję nad aplikacją, która jest napisana w sposób tragiczny. Zaś najgorsze jest to, że dla 168 tabeli w bazie nie ma stworzonych kluczy obcych dla przynajmniej 2/3 relacji. Jest zadanie na usunięcie wszystkich danych związanych z jednym podmiotem z bazy. A, że ten podmiot ma macki praktycznie całości tabelek, to skrypt usuwający te dane ma ogromną długość. Dodatkowo nie można być pewnym, że usunięto poprawnie wszystkie dane bo bez kluczy przy takiej ilości tabeli o rozspójnienie nie trudno, a zauważymy to dopiero kiedy aplikacja padnie po jakiejś szczególnej akcji. W Dependencies danej tabeli nie widać relacji bo nie ma kluczy, trzeba każdą tabelę przechodzić i patrzeć, czy nie ma odpowiedniego identyfikatora. Ehh....

no_solution_found
ciesz się, że przynajmniej identyfikatory kolumn są jeszcze w miarę zrozumiałe :) bez tego, to bym się pociął na starcie
siararadek
Tak miałem w poprzedniej pracy. Identyfikator do tabeli Provinces nazywał się WojId.
siararadek
  • Rejestracja:ponad 17 lat
  • Ostatnio:prawie 9 lat
2

Dlaczego powinni zabronić używania słowa partial przez developerów?

Aplikacja webowa - kontroler. Aby uniknąć zbyt dużego jednego pliku, rozbito go na części. Teraz jeden kontroler znajduje się w 16 plikach i posiada 150 metod. Łącznie posiada prawie 6000 linii kodu.

edytowany 1x, ostatnio: siararadek
aurel
Zamiast unikać zbyt dużego pliku, trzeba było unikać zbyt dużego kontrolera...
somekind
Tja, u mnie w robocie w projekcie to norma, i 2/3 osób jest szczęśliwych, że partial istnieje. No, ale to jest elita, nie takie półgłówki jak ja.
msm
Administrator
  • Rejestracja:prawie 16 lat
  • Ostatnio:4 miesiące
0

Pseudokod z (unieważnionego - każdy chyba widzi dlaczego) zadania z tegorocznej matury rozszerzonej z informatyki:

http://pastebin.com/c6V8FCUc

Jak zwykle fail ze strony CKE.

edytowany 1x, ostatnio: msm
siararadek
Ma ktoś może screena z tego zadania czy orginalny arkusz? Bo wszędzie widzę już ocenzurowano.
Marooned
Też nie czaję nie znając kontekstu (treści zadania)
hauleth
Nie ważne. Mają nieskończoną pętlę.
MO
  • Rejestracja:ponad 18 lat
  • Ostatnio:około 6 godzin
1

przenosiny systemu do amazona. Powstało kilka zmian w kodzie. Czas testów wydajnościowych. Okazuje się że zapis do bazy trwa 0.5s. Przy czym obciążnie systemu to jeden user :D
Najpierw przypuszczenie żę coś nie tak na z bazą. Okazuje się żę baza wykonuje zapytanie krócej niż 10ms. Nie mieliśmy już kompletnie pomysłu o co chodzi więc zaczęliśmy logować wszystko. Okazało się że wywołanie metody trwa ~500ms natomiast ona sama wykonuje się ~10ms. Hmmm magia springa, aspektów i kto wie czego jeszcze. Oczywiście metoda była wykonana w transakcji(po wyłączeniu transakcji zaczęło działać przyzwoicie).
Okazało się że gdzieś przez pomyłkę w jednym z xml'i zmieniliśmy fragment jedenj linijki - ustawiliśmy nie ten dataSource dla transactionManagera.
W efekcie otwieraliśmy transakcje do bazy będącej w zupełnie innej sieci w zupełnie innej części świata, w której wykonywaliśmy zapytanie do bazy znajdującej się w amazonie.
Jak już gdzieś na tym forum było, "..programiści Javy nie zawsze do końća wiedzą co dokładnie robi ich kod...".

Koziołek
to nie wina języka czy narzędzia, ale tego, że macie bajzel w konfiguracji. Każdemu się zdarza.
Marooned
Nie lubię serwerów Amazona. Też się (drugi raz) przenosimy i czasem czekam >1s na ruch kursora w vimie przez putty. Ja nie wiem, że to innym działa szybko...
Koziołek
@Marooned jak kupujecie najtańszy serwer gdzieś na drugim końcu globu ;)
Marooned
Jak się ma ladmina, który prawa do plików ustawia pół dnia, to wiesz ;) poza tym, może u klientów w Kraju Kwitnącej Wiśni to śmiga aż miło.
MO
@Koziołek - tak wiem że to przez błąd w konfiguracji, bardziej chodzi mi o fakt że dwóch gostków gapi się w kod bo w innym module ktoś zmienił nazwę beana :)
Koziołek
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Stacktrace
  • Postów:6821
0

Może nie klasyczny WTF, ale i tak ciężko się zdziwiłem. Siedzę obecnie i produkuję widoki na potrzeby hurtowni danych. Większość z nich to zrzuty tabel 1:1, poza jednym w którym mam 4x LEFT JOIN przez pół modelu danych (z czego jeden wynika z kijowatości przyjętych zasad mapowania dziedziczenia). Zaniepokojony szybkością działania zapytania o takiej konstrukcji napuściłem na nie testy wydajności... Okazało się, że zapytanie z czterema joinami jest szybsze niż zapytanie na jedną tabelę (inty+varchar2) bez warunków (po prostu select * from X)...


Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException
2

Ostatnio w mojej firmie prowadzili rekrutacje, do zrobienia była prosta aplikacja, trafiła się perełka, programista który ponoć miał 2 lata doświadczenia napisał sobie funkcję do parsowania intów:

Kopiuj
        public int tryParseInt(object obj)
        {
            if (obj == null)
                return 0;
            return tryParseInt(obj.ToString());
        }
Koziołek
Rozmowy to chyba jedno z lepszych źródeł perełek
Koziołek
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Stacktrace
  • Postów:6821
0

Z serii JS jest dziwny:

Kopiuj
++[[]][+[]]+[+[]] 

Daje 10


Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException
somekind
Wygląda jak Brainfuck. ;)
Sarrus
  • Rejestracja:prawie 14 lat
  • Ostatnio:3 dni
  • Postów:2512
0

Dziś trafiłem na kawałek kodu z 2009 roku

Kopiuj
try
{
   data = GetData();
}
catch
{
   throw;
}

Moja reakcja WTF + :D

edytowany 1x, ostatnio: Sarrus
Zobacz pozostałe 4 komentarze
Marooned
A może coś było przed throw, potem wyleciało i otoczka została?
Sarrus
@Marooned właśnie tak pomyślałem i sprawdziłem. Taka wersja była od początku istnienia pliku :)
wasiu
U mnie też takie rzeczy się zdarzały. Ot PM mówił, że ot ma być kod przygotowany pod logowanie błędów ale jeszcze muszą ustalić jak i gdzie je logować i zaraz powiedzą. Oczywiście te zaraz nie następowało już nigdy.
dzek69
Skoro od początku tak było, czyli odpada opcja "kiedyś tu coś było" to jest jeszcze opcja "kiedyś tu coś ma/miało być" ;)
MarekR22
zapewne ta konstrukcja jest użyteczna podczas debugowania.
0

W nowym wspaniałym standardzie C++11 nie będzie semaforów. Może dodadzą to w standardzie C++ 2099 gdy wszystkie inne języki będą już używały pamięci transakcyjnej ;)

Tak wiem ze semafor można zaimplementować przy pomocy conditional variables, ale skoro to takie proste czemu do uja nie dali tego w obecnym standardzie???

Zobacz pozostałe 2 komentarze
ShookTea
Od kiedy? Bo niedawno czytałem o tej kompatybilności.
AF
@ShookTea Od kiedy przykładowo w C jest VLA.
Azarien
VLA ma dużą szansę trafić do C++1y
AF
@Azarien Już w C++14 czy później?
Azarien
w nadchodzącej wersji. czy będzie nią C++14 to się dopiero okaże ;-)
Koziołek
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Stacktrace
  • Postów:6821
0

Nie w kodzie, ale programistyczne...
Miałem wysłać znajomym foty z imprezy. Kilkanaście plików PNG po ~8-11MB każdy.

Kopiuj
 gzip -c img*.png > foty.zip

Spakowało tylko jeden 8MB plik... wynikowy zip miał 344MB...


Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException
edytowany 1x, ostatnio: Koziołek
Azarien
bo trzeba było pewnie dać &gt;&gt; ;)
unikalna_nazwa
Dla mnie WTFem tutaj jest samo pakowanie .png zipem bo on sam w sobie jest spakowany tym samym algorytmem. Ani tego szybciej nie prześlesz, ani nie ułatwisz pobrania
Koziołek
@unikalna_nazwa nie sądzisz, że wysłanie jednego pliku jest zdecydowanie łatwiejsze niż wysyłka ~40 plików? A na windowsie nie ma w standardzie tar by zwykły user mógł sobie takie archiwum rozpakować. @Azarien >> dodaje do już istniejącego archiwum. Jak tworzysz nowe to dajesz > niezależnie od liczby plików.
unikalna_nazwa
Zależy czym - na przykład na ftp jest równie łatwe, na dropboxa też, na imgura, skydrive, picasa, maila też. Pobranie zależy od klienta ale tu również nie widzę różnicy między jednym a większą ilością plików - na ftp można zaznaczyć wszystko, w pozostałych przypadkach jest opcja "pobierz wszystkie" lub "pobierz folder/album" (która to opcja jednak zazwyczaj pakuje w .zip). Wysyłanie większej ilości jest nawet wygodniejsze bo można przerwać i dokończyć później, a druga osoba może ściągnąć pojedynczą fotkę. A i większość jednak posiada WinRara lub 7zipa które otwierają .tar
unikalna_nazwa
A co do tematu to stworzyłeś plik będący zwykłym sklejeniem ~40 małych pliczków .gz - każdy posiadający własny nagłówek. W tym pliku znajdziesz wszystkie fotki i możesz nawet je wypakować gunzipem, ale normalny unpacker zip obsłuży tylko pierwszy plik zgodnie z nagłówkiem a resztę pliku zignoruje. Zipa nie zrobisz gzipem, użyj polecenia zip
0

Ale kilka skonkatenowanych plików .gz archiwum .zip nie czyni...

DA
  • Rejestracja:prawie 13 lat
  • Ostatnio:prawie 10 lat
  • Postów:25
0

4 błędy i 11 warnów:

Kopiuj
#include <iostream>
#include <vector>
using namespace std;

int main()
{
	vector<pair<double, double>> tab;
	return(0);
}

To już chula...

Kopiuj
#include <iostream>
#include <vector>
using namespace std;

int main()
{
	vector< pair<double, double> > tab;
	return(0);
}
edytowany 1x, ostatnio: darkfucker
Zobacz pozostałe 3 komentarze
msm
Nie pewnie tylko na pewno. Dodatkowo to nie WTF, tylko jasno zdefiniowane w standardzie C++ zachowanie (zmienione oficjalnie w C++11 (chociaż niektóre kompilatory wspierały to wcześniej) ) (z drugiej strony, sporo zachowań 'jasno zdefiniowanych w standardzie C++' można uznać za WTF, więc to rzecz względna) (btw. array&lt;int, 64&gt;&gt;1&gt; to_tez_ma_dzialac;) (trochę sporo tych nawiasów).
several
Przecież to żaden WTF. Oprócz faktu, że takie zachowanie jest opisane w standardzie (tak jak pisał @msm), to w prawie każdym kursie szablonów czy STL'a ttaka składnia jest opisywana.
Marooned
@msm - Człowiek-Nawias
unikalna_nazwa
  • Rejestracja:około 14 lat
  • Ostatnio:ponad 9 lat
0

Z kalkulatora pożyczek na stronie alior sync: http://pozyczka.sync.pl/bfo/

Kopiuj
var json = "[\
  [1000,90.50,48.73,34.91,28.09,24.06,21.42,19.58,18.24,17.23,16.44],\
  [2000,181.00,97.45,69.83,56.18,48.11,42.84,39.16,36.48,34.45,32.89],\
  [3000,271.50,146.18,104.74,84.26,72.17,64.26,58.74,54.71,51.68,49.33],\
  [4000,362.01,194.91,139.65,112.35,96.22,85.68,78.32,72.95,68.90,65.77],\
  [5000,452.51,243.63,174.56,140.44,120.28,107.10,97.90,91.19,86.13,82.21],\
  [6000,543.01,292.36,209.48,168.53,144.33,128.52,117.48,109.43,103.35,98.66],\
  [7000,633.51,341.09,244.39,196.61,168.39,149.94,137.06,127.66,120.58,115.10],\
  [8000,724.01,389.81,279.30,224.70,192.45,171.36,156.64,145.90,137.80,131.54],\
  [9000,814.51,438.54,314.21,252.79,216.50,192.78,176.22,164.14,155.03,147.98],\
  [10000,905.02,487.27,349.13,280.88,240.56,214.20,195.80,182.38,172.25,164.43],\
  [15000,1357.52,730.93,523.69,421.32,360.83,321.30,293.71,273.57,258.38,246.64],\
  [20000,1810.03,974.54,698.25,561.75,481.11,428.40,391.61,364.76,344.51,328.86],\
  [25000,2262.54,1288.17,872.81,702.19,601.39,535.49,489.51,455.95,430.63,411.07],\
  [30000,2715.05,1461.80,1047.38,842.63,721.67,642.59,587.41,547.13,516.76,493.28],\
  [35000,3167.55,1705.44,1221.94,983.07,841.95,749.69,685.31,638.32,602.89,575.50],\
  [40000,3620.06,1949.07,1396.50,1123.51,962.23,856.79,783.21,729.51,689.01,657.71],\
  [45000,4072.57,2192.70,1571.07,1263.95,1082.50,963.89,881.12,820.70,775.14,739.92],\
  [50000,4525.08,2436.34,1745.63,1404.39,1202.78,1070.99,979.02,911.89,861.27,822.14],\
  [60000,5430.09,2923.61,2094.75,1685.26,1443.34,1285.19,1174.82,1094.27,1033.52,986.57],\
  [70000,6335.11,3410.87,2443.88,1966.14,1683.90,1499.38,1370.62,1276.65,1205.77,1150.99],\
  [80000,7240.12,3898.14,2793.01,2247.02,1924.45,1713.58,1566.43,1459.03,1378.02,1315.42],\
  [90000,8145.14,4385.41,3142.13,2527.90,2165.01,1927.78,1762.23,1641.40,1550.28,1479.85],\
  [100000,9050.15,4872.68,3491.26,2808.77,2405.56,2141.98,1958.04,1823.78,1722.53,1644.28]\
]"; 

// ...
    jsonObj = jQuery.parseJSON( json );

ekhm... :|
widzę, że jQuery jest już niezbędny nawet do utworzenia prostej tablicy ;)

dla niewtajemniczonych - JSON to format wymiany danych w formacie zgodnym z javascript - wystarczyło usunąć cudzysłowy żeby uzyskać tablicę. Autor natomiast z tablicy w javascript stworzył stringa w javascript (do którego musiał jeszcze dodać backslashe żeby go rozbić na parę linii), którego następnie parsuje dość dużą biblioteką, żeby z powrotem uzyskać tablicę :O
(autor nie zna też najwyraźniej znaczenia słówka var i cały globalny obiekt window jest zasyfiony zmiennymi, które miały być lokalne)


Pół giga extra na dropboxie? Pół giga extra na dropboxie! Tyle wygrać! >>Klik here<<
edytowany 5x, ostatnio: unikalna_nazwa
Zobacz pozostałe 2 komentarze
TA
It's not a bug, it's a feature!
Azarien
wzór można by jeszcze wybaczyć, jeśli z powodu zaokrągleń dawałby inną cyfrę na ostatniej pozycji...
unikalna_nazwa
a, tak - nawet umknęło mi napisanie o tym że można to zastąpić wzorem ;) no ale faktycznie można wybaczyć bo frontendowiec na bankowości się znać nie musi a wzór nie jest znowu aż tak banalny
somekind
A może po prostu wynika to z tego, że kod jest częściowo generowany po stronie backendu?
siararadek
Genialna deklaracja funkcji: function amount(amount). I wszystko jasne.
siararadek
  • Rejestracja:ponad 17 lat
  • Ostatnio:prawie 9 lat
0

Dostaje zgłoszenie, ze rabaty dla przy zakończeniu zamówienia w sklepie naliczają się podwójnie. Wchodzę i widzę jeden wielki WTF, kod spaghetti wielkości FSM. Ale najtragiczniejsze, ze dla pobranie ceny dla np. 10 towarów wywoła sie 30 procedur składowanych wyliczajacych cenę dla pojedynczego towaru (cena towaru + różnego rodzaju promocje). Ktoś napisał pętlę iterujaca po id produktów i wywołują bardzo złożone zapytanie. Dodatkowo użyto ja 3 razy bo kolejne osoby nie ogarnęły ze juz wyliczono cenę i robią to kolejny raz. Najgorsze ze składanie zamówień jest kluczowe w aplikacji i takie coś tragicznie spowolni prace aplikacji i zwiększy drastycznie obciążenie Azure. A zrefaktoryzowac nie wolno bo puszczamy aplikacje a to by opóźniło wyjście o jakiś tydzień lub więcej z testami wszystkich mechanizmów. Kuzwa, jak mi się nie chce przy tym pracować...

edytowany 1x, ostatnio: siararadek
Zobacz pozostały 1 komentarz
siararadek
Mamy towar za X zł. Następnie trzeba ze sklepu pobrać wszystkie promocje, obliczyć cenę produktu w tych promocjach i wybrać najbardziej korzystną. To jest wykonywane przez procedurę składowaną, która jest napisana w sposób bardzo skomplikowany a jej refaktoryzacja jest wpisana jako zadanie po wypuszczeniu produktu.
Olamagato
Je..nij to w cholerę i zwiedź Karaiby. ;)
unikalna_nazwa
"a może by tak [CIACH!] to wszystko i wyjechać w bieszczady" ;)
Marooned
Bieszczady są zawsze dobrym pomysłem.
wasiu
Tak chyba w każdej firmie jest ;) Co pokazuje moje wiele lat doświadczenia pracy w różnych miejscach ;)
siararadek
  • Rejestracja:ponad 17 lat
  • Ostatnio:prawie 9 lat
0

@unikalna_nazwa coś podobnego mam

Na zapytania Ajaxowe kontroler może zwrócić JsonResult, który ma pole Data będące typu object. Ktoś od nas wymyślił, że stworzy wrapper:

Kopiuj
    public class JSONModel
    {
        public bool Success { get; set; }

        public string Text { get; set; }
    }

i go będzie wrzucał do Data, tak by stworzyć podwaliny pod standard odbierania wiadomości w widokach, czy udała się akcja czy nie i do tego jakiś komunikat.
Tylko teraz jak przesłać obiekt jak się udało? Można stworzyć klasę dziedziczącą po JSONModel. Albo dodać nowe pole Data, co wygląda brzydko, ale jest proste i łatwe.
Ale po co sobie życie upraszczać? Można zostawić tak jak jest i do Text wrzucać obiekty po serializacji do JSON, a w widoku go deserializować. Albo kolejne wartości wrzucać po średnikach i w widoku sobie split zrobić. Błędogenność i bezsensowne parsowanie uber alles. JSON in JSON.
user image

dzek69
Moderator
  • Rejestracja:ponad 18 lat
  • Ostatnio:3 dni
  • Lokalizacja:Rzeszów
0

To jest zarówno WTF jak i gorzkie żale dotyczące POSRANYCH (tak, posranych) bugów jakie istnieją w Webkicie (Chrome). Od lat gdy piszę coś fajnego, testując głównie na Operze (jeszcze Presto), która dość "mocno" trzyma się standardów i najmniej pozwala na wybryki - wszystko działa fajnie, jakiś czas były poprawki ekstra dla IE6/7, zwykle działało wszędzie, a w Chrome jakiś debilny bug. Te bugi nie raz wisiały w trackerze po 2-3 lata zanim zostały poprawione, zwykle dało się to jakoś obejść, ale było ostro wkurzające. Na aktualny problem jeszcze nie znam rozwiązania.

Otóż mam jakąś tam stronkę, w niej pokazuję warstwę wierzchnią jako "preloader" - strona cała jest ładowana na raz, potem dynamicznie się wszystko przesuwa itd itd. Warstwa wierzchnia to <div id="site_loader"></div>
Fragment css:

Kopiuj
.slogan {
    background: rgba(0,0,0,.6); /* linia 351 */
}
#site_loader {
    background: rgba(255,255,255,0.97) url("./images/-1.gif") center center no-repeat; /* linia 625 */
}

Czyli - mój preloader powinien mieć białe tło i gifa na nim. Wszystko fajnie, i tak właśnie to sobie działało (nawet na webkicie). Stronę przerzuciłem na produkcję, dziś odpalam sobie ją na Operze Next (Webkit) - a tam pół-czarne tło i loader. Pierwsza myśl - tło się załaduje później. Potem - przecież to nie był obrazek, a kolor..

Najpierw pomyślałem - błąd nowej Opery. Patrzę pod Chrome - to samo :/ Inspekcja elementu wykazuje, że mój element w 1251 linii ma nadany styl background: rgba(0,0,0,0.6) url("./images/-1.gif") center center no-repeat;, se myślę - wtf? Przechodzę do pliku css - niestety, kończy się on na 700 liniach :/ Potem widzę, że Chrome widzi ten plik z podwójnymi znakami nowej linii (wtf, nie ogarnia CRLF?) i stąd to rozejście. Dzielę to przez dwa i trafiam na deklarację z białym tłem. Myślę - skąd to czarne tło z alphą 0.6 - wyszukuję w pliku css - tylko element .slogan ma takie tło. Z cholera wie jakiego powodu Webkit łączy te dwie reguły (wszak robi się czarne tło, ale zostaje gif i jego ułożenie) i to z elementów o niepasujących selektorach. W dodatku nawet gdyby mój element miał klasę slogan to przecież selektor wg klasy jest mniej ważny niż selektor po id, więc tak czy siak tło powinno być białe.

Nawet nie wiem jak zabrać się za debugowanie tego. Ot Webkit zdecydował sobie do elementu przypisać kawałek innego stylu z losowego miejsca w pliku o.O

PS. Plik css jest poprawny, nie ma nic niepodomykane i nie ma żadnych innych problemów z nim.

PS2. Nie chce mi się tego zgłaszać. Stronę jeszcze będę rozbudowywał i zmieniał - jeżeli po całkowitym ukończeniu tak to zostanie to zgłoszę i podam linka do strony, bo nie wiem jak to zreprodukować - obie reguły istniały wcześniej i było ok, po bliżej nieokreślonych zmianach się zepsuło.


edytowany 1x, ostatnio: dzek69
Zobacz pozostały 1 komentarz
dzek69
Przeczytaj całe i komentuj tylko jeżeli przeczytasz i zrozumiałeś ;) Tamta reguła w ogóle nie pasuje do tamtego selektora! Selektor po klasie, do elementu, który posiada tylko id. To nie jest problem z "mocą" danej reguły, tylko zlepieniem fragmentu dobrej reguły z fragmentem niepasującej absolutnie reguły gdzieś ze środka pliku. PS. Niestety, po dopisaniu kilku nowych styli (niezwiązanych z tymi elementami) problem przestał występować. Czyli po prostu w losowym przypadku losowo sklejają się losowe kawałki i błędu nie idzie powtórzyć, świetnie ;)
unikalna_nazwa
no zrozumiałem, ale podejrzewam że po zwiększeniu "mocy" przeglądarka przestanie to robić. Poza tym po zmianie w ".slogan" też się zmienia tło? Może przypadek, może gdzieś jakiś skrypt ustawia to tło, nie wiem. Fajnie jakbyś reversnął i podał adres żeby można było zobaczyć ;)
dzek69
Nie, slogan jest ok cały czas. Skrypt nie ustawia tła, bo sam to pisałem to wiem co to robi :) Nie lubię się publicznie chwalić dziełami - bo ktoś mi pojedzie, albo ktoś zacznie szukać dziury (niby w całym), nie chcę też, żeby profil na forum łączyć z życiem zawodowym. Zrobiłem kopię zapasową wersji, której Webkit nie ogarnia - potem dodam to important i sprawdzę czy coś zmieni (choć boję się, że zmiana choć jednego bajta wyeliminuje ten błąd tak czy tak :P)
unikalna_nazwa
oj tam czasem się nie pamięta co się samemu pisało. Przykładowo wczoraj szukałem błędu bo z bazy danych ciągle źle mi pobierało identyfikator ostatnio wrzuconego rekordu i w sesji ustawiało się na 0. Przeanalizowałem wszystkie zapytania i wszystko było w porządku, potem zaczęłm podejrzewać własny SessionHandler więc jego też wziąłem pod lupę. W końcu po prawie godzinie znalazłem whardkodowane $_SESSION['id'] = 0; :O Wtedy mi się dopiero przypomniało że napisałem to na potrzeby sprawdzenia innej części skryptu, gdy ta jeszcze nie była gotowa :D
dzek69
zbyt świeżo pisane żebym miał nie pamiętać (cały czas piszę), no i mówię - dopisałem kilka reguł css na samym dole, kawałeczek htmla - i nagle działa
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)