Programistyczne WTF jakie Was spotkały

12

Selection_019.png
(To chyba akronim od ordersUsersItem, ale kto to wie :P)

6

Nie do końca programistyczne bo chodzi o zakup serverów z dotacji unijnych, ale Świętokrzyskie zażyczyło sobie 140% zabezpieczenia.

0

To chyba nie jest feature?
fakap.png

3

Dlatego właśnie nie lubię TypeScriptu, i ciężko mi uwierzyć, że pisanie 20 razy tego samego oraz tracenie ponad 300 linijek kodu na tego typu deklaracje (te i inne, nieco mniej dziwne), może zwiększyć produktywność bądź czytelność. Toż to wygląda jak kawałek choinki, a nie jak ładny kod XD
screenshot-20170919230632.png
źródło: helper do obsługi RPC w VSCode https://github.com/Microsoft/vscode-languageserver-node/blob/master/jsonrpc/src/main.ts

inna sprawa, co ten kod w ogóle robi. Wygląda jak jakaś pokraczna emulacja function overloadingu.

0

Jak zrobić komuś dowcip R:

`(` <- function(e1) {
  if (is.numeric(e1) && runif(1) < 0.1) {
    e1 + 1
  } else {
    e1
  }
}
replicate(50, (1 + 2))
10

W sumie nie-programistyczne, ale dzisiaj na Oracle OpenWorld zobaczyłem slajd ze swojej prezentacji, podpisany "Copyright (C) 2017 Oracle. All rights reserved". Slajd na tyle brzydki i charakterystyczny, że nie da się powiedzieć, że zrobili taki sam niezależnie. Nawet kolorów nie zmienili. WTF Oracle, chcesz się bić w sądzie? :D

1

Jest sobie firma tworząca strony internetowe oparte o ich własny CMS. Ich twór ma domyślnie zdefiniowane na sztywno konto "super admina", którego hasło jest w pliku konfiguracyjnym (hash :)).

Sęk w tym, że te dane nie są nigdy zmieniane. Nawet jak odchodzi pracownik, który zna ów magiczne hasło. Wyobraźcie sobie XXX stron z dostępem do panelu po takim samym loginie i haśle. Teoretycznie w tym momencie ktoś może się zalogować i pobrać dane tysięcy klientów jakiejś tam firmy, która zdecydowała się na powierzenie realizacji firmie o której jest post. Nic tylko czekać aż ta bańka pęknie.

Kwalifikuje się na WTF?

0

Wielki powrót do delivery, czyli znowu programuję. Przy czym programuję to za dużo powiedziane. Klikam w narzędziu Webmethods. Tl;dr WM to taki jebitny serwer integracji usług z BPMem, własnym językiem i implementacjami w .not, Javie i cpp. Na razie wygląda niegroźnie? To lecimy dalej. Oczywiście by coś tam napisać, to musimy potraktować narzędzie jako framework i zaimplementować jakieś interfejsy. No właśnie w Javie mamy interfejsy, więc możemy je implementować…

Jest jednak małe ale, które buduje clou tego WTF-ka… otóż implementacja nie opiera się na interfejsach, a na metodach statycznych:

public final class tst_javaService_SVC

{

	/** 
	 * The primary method for the Java service
	 *
	 * @param pipeline
	 *            The IData pipeline
	 * @throws ServiceException
	 */
	public static final void tst_javaService(IData pipeline)
			throws ServiceException {
		
	}
	
	// --- <<IS-BEGIN-SHARED-SOURCE-AREA>> ---
	
	// --- <<IS-END-SHARED-SOURCE-AREA>> ---
}
1

Przy zamawianiu klient musi zaznaczyć trzy zgody. Jedną z nich jest zgoda marketingowa. Zostałem poproszony, żeby wyciągnąć z bazy wszystkich klientów, którzy wyrazili zgodę marketingową. Co robie?

Intuicyjnie otwieram tabelkę users i rozpoczynam poszukiwania kolumny, która może trzymać tą wartość. Udało mi się znaleźć tylko jedną kolumnę zatytułowaną "agreements". Okazało się, że każdy agreement ma przypisaną wartość, odpowiednio: 1, 2 i - zgoda marketingowa - 4. W kolumnie agreements jest trzymana suma tych liczb.

