Programistyczne WTF jakie Was spotkały

Programistyczne WTF jakie Was spotkały
MO
  • Rejestracja: dni
  • Ostatnio: dni
0

próbuje zoptymalizować zapytanie w mysql (dodanie indexów na odpowiednie kolumny).
Po dodaniu indexów wynik jest zwracany inny niż powienien - tzn jest odwrotne sortowanie. "Order by" zabija zapytanie więc staram się bazować na sortowaniu przez index.
Po w sumie paru godzinach ślęczenia nad tym dlaczego mam odwrotne sortowanie w wyniku (dokum mysql):

"
An index_col_name specification can end with ASC or DESC. These keywords are permitted for future extensions for specifying ascending or descending index value storage. Currently, they are parsed but ignored; index values are always stored in ascending order.
"

KR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2964
0

W Linuksie i różnych Uniksach jest funkcja posix_spawnp służąca do efektywnego uruchomienia procesu potomnego. Na systemach, na których działa vfork, funkcja ta używa zwykle vfork + execve zamiast klasycznego fork + evecve. vfork zwykle nie kopiuje całej pamięci procesu rodzica tak jak to robi fork, dlatego działa znacznie szybciej, zwłaszcza jeśli proces rodzic jest duży, a proces potomny jest mały.

Niestety projektanci API posix_spawnp nie pomyśleli o dwóch ważnych sprawach:

  1. wszystkie deskryptory plików są domyślnie dziedziczone i nie istnieje sposób na wyłączenie tego lub zamknięcie wszystkich odziedziczonych deskryptorów w kontekście procesu potomnego pomiędzy wywołaniem vfork a execve. Konsekwencje tego bywają tragiczne - długo żyjący proces potomny może np. zablokować zamknięcie plików / socketów / potoków swojego rodzica, które przypadkiem były otwarte w chwili wywołania posix_spawnp. Oczywiście zdali sobie z tego problemu sprawę chyba po fakcie, więc dorobili flagę FD_CLOEXEC, którą można dodać do deskryptora pliku. Powoduje ona automatyczne zamknięcie deskryptora w procesie potomnym. Niby ma sens, tylko że... większość funkcji, którymi można otwierać deskryptory np. pipe nie obsługuje tej flagi. Trzeba zrobić to osobnym wywołaniem wprowadzając race-condition.

  2. dziedziczony jest katalog roboczy i nie istnieje żaden sposób aby go zmienić dla procesu potomnego; po prostu nie ma takiej opcji ani takiego argumentu dla posix_spawp. Jedyne co można zrobić, to tymczasowo zmienić katalog roboczy przez chdir, przed forkowaniem, później przywrócić oryginał i modlić się, żeby w trakcie jakiś inny wątek nie potrzebował odczytać katalogu roboczego.

Czyli mimo że posix_spawnp ponoć jest thread-safe, to nie ma to żadnej wartości, bo i tak w wielowątkowej aplikacji jest praktycznie bezużyteczny.
Teraz kombinuję jak tu ręcznie użyć vfork + execve żeby obejść te ograniczenia, ale vfork to jest niestety kolejna puszka pandory i już w kilku miejscach wyczytałem "nie używaj tej funkcji, bo nie da się jej użyć bezpiecznie".

Podsumowując: odpalanie procesów potomnych w aplikacjach wielowątkowych na Uniksach to jest jeden wielki WTF i najlepiej trzymać się od tego z daleka. Ale jak ktoś musi? Jak żyć? :D

Azarien
  • Rejestracja: dni
  • Ostatnio: dni
0

memleak w chkdsk-u? ;-)

user image

  • Rejestracja: dni
  • Ostatnio: dni
0

Captcha z pewnego forum.

  • Rejestracja: dni
  • Ostatnio: dni
0
DużaTajemnicaWiedzy napisał(a):

Captcha z pewnego forum.

Jest też opcja, że tym razem to tylko komputer może to odczytać :)
Swoją drogą ciekawe, że komuś się chciało robić taką captchę zamiast zwyczajnie zablokować forum.

OT
  • Rejestracja: dni
  • Ostatnio: dni
