Na forum 4programmers.net korzystamy z plików cookies. Część z nich jest niezbędna do funkcjonowania
naszego forum, natomiast wykorzystanie pozostałych zależy od Twojej dobrowolnej zgody, którą możesz
wyrazić poniżej. Klikając „Zaakceptuj Wszystkie” zgadzasz się na wykorzystywanie przez nas plików cookies
analitycznych oraz reklamowych, jeżeli nie chcesz udzielić nam swojej zgody kliknij „Tylko niezbędne”.
Możesz także wyrazić swoją zgodę odrębnie dla plików cookies analitycznych lub reklamowych. W tym celu
ustaw odpowiednio pola wyboru i kliknij „Zaakceptuj Zaznaczone”. Więcej informacji o technologii cookie
znajduje się w naszej polityce prywatności.
Co jest w niej nie tak? Ano tak się składa, że potrzebuję zawartość tej kolekcji skopiować. Jedyny dostęp do zasobów tej "kolekcji" jest przez indekser. Tak więc musiałbym znać dokładnie zawartość tej "kolekcji". Ręce mi opadły. A wystarczyłoby zaimplementować interfejs IEnumerable<KeyValuePair<....>>.
@KamilAdam: niby dlaczego brzydka łata? Enkapsulacja jest przydatna w wielu momentach. Ale przy projektowaniu klas, jak ze wszystkim, trzeba używać mózgu. To, że ktoś używa nierozsądnie, jak w przytoczonym przykładzie, nie oznacza, że sama technika jest zła.
Po kilku minutach obracania jakichś debilnych piesków za pomocą strzałek, które umieszczone są z nielogicznej d... strony zupełnie sprzecznie z intuicją. Piesków które należy ustawić pionowo, ale githubowe pionowo to najwidoczniej coś innego niż moje pionowo, bo w kółko system mi mówił, że przynajmniej jedna moja odpowiedź jest niepoprawna. Po kilku minutach takiego debilnego kręcenia psami udało mi się w końcu utrafić i odpowiedzieć zgodnie z oczekiwaniami systemu. I co wtedy zobaczyłam?
K... nic już więcej nie będę próbować, myślałam, że to jakiś serwis dla programistów a nie dla cyrkowców.
p.s. Chciałam im nawet napisać, że są skończeni kretyni, ale żeby im to napisać, trzeba najpierw poobracać pieski. Pieprzeni zoofile :p
@vpiotr: a i owszem ma :) całkiem zacną rzekłabym :) @dzek69 skoro firma daje ( tym bardziej za free ) to może warto się skusić? || Dokładnie :) chodzi o GitLab ( który btw też może być selfhosted ). Oprócz tego takie zapominajki jak Gitea, GitNow ( czy jakoś tak ).....
@Anna Lisik jakby dawali na własność to bym wziął, żeby sprzedać ;) A tak to nie widzę sensu. Na Makach spodarycznie pracowałem na uczelni - zupełnie mi nie podeszło. Wszystko "tak jak Pan Jobs powiedział" do tego zupełnie inne niż rzeczy znane od gówniarza z DOS/Windows/Linux. Strata czasu na przestawianie się i brak znanych zalet, dla których miałbym rozważać tę stratę czasu (w sensie co mi da Mak czego nie da mi cokolwiek na Win/Lin), za to znalazłoby się parę rzeczy, które stracę po zmianie. Nie przeczę, że inni się w tym odnajdą i skorzystają, ale ja nie.
@dzek69: zupełnie się nie zgodzę z brak innych zalet..... kup (nie trzeba od razu najdroższy model), poużywaj dłużej niż miesiąc jako jedyny sprzęt.... ciekawe co wtedy powiedziałbyś.....
„Przepraszamy za wysyłanie do Was wiadomości push w aplikacji. Prosimy, nie reagujcie na nie. Klikanie w powiadomienia powoduje spowolnienie działania aplikacji. Prosimy o chwilę cierpliwości. Mogą wystąpić również opóźnienia w połączeniach z call center” mBank Twitter
Istnieje już składnia do tworzenia lambd z ciałami: function ($arg) { ... }; duplikowanie jej z wykorzystaniem fn byłoby imo bez sensu. Nowa składnia została celowo od początku zaprojektowana jako skrót do function (...) { return expr; }, co jest wprost wskazane w RFC (https://wiki.php.net/rfc/arrow_functions_v2, sekcja Proposal)
@Patryk27: Niby tak, ale zauważ: np. w "długiej" funkcji trzeba użyć use żeby coś domknąć, a w lambdzie nie; w "długiej" funkcji można zrobić &$arg, a w lambdzie nie. Więc moim zdaniem, one są różnymi bytami, a nie dwoma składniami na jedną rzecz.
Niedawno dostałem do zrobienia małe zadanko w spadkowym projekcie.
Na wstępie zobaczyłem, że testy nie działają - już gdzieś o tym pisałem - w testach było odwołanie do fizycznego hosta (sprawdzenie DNS) ... a przykładowa domena wyparowała.
Podzieliłem się tą uwagą z programistą, który przede mną coś w tym projekcie grzebał. Podumał, podumał... i powiedział, że on by test po prostu oznaczył jako @Ignore, ale nie usuwał. Testy są wartościowe.
Powiedziałem, że usuwam, bo test był w sumie dość bez sensu i nie widzę szansy na sensowne zmienienie tego kodu. Mini kłótnia-dyskusja wyszła.
Kilka dni temu znowu dostałem do zrobienia zadanie w innym spadkowym projekcie (projekciku). W którym wcześniej grzebał ten sa programista - co za pech (od niedawna jest w fimie) - zwróciłem uwagę, że testy dość szybko idą, a znałem już projekt... raczej był dość wolny (testy na fizycznie oddalonym oracle - bryndza).
I co wyszło: 3/4 testów ma wrzucone w ostatnich miesiącach @Ignore. Tadam!
Ale nie są wyrzucone. Bo testy są ważne.
Happy end jest taki, że 3 godziny zajęło mi przywrócenie do życia tych testów - (z 50 ich było) - nie taki duży wymiar kary.
@obscurity: racja, mój błąd wynika z tego że jak zaczęto robić grube klienty webowe to uciekłem najdalej jak się da. Nie lubię logiki biznesowej w dynamicznie typowanych językach. Takie zboczenie
Skoro nie każdy frontend jest klientem, to czego "frontem" jest ten front? :D i skoro nie każdy backend jest serwerem, to czego backiem jest ten backend?
Dlatego od zawsze powtarzam - żadnej walidacji. Użytkownik szczęśliwy, bo dane zawsze wchodzą, a programista nie musi się męczyć z opowiadaniem o tym. ;)
Do słuchania muzyki używam DACa po USB. W Foobarze wszystko działa ładnie, po ASIO czy WASAPI... ale nie w TIDAL. Po odegraniu pierwszego utworu przez DAC, kolejne puszczane są na domyślny w systemie sprzęt... mimo, że DAC mam wybrany w ustawieniach. W końcu za pierwszym razem zadziałał...
Można czasem się zdziwić kiedy na słuchawkach muzyka leci po cichu, żeby za chwilę wydobyć się z głośników...
katakrowa
Może to jest związanie z ASIO lub WASAPI bo te tryby jednak wymagają wyłączności dostępu do karty dźwiękowej. Być może ta aplikacja przeskakując na kolejny utwór ponownie reinicjuje sprzęt a tu okazuje się, że ma wciąż zablokowanego DAC więc bierze pierwsze lepsze kolejne wolne urządzenie. Samo XMOS też różnie działa w zależności od tego jaki ma wgrany soft. Jest dużo DAC'ów na XMOS, które są napisane zwyczajnie kiepsko.
PerlMonk
Korzystałem z Tidala w ramach oferty Play i tam nie było możliwości ustawienia trybu wyłączności. Teraz przełączyłem na konto z subskrypcją, ustawiłem tryb wyłączności i na działa. Nie wiem, może coś wtedy się pozajączkowało.
Tak przy temacie endianness przypomniał mi się smaczek z .neta: klasa System.Net.IPAddress ma dwie metody NetworkToHostOrder i odwrotnie HostToNetworkOrder - funkcje te zamieniają inty z little endian na big endian i odwrotnie. Tu dam sekundę do namysłu...
Już?
Tak - obie funkcje robią to samo, a NetworkToHostOrder po prostu wywołuje HostToNetworkOrder
`https://github.com/microsoft/referencesource/blob/master/System/net/System/Net/IPAddress.cs#L539
Zamiast edukować devów, można ku ich uciesze po prostu zaserwować dwie funkcje robiące to samo
Zobacz pozostałe 6 komentarzy
Shalom
Wiadomo ze rzutują typy, ale jak ktoś przyszedł z asemblera to czymże jest typ? :P
@Shalom: czymże jest typ kiedyś usłyszałem że są to zbiory bez przecięć, bo przecież coś nie może być Intem i Stringiem jednocześnie po czym myślałem o tym przez tydzień i doszedłem do wniosku że przecięcia są, bo coś może jednocześnie implementować typ Number i CharSequence, czyli mamy przecięcie. Więc dalej nie wiem co to są typy :D
Zespół odpowiedzialny za nasz pythonowy framework do testów funkcjonalnych umiłował sobie asyncio. Async / await wszędzie ... pewnie myśleli, że będzie działać szybciej.
A w kodzie testów kwiatki. (Testów pisanych przez innych ludzi, niż Ci odpowiedzialni za framework.)
Przykładowo - ktoś tworzy nowe corutyny startujące serwer https i nigdy nie wywołuje await. Kiedy to się wykona? Czy serwer https zdąży wstać przed próbą połączenia się? No przecież wywołanie zakolejkowanie funkcji (asynchronicznej) jest przed próbą połączenia się więc pewnie zdąży... W dodatku przez asyncio.create_task, będzie dobrze. Niespodzianka - testy niedeterministycznie failują ... no ciekawe dlaczego.
Powinni mi dopłacać za naukę programowania dla testerów :D
@superdurszlak: ja miałem przyjemność pracować z takimi frameworkami. Unikam jak ognia. Jeżeli zmuszą cię do używania, to estymowanie najprostszego taska staje się prorokowaniem - nikt nie wie na jakie bugi się natkniesz.
@part ja chcąc nie chcąc używałem, używam, bywało nawet że jakieś popełniłem - choć nie wiem, czy można było którykolwiek nazwać "aż" frameworkiem. Generalnie prędzej czy później robi się rak, choć jak się używa cudzego i/lub szpachluje ficzerami/narzędziami i obija paździerzem bez pojęcia co się robi, to prędzej. Na swoją marną obronę powiem, że wszystkie te zbrodnie popełniałem jako głupi stażysta i/lub głupi junior, ani razu nikt mnie w porę nie spróbował powstrzymać i na ogół sam byłem główną ofiarą tych potworków...
Ja tu widzę problem z async, to samo widziałem w C# wielokrotnie. Ludzie myślą, że tu wstawią async, tam raz na jakiś czas await i nagle będzie działa się magia, a potem wątki się blokują, wszystko działa niedeterministycznie, w kodzie syf i pozostaje dłubanie w zrzutach pamięci. Osobną kwestią jest to, że async/await są skopane, ale ukrywają te wady za "prostym" słowem kluczowym i programiści nie są tego świadomi.
@Afish: Niestety, jak ktoś nie rozumie jak coś działa i nie wie co robi, to uproszczenie poprzez ukrycie trudnych szczegółów mu nie pomoże. Jeszcze jak rozmawiałem z tym testerem, to mu pokazałem inny fragment, gdzie używa asyncio.sleep i mu mówię, że funkcja będzie usunięta bo jest deprecated. Na co on odpowiedział, że zastąpi time.sleep ... tylko time.sleep blokuje cały wątek, a nie corutyne :D
Projekt finansowy w Javie, który trwał ze dwa lata i końca nie było widać, osoby, które go robiły trzymały datę w integerze i jakoś na tym operowali, do tej pory nie wiem jak.
Trzymanie daty w int nie jest nowością. W wielu starszych systemach datą 0 jest 1 stycznia 1900r. Jeżeli potrafisz wyliczyć aktualną datę, mając liczbę np. 44444, to jest to „tańsze” niż użycie pamięci na bardziej złożoną strukturę.
w wielu systemach trzymanie daty w typie calkowitym to norma bo jest to po prostu wygodniejsze, abstrakcje czasem bardziej psuja niz pomagaja. o ile kodowanie ma sens to nie widze problemu
Shalom
@katelx: szczególnie jak wszystkie czasy są trzymane jako jakiś UTC epoch i nie trzeba robić cudów na kiju z przeliczaniem timezone żeby porównać coś.
Może nie programistyczne WTF, ale dziwaczny pomysł, UX WTF.
Jeśli wejdziecie na jakikolwiek artykuł na https://www.onet.pl/ i zaczniecie skontrolować do samego dołu, to przeniesie was na główna stronę.
Np tu.
Na Onecie mi nie działa, ale podobnie jest na to zaimplementowane Filmwebie, wejdźcie sobie na dowolny film, np.: https://www.filmweb.pl/film/Megalodon-2018-808076 i przewińcie na sam dół. I jeszcze URL się zmienia w pasku - koszmar!
EDIT: Adblock musi być wyłączony by to działało.
u mnie po prostu ląduje się strona domowa i mogę cofnąć. Używam FF z uBlock. Filmweb dynamicznie doładowuje końcówkę strony, ale mnie nie przenosi nagle do głównej jak docieram do końca.
no faktycznie - teraz działa. Wygląda że chrome nie ogarnia dobrze przekierowań - jak otworzę w nowej karcie z czystą historią i szybko przewinę to 1/3 razy się nie da wrócić. Jeśli strzałka wstecz była już aktywna wcześniej to można. Bug w przeglądarce albo w skrypcie
Może nie programistyczne WTF, ale dziwaczny pomysł, UX WTF.
Jeśli wejdziecie na jakikolwiek artykuł na https://www.onet.pl/ i zaczniecie skontrolować do samego dołu, to przeniesie was na główna stronę.
Na Temat ma podobne rozwiązanie. Doczytuje kolejne artykuły i jeszcze zmienia adres strony w URL, co gorsze, jak się przewiniesz z powrotem na górę, to nie przywraca oryginalnego adresu, więc, jak chcesz np. dodać arta do zakładek, to musisz otworzyć ją jeszcze raz od zera. Greasemonkey’em to sobie blokuję.
U mnie na FF z uBlock, po prostu przeskakuje na stronę domową jakbym ją kliknął. Mogę się normalnie cofnąć. To nie jest dynamiczne doczytywanie strony. Wyłącznie UBlock nic nie zmienia.
Do czego jeszcze używasz Greasemonkey? Pytam w kontekście walki z chamskimi zagrywkami twórców stron. Ostatnio dodaję dużo własnych filtrów w uBlocku, ale niestety nie wszystko można tam zrobić.
Różne strony z tego korzystają.. ile to razy coś czytałem i jak już dotarłem na koniec, to kopiowałem adres strony by posłać dalej.. tylko po to, by zorientować się, że wysłałem adres do innego artykułu. Taka funkcjonalność to, zaraz za popupami z ciasteczkami, największa zakała obecnego Internetu.
I przewijanie bez końca. Wchodzę na stronę główną, wybieram artykuł i czytam. Zjeżdżam na koniec a tam kolejne artykuły. Nosz kurde, gdyby nie nagłówek, można by się nie połapać.
fajnie jak tak jest w sklepach internetowych gzie na dole szukasz regulaminu.....ooops bez obejrzenia całej listy regulaminu nie znajdziesz
PerlMonk
Pół biedy jak strona się wygenerowała i klawisz END się sprawdza. Gorzej kiedy cieszysz się, że widzisz koniec strony a tu doładowują się kolejne elementy listy i koniec odjeżdża...
jeszcze gorzej jak autorzy strony zapomnieli że mają przewijanie bez końca a jednocześnie umieścili informacje które Cię interesują (np "kontakt" albo "regulamin") w stopce. // a już to ktoś napisał w komentarzu ups :)
vpiotr
Stopka sropka. Nie będzie designer pluł nam w twarz.
Współczesny UX to kompletny rak.
Wtf na OLX (nie chodzi o UX, bo tego chyba nie trzeba komentować): https://www.olx.pl/oferta/rolnik-bigos-wiejski-z-kielbasa-CID757-IDG1Cgq.html#c75d19814e
na końcu linku dodaje jakieś cholerstwo #c75d19814e, które nie jest zawsze takie samo dla danej oferty. Przy obserwowaniu wielu ofert i używaniu zakładek robi się problem - nie wiadomo czy już masz tą ofertę w zakładkach, czy nie.
Część po hashu według standardu HTTP nie jest częścią URL, nawet klasy URL w jakiejś javie czy C# nie uwzględniają jej przy porównaniu (przykład dla dotneta https://dotnetfiddle.net/59bp8Q ). Jeżeli gdzieś psuje Ci to zakładki, to według standardu coś "robi to źle", ale OLX tutaj akurat ma dobrą wymówkę.
Do czego jeszcze używasz Greasemonkey? Pytam w kontekście walki z chamskimi zagrywkami twórców stron. Ostatnio dodaję dużo własnych filtrów w uBlocku, ale niestety nie wszystko można tam zrobić.
W sumie mało go używam.
Na Allegro, żeby odkręcić debilne lazy loading i nie czekać jak kretynka po każdym przesunięciu strony, aż mi się łaskawie docztają:
Kopiuj
/* --- pokaż obrazki --- */
var images = document.getElementsByTagName('img');
for(var i = 0; i < images.length; i++) {
var src = images[i].getAttribute("data-src");
/* --- jeśli lazy --- */
if (src !== null) {
images[i].src = src;
console.log(src);
}
/* --- /jeśli lazy --- */
}
/* --- /pokaż obrazki --- */
Globalnie na różnych stronach, żeby nadpisać / wyłączyć niektóre funkcje JS
Kopiuj
// --- blokuj manipulacje
// wykryj copy
document.oncopy = event => {console.log('wykryto oncopy');}
// blokuj srocllTo
window.scrollTo = function () {console.log("zablokowano scrollTo");}
// blokuj onbeforeunload
window.onbeforeunload = function () {console.log("zablokowano onbeforeunload");}
// blokuj pushState i replaceState
history.pushState = function () {console.log("zablokowano pushState :>");}
history.replaceState = function () {console.log("zablokowano replaceState :>");}
// --- /blokuj manipulacje
// --- zachowaj tytuł
function przywroc_tytul() {
if (document.title!=st_tytul_org) document.title = st_tytul_org;
}
st_tytul_org = document.title;
var st_tytul_el = document.getElementsByTagName("title")[0];
var st_dokument_el = document.documentElement;
if (st_dokument_el && st_dokument_el.addEventListener) {
st_dokument_el.addEventListener("DOMSubtreeModified", function(evt) {
var t = evt.target;
if (t === st_tytul_el || (t.parentNode && t.parentNode === st_tytul_el)) przywroc_tytul();
}, false);
} else {
document.onpropertychange = function() {
if (window.event.propertyName == "title") przywroc_tytul();
};
}
// --- zachowaj tytuł
Na naTemat, żeby przywrócić treść arta, którą pokazywali na chwilę, żeby zaraz ukryć, jeśli miałeś AdBlocka (ale już chyba zrezygnowali z tego mechanizmu):
Kopiuj
// --- /blokuj bloker adbloka
function przywroc() {
document.getElementsByTagName("BODY")[0].innerHTML = "a " + html;
}
function test() {
var qp = document.querySelector(".questo-paywall");
if (qp) {
clearInterval(testuj);
//html = document.getElementsByTagName("BODY")[0].innerHTML;
html = document.getElementsByTagName("BODY")[0].innerHTML;
}
setTimeout(przywroc, 5000);
}
testuj = setInterval(test, 100);
// --- /blokuj bloker adbloka
Coś takiego może zabić niektóre zamulające strony, ale może też zabić niezbędne do funkcjonowania skrypty np. w banku:
Kopiuj
// --- zakończ ładowanie każdej strony po 15 sekundach --
setTimeout(function(){
window.stop();
console.log("GM - zatrzymao ładowanie www"+" <- "+gm_strona_adres);
}, 15000);
// --- /zakończ ładowanie każdej strony po 15 sekundach --
No i mam jeszcze jakiś zewnętrzny, dawno nie aktualizowany Anti-Adblock Killer | Reek
@Marooned: @somekind: są już takie grupy (zależnie od silnika) \p{Cyrlic}. @stivens nie wbrew intuicji, a zwyczajnie definicja tego co jest "znakiem w słowie" potrafi się różnić między językami, więc nie da się specjalnie określić co miałoby w tym się zawsze zawierać. Dodatkowym powodem jest wydajność, dopasowanie po samym ASCII (1 byte) można zoptymalizować zdecydowanie bardziej (np. używając SIMD) niż jeśli musimy uwzględniać cały Unikod.
@hauleth: kiedyś walczyłem z hebrajskimi, w PHP i pamiętam, że {hebrew}mi nie działało - nie łapało jakichś znaków. Skończyło się na ręcznym dodaniu alfabetu.
Przed chwilą:
Odpalam skanowanie kodu pod kątem {czegoś}.
Wchodzę na stronę {czegoś} aby zobaczyć raport ze skanowania, ale wita mnie alert o błędzie, który jest niemożliwy do odczytania w przeglądarce ani w debugerze firefoxa.
Zapisuje stronę na dysku.
Otwieram ją edytorem, patrzę "query timeout".
Łapie WTF?! patrząc na ~45000 linii zapytania sql
To bardza stara historia - rok 2001
Zgłasza się do mnie kolega i mówi, że jest taki projekt na weekend - dobrze płatny, tylko kolejny już programista po zobaczeniu co jest do zrobienia stwierdził, że ... p... nie robi.
Brzmi ciekawie.
O co chodziło - była jakiś soft zbierający dane pogodowe (temperatura, ciśnienie, poziom wody w rzece...itp) do bazy danych (interbase).
I trzeba było tylko napisać program, który dla zadanego okresu czasowego - np. 1.06.2001 - 1.07.2001 wyciągnie dane z bazy i wstawi je do XML.
XML był dobrze i jasno zdefiniowany.
Baza danych - gorzej. Zleceniodawca dysponował tylko kilkoma screenshotami z aplikacji i zrzutem bazy danych. Wiadomo było, że dane w bazie są, tylko nikt nie mógł zrozumieć jak je wyciągnąć. Coś tam było bardzo średnio.
Ciekawe.
Bierzemy.
Zniszczyłem sobie weekend - ale warto było (wtedy 1.5k pln to było coś).
Była zasadniczo jedna tabela, która miała kolumny
ROW| C0, C1,C2,C3... C7
widać było, że w tych kolumnach sa dane meteo... tylko ładu i składu to nie miało.
były tam dane, które wyglądały na timestamp - ale pojawiały sie w losowych kolumnach,
tak samo temperatura,
ciśnienie - po prostu - wartości typu 10-27 (temperatury) były rozstrzelone po wszystkich kolumnach,
podobnie ciśnienie 900-1100, widać, ze jest w bazie, można znaleźć wyniki jak na screenshotach, ale w zupełnie różnych kolumnach - zero sensu. Co jakiś czas w kolumnach pojawiało się coś co ewidentnie było timestampem.
I do tego jakieś magiczne numerki.
I wtedy zrozumiałem. Chyba pomogły mi lata spędzone na walczeniu o bajty w C64.
Dane były zorganizowane tak:
numer czujnika, data, rodzaj pomiarów:
2- temperatura i ciśnienie,
3 - temperatura, ciśnienie, wiatr,
6-temperatura, poziom wody itd. i teraz kolejne wyniki pomiarów.
z tym że to wszystko... wpakowane w wiersze i kolumny C0,... C7
Tak te dane były tak naprawdę strumieniowe i były wpakowane w tabelę w zupełnie absurdalny sposób. Trzeba było czytać kolumny C0 do C7, a po dojściu co C7 zacząć następny wiersz od C0...
Nie wiem co autorzy mieli na myśli - oszczędność miejsca?
W każdym razie - po odkryciu jak to jest zrobione - zadanie okazało się dość proste.
Oczywiście wyszukiwanie po dacie w tej tabeli było absurdalnie nieefektywne (nie pamiętam - ale pewnie zawsze jechałem od początku )
@alagner: no ja musiałem efektywnie iterować. Faktycznie nie wiem w czym był napisany oryginalny program, możliwe, że ta baza wspierała jakiś taki absurdalny rodzaj zapisu (strumień wpakowany w tabelę). ... ale raczej strzelam, że to kreatywność była.
vpiotr
Interbase to całkiem normalna baza danych wbrew pozorom, może na rynku pracy nie ma szału, ale z tego co pamiętam więcej WTF/h zaliczałem przy MySQL.
Pamiętam, że sterowniki jdbc do tego były zrypane - napisałem własny connection pool, który dbał o okresowe kill i wznawianie połączenia (bez tego były zwisy bez końca na wywołaniach jdbc).
vpiotr
Nie wiedziałem że to miało sterowniki do... JDBC(?) już tak dawno :)
Ale tam nie ma nic napisane, że odciski palca są gromadzone na serwerze (może tak jest, ale nie jest opisane). Piszą o tym, że są w warstwie elektronicznej dowodu osobistego, więc np celnik ma możliwość porównania odcisku palca z tym zapisanym w dowodzie osobistym i w ten sposób upewnić się, że dana osoba jest właścicielem dokumentu.
Ewentualnie porównać odcisk z paszportu (dowodu osobistego) z bazą osób poszukiwanych. Oczywiście o ile już działa wyszukiwanie na przejściach granicznych
problemem jest raczej skradziony paszport i ktoś się charakteryzujący się na właściciela. To jest standardowa metoda przemytu ludzi (poza statkiem przez morze śródziemne).
BTW nie wiem jak to teraz wygląda, ale jeszcze niedawno unia europejska tylko gromadziła odciski palców, ale nie potrafiła ich przeszukiwać w przejściach granicznych
WTF programistyczny to dziwny kod, albo baza bez indeksów. A tutaj to bym powiedział, że WTF odbył się na etapie zbierania specyfikacji albo zarządzania wymaganiami.
coś mi się wydaje, że nie ma gromadzenia odcisków palca na serwerze, ale można je porównywać z tym zapisanym na paszporcie, dlatego nie ma opcji wyszukiwania. Można tylko zweryfikować, że to twój paszport.
Nie do końca może ten wątek, ale lepszego nie ma...
tl;dr: Stary jestem a nadal głupi i dałem się zbaitować w pracy jak małe dziecko.
Ostatnio miałem mało developmentu w pracy, bo moje systemy sie nie psują, więc nie ma co supportować, a nowy projekt w którym jestem utknął na dość wczesnym etapie, bo nie możemy dojść do porozumienia z astrologami. Klepiemy tylko różne prototypy a oni je odrzucają :D
W międzyczasie brałem udział w review innego projektu który właśnie się zaczyna. Co tam się działo to w sumie historia na osobny wpis w tym wątku, bo pojawiły się tam takie pomysły jak np. wpięcie Kafki do frontendu, bo w wymaganiach jest że mają być event notifications no i ktoś wyczytał w internecie że Kafka jest od eventów... :D (dla jasności, oni chcieli osiągnąć taki efekt jak notyfikacje na 4p jak ktoś was zamałpuje czy coś). Moja reakcja była mniej więcej taka:
No i pojawiła się sugestia, że może bym im pomógł z tym projektem jakoś wystartować póki chwilowo mam trochę czasu, bo oni z backendem słabo. No i ja naiwny się zgodziłem, bo w końcu cośtam mogę poklikać w kąkuter zamiast oglądać memy z kotami.
Dostałem dokument w którym rozrysowano już wszystkie diagramy klas do tego projektu, które już na 1 rzut oka nie mają za bardzo sensu. Jest tam np. takie klasyczne User z którego dziedziczy jakiśtam Admin. Jakem żyw nigdy jeszcze chyba w kodzie logiki domenowej nie miałem potrzeby operowania obiektem Admin, bo jednak takie rzeczy to są ogarniane na poziomie endpointów i ról... No ale idźmy dalej, design to jest takie standardowe JPA/Hibernate encja na twarz i pchasz a żeby było nowocześnie to jeszcze koniecznie musi być GraphQL który pasuje tam jak pięść do nosa.
No ale słowo się rzekło, powiedziałem że pomogę, przyklepali u mojego managera, że mogę im pomagać jak mam czas, więc nie ma zmiłuj. Zrobiłem stuba do tego projektu i zaklepałem na szybko jakieś proste use-case żeby technologicznie wszystko jakoś pospinać. No i dziś robie ziomkom intro co tam wyprodukowałem i czemu właśnie tak no i się zaczęło :D
Uuu a co to za jakieś moduły, czemu nie wszystkie klasy się widzą? Akurat wyjaśnienie że to takie bieda-hexagonal architecture nawet jakoś łyknęli bez zbędnych komentarzy, ale chyba tylko dlatego że nie zauważyli, że psuje to wizje encja na twarz i pchasz, bo domain nie widzi bebechów z repository.
Jak to tak bez hibernate? Jakieś query trzeba pisać? Kto to ten jooq albo querydsl? Przecież w hibernate samo się wszystko robi, nic nie trzeba myśleć, jeszcze nam zoptymalizuje zapytania (xD szczególnie te n+1) i w ogóle. Więc mówie że w sumie to jakoś mnie to bardzo nie boli jak chcą koniecznie JPA to ok. Wydajnościowo będzie bida bo każde query wyciągnie im całą bazę (bo wszystko ze wszystkim połączone) ale tam i tak nie będzie dużego loadu, to może jakoś da radę. Ale mój warunek jest taki, że te obiekty hibernatowe nie wychodzą nigdzie poza repozytorium -> mapuja się do obiektów domenowych albo value objectów i idą do piachu i logika domenowa nic o nich nie wie. No ale jak to tak, przecież można nasrać do tych obiektów i jeszcze potem pchać je na frontend.... Powiedziałem ze ja ręki do takiej abominacji przykładać nie będę, więc w poniedziałek będzie runda 2 bo muszą się zastanowić :D
A co to takie dziwne testy, jakieś wiremocki, jakieś requesty http, my tu chcieliśmy pisać zgodnie z (Londyńskim) TDD, po co jakieś requesty jak można przecież zamockować klienta... No i tłumaczę, że jak tak pomockują wszystko to włączają wyłączają połowę aplikacji z testowania i takie testy to równie dobrze można pozamieniać na assertTrue(true); bo na co mi testy, po których nadal nie mam pewności czy to w ogóle działa. Chciałbym zresztą zobaczyć jak w ten sposób chcą testować np. jakieś authentication.
Oczywiście koniec końców to nie mój projekt, nie ja to będę klepać/supportować, więc nie chce im narzucać swoich pomysłów, ale z drugiej strony jednak chciałem ich uratować przed głupimi błędami.
Przynajmniej mój lead powiedział mi, że jak będą robić jakieś cyrki to można przyjąć taktykę
i powiedzieć ze wyskoczyło mi nagle dużo pracy i jednak nie dam rady im pomóc xD
edytowany 1x, ostatnio: Shalom
Zobacz pozostałe 8 komentarzy
Shalom
@Pinek no bo naiwnie zaproponowałem, że mogę pomóc skoro mam czas, zamiast siedzieć cicho i oglądać sobie dalej memy...
Co gorsza, tak jak napisałem, za jakiś czas to @Shalom będzie winnym problemów.
Shalom
Tego też sie obawiam, dlatego mimo wszystko decyzje zostawiam odpowiedzialnym za ten projekt, żeby nie było na mnie że ich zmusiłem do użycia xyz i dlatego się coś sypie.
Post wyżej @Shalom skłonił mnie do napisania o moim epizodzie. Klient skapnoł się że pewna funkcjonalność nie działa poprawnie. Po 4 latach działania systemu! Pewna część działania została zafejkowana bo pajac od softu sterownika nie wprowadziła zmian. Pogryźli się i zostało to zapomniane. Spędziłem 8h na tym, żeby zauważyć że kod kończy się wcześniej bo jest fix dla niego. A wszystko dla tego że klient skąpił na support i zamiast zapłacić 300pln miesięcznie i wszystko na bieżąco było by naprawiane (a było), to za samo naprawienie tego zapłacił 8 x 150 netto a to nie koniec jego problemów.
Zobacz pozostałe 2 komentarze
katakrowa
Ze skąpstwa wynikają różne komediowe sytuacje. Mi klient po 10 latach korzystania z aplikacji napisał, ze licencja zobowiązuje by dostarczać mu darmowe aktualizacje systemu "dopóki autor żyje".
nie bardzo rozumiem problem @hzmzp (klient zapłacił zamiast zapłacić, coś tam nie działało?) ale @katakrowa - tu należy wyraźnie odróżnić rozwijanie produktu (trudno wymagać by było bezpłatne) od bugfixów (zachowanie niezgodne ze specyfikacją - tu umowa może przewidywać coś w rodzaju gwarancji)
Skoro nie działała kluczowa funkcjonalność to dlaczego klient miał w ogóle cokolwiek dopłacać? Przecież już zapłacił. Za działający system płacił, nie za system w którym nie działała „kluczowa funkcjonalność”.
@Azarien: z tego powodu, że nigdy nie miałem możliwości przetestować jej fizycznie, a dokumentacja to był żart. Ponadto dopisać ją trzeba było jak najszybciej, bo mu groziły kary od firmy której sprzedał produkt. Chętnie podzieliłbym się szczegółami i opisał dokładnie całą historię powstawania aplikacji, ale niestety wiąże mnie tajemnica :(
My jakiś czas temu przejęliśmy tragiczny projekt robiony przez pewną dużą-i-znaną korporację dla innej dużej-i-znanej korporacji. Ogólnie straszny burdel, wszystko robione przez najtańszych Hindusów, którzy nie mają pojęcia, co właściwie robią.
Niestety, niedługo projekt wraca znowu do korpo-Hindusów, ale mamy przez jakiś czas pracować równolegle z nimi, nadzorować ich pracę i robić im review.
Zerkam wczoraj na jednego pull requesta, a tam takie kwiatki, jak np. front-endowy komponent z jakimiś tam formularzami. Pola tekstowe mają jakieś tam onchange, które wywołuje funkcję strzelającą do back endu i zapisującą nową wartość pola do bazy. Po każdej jednej wpisanej literce jest operacja zapisu do bazy. Optymalizacja wydajności level grandmaster.