Teraz jeżeli chcę wyciągnąć ludzi, który zaznaczyli zgodę marketingową, to wystarczy zrobić:

WHERE agreements IN (5, 6, 7);

Sprytne, ale troche mnie zdziwiło to podejście :)

9

Taka tam ciekawostka z wczoraj, kolejny raz z kategorii tego się nie da zdebugować, java sie popsuła!!11, które jak zwykle jest kategorią nie rozumiem jak działa X ale sobie użyje, kto bogatemu zabroni?!.

Do systemu wysyłany jest spory zestaw requestów do przetworzenia, co powinno wykonac się wzlgędnie szybko. W praktyce jest jakaś totalna zmuła i z logów wynika, że przetworzenie jednego requestu zajmuje wyjątkowo długo. Dodatkowo w logu są wyjątki z timeouta na oczekiwaniu aż elasticsearch zaindeksuje nowe dane z requesta. Ten check na elasticsearch jest robiony przez CompletableFuture, bo można tam wygodnie zrobić to z timeoutem.

Początkowo myślałem że moze to elasticsearch coś zaćpał (ostatnio zmienialiśmy wersje), ale z konsoli widać że dane momentalnie się zaindeksowały, a mimo to widze stacktrace że oczekiwanie aż sie zaindeksuje dostało timeout. Przyglądając się powoli jak wylgąda kod do obsługi requestów zobaczyłem wreszcie coś w stylu:

requests.parallelStream().forEach(this::handle);

I tu był pies pogrzebany, bo powodowało to oczywiście deadlock w połączeniu z CompletableFuture które było wołane przy okazji handle().

Dla nie Javowców: paralellStream domyślnie korzysta ze specjalnej wspólnej puli wątków do przetwarzania danych. Z tej samej wspólnej puli korzystają wszystkie równoległe strumienie w aplikacji, a także między innymi CompletableFuture. Efekt był taki że dla duzej liczby requestów pula wątków była cała zajęta tymi requestami, a jednocześnie każdy request indeksował coś w ES i czekał aż się zaindeksuje, za pomocą CompletableFuture. Tylko że ten CompletableFuture musiał czekać na wolny wątek w puli, który się nigdy nie pojawiał, bo mieliśmy klasyczny deadlock. Ale był tam timeout, więc co jakiś czas lecia timeut exception i jeden request się "odblokowywał".

Guidline dla parallel stream jest taki, zeby używać tego jeśli przetwarzamy coś co wykonuje się szybko i na pewno nie blokuje (oraz kolejność nie ma dla nas znaczenia), ale tutaj ktoś nie zdawał sobie z tego sprawy i kierował się logiką z serii ooo równolegle to będzie szybciej! :) No akurat okazało się że wcale szybciej nie było. Oczywiście mozna to też puścic w dedykowanej puli wątków, ale znów ktoś musiałby doczytać jak.

0

Jak w łatwy sposób zawiesić program?

  void OpenDatabase()
        {
            string connectionString = "Data Source=10.10.2.1/SQL;Initial Catalog=ERP;User ID=sa;Password=pass;Connection Timeout=0";

            SqlConnection sqlConnection = new SqlConnection(connectionString);
            try
            {
                sqlConnection.Open();

            }
            catch (Exception ex)
            {
                MessageBox.Show("Can not open connection ! ");
            }
        }

Ważną rolę odgrywa tu /

7

Widziałem jak pewien programista miał napisać funkcje z opcjonalną flagą bool (która domyślnie miała być true). Napisał to tak:

function (flaga) {
  coś.zrób({
    klucz: flaga || true 
  });
} 

Powiedziałem mu że średnia ta funkcja, bo gdy ktoś przekaże flagę false, to i tak klucz będzie true. Złapał się za głowę i przerobił na to:

function (flaga) {
  coś.zrób({
    klucz: flaga && true 
  });
} 

4 lata doświadczenia -.-

kto normalny pisze && true.

Ps: tymbardziej że ta poprawiona flaga nie będzie miała defaultowo true tak jak powinna mieć, tylko i tak false. :/

0