0

Z tego forum:

Kopiuj
bool SprawdzCzyJestZmiennaSrodowiskowa(LPCTSTR lpNazwaZmiennej)
{
        DWORD dwRet, dwErr;
        dwRet = GetEnvironmentVariable(lpNazwaZmiennej, NULL, 0);
 
    if(dwRet==0)
    {
                dwErr = GetLastError();
        if( ERROR_ENVVAR_NOT_FOUND == dwErr )
        {
           return false;
        }
                else
                {
                        return false;
                }
        }
 
        return true;
 
 
}
adf88
  • Rejestracja: dni
  • Ostatnio: dni
0

Hak w Thunderbird?
thunderbird_hack.png

Marooned
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Poznań
0

Czasem nachodzi człowieka chęć porzucenia na chwilę języków skryptowych i powrót do takich z kompilatorem. Wtedy na człowieka spada znak, który mówi: "zwariowałeś?!".
Znak na dziś w C# blokujący kompilację:
Error: Ambiguity between 'ArdupilotMega.GCSViews.ConfigurationView.ConfigFlightModes.components' and 'ArdupilotMega.GCSViews.ConfigurationView.ConfigFlightModes.components'
Pomógł restart Visuala...

bogdans
  • Rejestracja: dni
  • Ostatnio: dni
0

Uruchomienie programu edit z konsoli powoduje, że zmienia się znak zachęty - wyświetlane są krótkie nazwy katalogów. Zmiana dotyczy tylko dysku bieżącego, zmienna środowiskowa PROMPT nie ulega zmianie.

RE
  • Rejestracja: dni
  • Ostatnio: dni
0

Pomagałem znajomemu.

Kod jednego z wykładowców na publicznej uczelni:

user image

Tak, korzysta z frameworka testującego Visual Studio, ale dołączył także NUnit, żeby skorzystać z jego Asserta.

  • Rejestracja: dni
  • Ostatnio: dni
0
Rev napisał(a):

Pomagałem znajomemu.

Kod jednego z wykładowców na publicznej uczelni:

user image

Tak, korzysta z frameworka testującego Visual Studio, ale dołączył także NUnit, żeby skorzystać z jego Asserta.

No cóż, Mikuś potrafi :D

Azarien
  • Rejestracja: dni
  • Ostatnio: dni
1

Piszę program na SPOJ-a. Program się wywalał. Okej, nic nadzwyczajnego — ale po jakimś czasie zminimalizowałem przypadek do dosłownie czegoś takiego:

Kopiuj
#include <iostream> 
using namespace std; 

int main() 
{
    int i;
    cin >> i;  // CRASH
}

WTF :-|

Przez moment zwątpiłem, że to może moje kung-fu w C++ nie jest takie dobre. Ale przykłady z Internetu również się wywalały.
To musi oznaczać, że coś bardzo nie tak z kompilatorem, albo z instalacją.

Po jakimś czasie odkryłem że program skompilowany z parametrem -static-libstdc++ działa prawidłowo.
Haaa....
Okazuje się, że exek linkowany dynamicznie znalazł sobie w %PATH% swoją bibliotekę libstdc++-6.dll. Biblioteka była najwyraźniej w innej wersji, co powodowało crash.
Pytanie tylko, po co ta cyferka „6” na końcu, skoro i tak istnieją różne wersje, niezgodne ze sobą?

Johnny_Bit
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Kielce
0

Właśnie miałem opisać w detalu kolejny WTF z systemu klasy enterprajs, ale się okazało że jest to objęte NDA. To w skrócie w 2 punktach z kompletną anonimizacją:

  1. rozwiązanie filtracji znaków wg programistów klasy enterprise: wykasować znaczki nie będące w 7-bit ASCII, czyli "Józef"="Jozef", "Юлия"="".
  2. rozwiązanie zauważonego problemu znikania znaków: mail do szefa działu technicznego od vice chief developera z działu odpowiedzialnego za powyższy genialny pomysł o treści zbliżonej do "Rok temu wspominaliście że macie tabelę translacji znaków z UTF na ASCII. Dajcie ją nam a my wam damy 10% zniżki na najbliższą aktualizacje systemu"