Właśnie widze metode która zwraca Optionala od Stringa a ten String pochodzi z łączenia listy stringów znakiem ";". Co lepsze ten Optional jest zwracany z metody addCos tam xDDDDDDDD

6

Dobre przewodniki robi ten Atlassian na conflu
screenshot-20171027164354.png

5

Kod od Intercity https://bilet.intercity.pl/irez/js/irez.js :D
Ciekawy przykład z kodu:

    for (i = 0; i < dlugosc; i++) 
    {
        if (wyraz.charAt(i) < "A" && wyraz.charAt(i) != "-" && wyraz.charAt(i) != " " && wyraz.charAt(i) != "." && wyraz.charAt(i) != "&" && wyraz.charAt(i) != "_" && wyraz.charAt(i) != "0" && wyraz.charAt(i) != "1" && wyraz.charAt(i) != "2" && wyraz.charAt(i) != "3"  && wyraz.charAt(i) != "4" && wyraz.charAt(i) != "4" && wyraz.charAt(i) != "5" && wyraz.charAt(i) != "7" && wyraz.charAt(i) != "8" && wyraz.charAt(i) != "9") 
        {
            if (polska_litera(wyraz.charAt(i)) == 0)
                return NO;
        }
        if (wyraz.charAt(i) > "Z" && wyraz.charAt(i) != "-" && wyraz.charAt(i) != " " && wyraz.charAt(i) != "." && wyraz.charAt(i) != "&" && wyraz.charAt(i) != "_" && wyraz.charAt(i) != "0" && wyraz.charAt(i) != "1" && wyraz.charAt(i) != "2" && wyraz.charAt(i) != "3"  && wyraz.charAt(i) != "4" && wyraz.charAt(i) != "4" && wyraz.charAt(i) != "5" && wyraz.charAt(i) != "7" && wyraz.charAt(i) != "8" && wyraz.charAt(i) != "9") 
        {

            if (wyraz.charCodeAt(i) > 188)
                continue;
            else
            {
                if (polska_litera(wyraz.charAt(i)) == 0)
                    return NO;
                else
                    continue;
            }
        }
    }
1
#include <stdio.h>
#define CHAR_BIT 8

/* This function will return absoulte value of n*/
unsigned int getAbs(int n)
{
int const mask = n >> (sizeof(int) * CHAR_BIT - 1);
return ((n + mask) ^ mask);
}

/* Driver program to test above function */
int main()
{
int n = -6;
printf("Absoute value of %d is %u", n, getAbs(n));

getchar();
return 0;
}


źródło: http://www.geeksforgeeks.org/compute-the-integer-absolute-value-abs-without-branching/

18

Cały obecny projekt, do którego dołączyła niedawno moja firma i do którego zostałem przydzielony, to jeden wielki WTF. Uprzedzę, że wszystko powstało w UK, żaden hinduski ani inny tego typu team nie maczał w tym palców.

Cały backend napisany jest w C++/CLI. desktopowa appka to WinForms w VB, a webowa appka to C# (i chyba czasami VB) i WebForms. Do tego część podprojektów w .NET 2.0, część w 3.5. Ale to jeszcze nie jest tragedia, w końcu w starszych technologiach też da się pisać dobry kod. Jednak cały kod w C++ jest proceduralny. Klasy są tylko w kilku miejscach.
Do tego mniej więcej 1/3 kodu to jest kopiuj-wklej. Ale kiedy robiąc zadanie trafisz na miejsce gdzie musisz dodać taki sam fragment kodu to nie możesz wydzielić go chociażby do osobnej funkcji - koledzy z UK zawsze wtedy każą cofnąć zmianę i skopiować kod tak jak wszędzie jest zrobione.

Cały backend opiera się na ich "ORMie", ich systemie do wiadomości, ich "frameworku" do unit testów. Żadnej biblioteki, którą jest szansa znać.

Framework do testów to po prostu opakowane rzucanie wyjątków, kiedy wartości się nie zgadzają i wypisywanie wyników w konsoli/pliku - nie da się uruchomić pojedynczych testów. Ale to nie problem, bo nie da się też napisać w ogóle testów jednostkowych - jakikolwiek test wymaga postawienia całej bazy i systemu. Cały system ma w konsekwencji może z 200 testów, bo nikt ich nie pisze.