A mówilismy - sami możemy zaimplementować poprwną filtrację ale nieeeeee bo dostawca systemu stwierdził "Nasi programiści są klasy enterprise".

adf88
  • Rejestracja: dni
  • Ostatnio: dni
0

Czytając ostatni post @Johnny_Bit przypomniał mi się jeden WTF'ik.

Znajoma dostała w pracy ekstra zadanie (na co dzień zajmuje czymś innym) polegające na dodaniu polskiego tłumaczenia do pewnych tekstów. Jacyś Niemcy (zapewne zleceniodawcy) przysłali jej pliki do przetłumaczenia oraz link do strony internetowej programu którym ma dokonać edycji. Zgodnie z instrukcją próbuje wprowadzać zmiany do tekstu, a tu ZONK!. Nie może wpisywać polskich liter. Przysłała mi wszystko żebym coś poradził. No to do dzieła.

Były to pliki z kodami źródłowymi C. Wskazany przez Niemców program był to typowy edytor kodu źródłowego. No i tu od razu pojawiała się myśl - zapewne wskazali ten edytor by nie namieszać z kodowaniem znaków. Otwieram pliki, zawierają menu kontekstowe jakiegoś urządzenia (jak aparat fotograficzny czy coś podobnego) w kilku tłumaczeniach - Angielski, Niemiecki, Hiszpański i inne. Struktura pliku bardzo prosta, to może jest zrozumiałe, ale też kijowo dobrana i nieudokumentowana. Były tam nieokomentowane tablice dwuwymiarowe, gdzie głównym wymiarem był indeks danego łańcucha, a podrzędnym wymiarem indeks języka, wyglądały mniej więcej tak:

Kopiuj
char * jakies_tam_menu[] = {
    { "(zdanie w języku angielskim)", "(zdanie w języku niemieckim)", "(zdanie w języku hiszpańskim)", ... },
    { "(zdanie w języku angielskim)", "(zdanie w języku niemieckim)", "(zdanie w języku hiszpańskim)", ... },
    ...
};

:) Czyli nie wiadomo jakie tłumaczenie jest od czego. Brak otagowania sprawia, że kontekst danego wyrazu czy zdania musimy wywnioskować wyłącznie na podstawie obecnych tłumaczeń (które to zapewne powstały w podobny sposób, a tylko jeden język pierwotnie był bazą). Co gorsze, kompletny brak podziału ze względu na język:
*nie ma podziału plików, w jednym pliku znajdują się tłumaczenia wszystkich języków
*nie ma podziału danego pliku, w jednym pliku mamy raz jedne tłumaczenia, raz inne
*nie ma nawet podziału fragmentu pliku, tłumaczenia są kompletnie wymieszane, w zasadzie podział na język następuje na najniższym poziomie hierarchii i dosłownie jedna linia kodu zawiera różne tłumaczenia.
Na początku każdego z plików widnieje notka deweloperska (w skrócie):

*"Ten plik jest zapisany w ASCII Latin-1 i nie spieprzyć tego"*

Zerkam na tabelę znaków Latin-1, no i faktycznie, zawiera niezbędne znaki dotychczasowych tłumaczeń. Ale polskich znaków niestety nie uświadczysz.

Mail do Niemców, po dłuższym czasie odpowiedź. Rezygnują ze zlecenia :D

Azarien
  • Rejestracja: dni
  • Ostatnio: dni
0

1234.png

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
0

Kto zgadnie, jaki będzie wynik tego kodu w PHP:

Kopiuj
$array=array('a','b','c','d','e','f','g');

foreach($array as &$a)
{
}

foreach($array as $a)
{
}

print_r($array);

Poprawna odpowiedź:

Kopiuj
Array
(
    [0] => a
    [1] => b
    [2] => c
    [3] => d
    [4] => e
    [5] => f
    [6] => f
)

(patrz ostatni wyświetlony element, a ostatni element w tablicy w kodzie)
http://dev.eek.be/2010/10/php-quirks-passing-an-array-by-reference/