ORM to po prostu w 95% wygenerowane wartości const/static w pliku .h i operowanie na obudowanych przez #define intach. W ogóle wszystko w aplikacji to int z #define albo string. Każda tabela i kolumna w bazie wymaga wygenerowania kodu C++. Kod jest generowany za pomocą SQLa.

Kod z eventami dla frontendu też jest generowany. Więc po dodaniu kontrolki w ich edytorze (wszystkie widoki są trzymane w bazie danych i opiera się o edytor dla admina aplikacji) trzeba zatrzymać aplikację, uruchomić skrypt, który wygeneruje nowe pliki, skopiować wygenerowane pliki do folderu, gdzie cała struktura jest kopią tego poprzedniego i dopiero pisać kod. W trakcie kompilacji kod z plikami specyficznymi dla klienta jest nakładany na kod wspólny dla wszystkich klientów ale edytowany i całość jest nakładana na kod wygenerowany. Wszystko opiera się o replace na źródłach i dyrektywy w kodzie. Wynik jest taki, że np. numery linii w błędach kompilacji nie mają nic wspólnego z numerami linii w IDE.

Jest też SDK, na którym się opiera już docelowa aplikacja. Tam natomiast jest ciekawe wykorzystanie plików h z C++. Zwykle mając klasę ma się pliki klasa.h i klasa.cpp. Tutaj zastosowali wyższą sztukę i są pliki klasa.h i klasa_Methods.h. Całość wymaga ręcznego includowania i skryptów do kompilacji.

Do tego cały dostęp do danych opiera się o trzymanie stanu aplikacji w globalnym buforze i ewentualne dociąganie/usuwanie fragmentów tego stanu za pomocą wiadomości wysyłanych do serwera. Zmieniając jakąś wartość mamy mniej więcej 0% pewności, że coś się przez to nie popsuje w innym miejscu aplikacji tylko dlatego, że zmieniliśmy stan akurat w tym, a nie innym widoku. Wspominałem już, że logika biznesowa jest podzielona na logikę po stronie klienta i logikę po stronie serwera, które w dodatku czasami siedzą w jednym pliku i tylko za pomocą dyrektyw w C++ jest wybierane, który fragment będzie skompilowany dla serwera, a który dla klienta?

Wszystkie dropdowny w aplikacji mają wartość zwracaną w jednym ogromnym switchu. Dodając nowy dropdown trzeba sprawdzić jaki nr miał ostatni dodany, dodać większy, dopisać metodę zwracającą listę i użyć jej w switchu, który ma w tym momencie ponad 1000 caseów.

Nie ma również żadnych migracji bazy danych. Jest tylko skrypt tworzący bazę, do którego dopisuje się zmiany. Potem reszta zespołu po prostu musi się domyślić, że się baza zmieniła. Jak wygląda migracja na produkcji? Jest osoba, która za pomocą narzędzia do porównywania schematów bazy ręcznie migruje tabele i dane.

Na początek tyle. Ale to dopiero wierzchołek tego wspaniałego projektu ;) Wspomnę tylko na koniec, że jest to system dla kilku banków. Dołączyliśmy do projektu bo obecny team już nie potrafił się zmieścić w żadnym realnym terminie z zadaniami i mamy wyprowadzić całość na prostą. Jedyny plusik jest taki, że jeżeli tylko będą się opierać zmianom, które proponujemy to szybko kończymy współpracę, a jeśli będą posłuszni to jest to ciekawe doświadczenie i wyzwanie, żeby to naprostować nie orając i przepisując jednocześnie całości od razu.

Edit: jak będzie zainteresowanie to mogę więcej kwiatków zapodać bo to jest bezdenna studnia „dobrych” pomysłów.

8

W najnowszym Windows 10 “Fall Creators Update” przy wysokim DPI kaszani się… opcja do ustawiania obsługi wysokiego DPI.

Bez tytułu.png

Fail…

1

Okienko logowania systemu mint przy uruchomieniu systemu ma ustawionego focusa na przycisk "OK" zamiast na pole gdzie mam podać hasło.

Jedynym celem tego okienka jest wpisanie hasła, ale ktoś zadecydował, że focus powinien być na przycisku.

0

@dzek69:
@okmanek:
4.4.0-21-generic #37-Ubuntu SMP Mon Apr 18 1837 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
17.3 updatowane do 18.1 i później 18.2 Cinnamon 64-bit
Manager jakiś domyślny - nie wiem jaki, nie dotykałem

Jeżeli wam to działa, to widać, nie jest to planowany wtf tylko zwykły błąd

1

Szukam kodu aby przed snem sobie poczytać , i padło na SQLite pod .NET'a.
Wchodzę na githuba, a tam 3 pliki :)
https://github.com/praeclarum/sqlite-net/tree/master/src

Polecam rzucić okiem na SQLite.cs

0

Nie do konca programistyczne ale:

Pozyczylem sobie od brata pada do Xboxa. Podlaczylem do PC. Dziala. Chwilke pogralem i co? I ZONK nie da sie wylwaczyc pada manualnie w cywilizowany sposob. Albo trzeba sciagac dodatkowy program, albo wyciagnac baterie na chwile :O

11

Chmm...

unin.png

3

screenshot-20171116212620.png
Fajnie, że we have już so much Members!
#meetup.com

5

Cyfrowy Polsat i ich dekoder (PVR HD 7000) – ostatnio była aktualizacja systemu, czego efektem jest m.in. interfejs w stylu metro. Paskudny, praktycznie jednokolorowy (czarne tło i biały tekst) i nieintuicyjny. Jednak sam interfejs nie jest jeszcze takim WTF-em, jak obsługa z poziomu pilota.

Otóż przed aktualizacją, przycisk służył do zamykania okienek menu, a przycisk umożliwiał powrót do poprzednio aktywnego kanału. Po aktualizacji, przycisk nie posiada żadnej funkcji (serio), a albo zamyka menu (jeśli jest otwarte), albo cofa do poprzedniego kanału (jeśli żadne okno menu nie jest wyświetlone). Po ch… intuicyjne.

7

Sprawdzanie ról użytkownika w baaardzo starym webserwisie:

ws.Session["iCanChange"] = "o nie nie";
8

W jednym z projektów w firmie można ustawić taką oto opcje przy zamykaniu buga :)
screenshot-20171127164057.png

0

https://www.pracuj.pl/praca/software-engineer-krakow,oferta,5675653

Takich wymagań w sekcji "Szukamy osób, które" zupełnie się nie spodziewałem ;)

5

Pracuje w tym tygodniu z domu. Lacze sie zdalnie do maszyny w biurze. Dzisiaj poranna niespodzianka, probuje sie zalogowac -> nic z tego. Po ilus tam probach wpadlem na to ze pani sprzatajaca wlaczyla mi wczoraj niechcacy Caps Locka i juz bylo z gorki. Chwila szukania i okazuje sie ze caps locka mozna bez problemu wylaczyc pozniej np. przy uzyciu wirtualnej klawiatury.

5

Fiddler dla Mac OS.
Instrukcja "Instalacji" na Mac OS wygląda tak:

  1. If you don’t have the Mono framework installed on your MAC, please, download it from http://www.mono-project.com/download/#download-mac and install it. If you already have it installed, please, update it to latest.
  2. If you just installed Mono, please open Terminal and type in
    /Library/Frameworks/Mono.framework/Versions/<Mono Version>/bin/mozroots --import -- sync (The Mono framework has its own trusted root certificates store. Currently (at mono version 4.2.4) this store remains empty after installing Mono on Mac OS X. Fiddler uses the certificates in this store to validate the certificates of the websites visited. So you need to populate this store with a set of commonly trusted root authorities to avoid getting constant certificate warnings by Fiddler. The mozroots tool imports trusted authorities from the Mozilla LXR. )
  3. Extract fiddler-mac.zip to a folder you have write access to. It is recommended that the full path to Fiddler install folder does not contain any Windows path illegal characters. (At present it is possible that some Fiddler functionality, e.g. various file exports or Fiddler Script won’t handle such paths.)
  4. Open Terminal and navigate to the folder from 3.
  5. Type mono Fiddler.exe in Terminal.

Cena?

2,999* per application, per year

*License Renewal cost after the first year is $1,499.

2 użytkowników online, w tym zalogowanych: 1, gości: 1