Dodatkowo: http://blog.gabrielsaldana.org/php-5-oop-implementation-quirks/
Demonical Monk
  • Rejestracja: dni
  • Ostatnio: dni
0
Patryk27 napisał(a):

...

Bo 80% programistów PHP nie ogarnia podstawowych zasad działania tej VMki i dziwi ich nawet to:

Kopiuj
<?php
var_dump(in_array('3LubieCiastka', array(1, 2, 3))); // bool(true)

Na każdej stronie z rzekomymi "PHPowymi WTFami" przypieprzają się do losowych przykładów pokazujących type juggling zamiast przeczytać o podstawach...

Marooned
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Poznań
0

Error handler w PHP łapie błędy i wyświetla ładną stronę z błędem i stacktrace.
Coś tam źle wpisałem, dostałem error 500. Poprawiłem, F5 i... znów strona z błędem i taki oto jego opis:

Kopiuj
If you are interested, you are here because of 200 error.
OK

Uhm.

wasiu
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Poznań
  • Postów: 1552
0

C#, niby jedna linia kodu:
autObj.State = ObjectState.Updated;
która po wykonaniu miała zawsze wartość Inserted... WTF pomyślałem?

Okazało się, w propertisie na set'cie był ustawiony breakpoint z warunkiem value = ObjectState.Inserted

Pierwszy raz spotkałem się z bug'iem w breakpointcie ;D

MO
  • Rejestracja: dni
  • Ostatnio: dni
0

admini zgłosili problem z jednym z zapytań :
taki pseudo sql: insert from tab1 into tab2 (where rows_from_tab2 not in (select from tab1))
tab1: 10 mln wierszy
tab2: 5mln wierszy

query time: 2939754 (w sekundach :D), ponad miesiąc

RE
  • Rejestracja: dni
  • Ostatnio: dni
0

http://itvpdownloader.mmx3.pl/

Typ stworzył stronę internetową, której funkcjonalność to pełne trzy, cztery linie kodu (odkrywanie bezpośredniego linku do materiału wideo ze stron TVP). Ma nawet stronę na facebooku. Chwali się, że aplikacja chodzi w chmurze. Do jej stworzenia zaprzęgł framework, composer, który skompresowany zajmuje ponad 600kb.

Całą funkcjonalność można zawrzeć w jednej linii bookmarkletu: javascript:(function(){if(typeof(playVideo)===%22undefined%22)return;dojo.xhrGet({url:'/pub/stat/videofileinfo%3Fvideo_id='+playVideo.object_id,handleAs:'json',load:function(data){dojo.place('%3Cp%3EAdres%20pliku%20z%20filmem:%20%3Ca%20href=%22'%20+%20data.video_url%20+%20'%22%3E'+data.video_url+'%3C/a%3E%3C/p%3E','videoDebug','first');}});})();
Niecałe 350 znaków.
Ale nie mam fanpejdża i repo na githubie.

mmx3
  • Rejestracja: dni
  • Ostatnio: dni
0

Typ widzi. Zobacz komcia na wykopie :*

Azarien
  • Rejestracja: dni
  • Ostatnio: dni
0

Pół dnia zmarnowane nad Visual Studio 2012, dlaczego w jednym projekcie kod winapi działa, a w drugim nie, mimo dosłownie przekopiowania tych samych źródeł.
Przyczyna: VS2012 domyślnie kompiluje exeki dla Windows 8. Nawet jeśli nie używa się żadnych nowych funkcji, różne #define mogą wciągać zależności wymagające Windows 8.
Rozwiązanie:

Kopiuj
#define _WIN32_WINNT 0x601

żeby ograniczyć SDK do poziomu Windows 7.

MarekR22
  • Rejestracja: dni
  • Ostatnio: dni
0

Oto przykład jak nie powinno się robić aplikacji na telefon
Już zwykły notes jest bardziej użyteczny niż ta aplikacja.

Update:
@several: to porównaj sobie z "Jak dojadę" jak taka aplikacja powinna wyglądać.
Ta aplikacja pokazuje wyłącznie tabelki takie jak na przystankach to totalna żenada.
Sposób wyboru linii i przystanków to funkcjonalna klęska, a cza pokazywania tabelki z godzinami jest nie do przyjęcia.
Z telefonu, przecież można pobrać: godzinę, pozycję i na tej podstawie odszukać przystanek i listę autobusów w najbliższym czasie, zaplanować automatycznie trasę.
Na dodatek w tej aplikacji są błędy w lokalizacji, w wersji polskiej pokazują się niemieckie i angielskie wyrazy, a przecież wykonanie lokalizacji w Androidzie jest banalnie proste, a polski już błędów nie powinien zawierać.
A to jak synchronizuje się dane (założę się, że nie jest to baza danych), to też jest żałosne.
IMO przeciętny student informatyki napisałby lepszą aplikację.
Zresztą po ocenach widać jaka to klapa oficjalnej aplikacji MPK.

W0
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3759
0

Duży projekt w Javie, ja jako kontraktor w uznanej firmie, siedzę sobie grzecznie przy biurku i coś tam piszę...

W końcu sąsiad wyskakuje z pytaniem: "[imię]... A czy do Sety mogą trzymać nasze obiekty?"

adf88
  • Rejestracja: dni
  • Ostatnio: dni
Azarien
  • Rejestracja: dni
  • Ostatnio: dni
0

Zabrakło miejsca na C:.
Podczas szukania co by tu wywalić (tak na szybko zwolniłem 3 gigabajty) zauważyłem że plik wymiany pagefile.sys ma rozmiar 128 GB. Dokładnie, co do bajta – prawdopodobnie górny limit.

unikalna_nazwa
  • Rejestracja: dni
  • Ostatnio: dni
0

Na windows 8 po wyczyszczeniu "listy niedawno używanych elementów" na pulpicie pojawiła się bez pytania ikonka "Ostatnie miejsca" której nijak się nie da usunąć
Po sekundzie w googlach okazało się że to bardzo popularne zachowanie windowsa znane jeszcze z wersji siódmej i żeby się tej ikonki pozbyć trzeba utworzyć skrót do "Ostatnich miejsc" na pulpicie dzięki czemu zastępuje on tę ikonkę i skrót ten można następnie już normalnie usunąć...
Dla mnie mocny WTF, tak samo jak to że ten bug nie tylko nie został poprawiony ale przetrwał do kolejnej wersji windowsa :|

Koziołek
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Stacktrace
  • Postów: 6823
0

Rzecz dzieje się w kodzie aplikacji "da' b'g corpo". Język java...

Kopiuj
CorporationFormDelegate cf = corporationFormDelegateResolver.findDelegate(corporationData, variant);

        cf.handleSubmitForm(corporationData);

        if (cf == null || invalidCaptcha(response, request)) {
//...
            return;
        }

I tak w czterech czy pięciu miejscach...

  • Rejestracja: dni
  • Ostatnio: dni
0
Kopiuj
bWait.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent zdarzenia)
            {
                tInfo.append("Oczekiwanie na połączenie...\n");
                   new Thread(
                           new Runnable()
                   {
                       public void run(){
                        try {            konnect = 1;
 
                                         socket = server.accept();
                                          if(socket.isConnected()){
                                         tInfo.append("Nawiązano połączenie\n");
                                         ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
                try {
                    message = (String) ois.readObject();
                } catch (ClassNotFoundException ex) {
                     tInfo.append("Błąd odczytu wiadomości\n");
                }
 
            tMessage.append("Kient: "+message+"\n");}
                        } catch (IOException e) {
                                          e.printStackTrace();
                                                         }}
                   }).start();
 
            }
        });
 // wysylanie wiadomosci
        bSend.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent zdarzenia)
            {
                 if(socket.isBound()){
                try{
                        tMessage.append("Serwer: "+tSend.getText()+"\n");
                        ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
                        oos.writeObject(tSend.getText());
 
                   }catch (IOException e){ tInfo.append("Wiadomość nie została wysłana\n");}
            } else tInfo.append("Brak połączenia\n");
            }
        });

Ktoś usilnie próbował nazywać zmienne po angielsku. String message, Socket socket... int konnect xD

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.