Zdjęcie w tle

Społeczność

Programowanie

1k+

#programowanie #javascript #tworczoscwlasna #gruparatowaniapoziomu #lajko <--- mój tag


no siema.


lubię społeczność @hejto , ale strasznie mnie irytuje brak różnych funkcji albo działanie inne niż to którego bym chciał. Narzekałem, tagowałem, nic z tego nie wyszło. Tak więc przedstawiam Wam alternatywę-WIP-chyba-że-mi-się-znudzi-#opensource i pierwszy merytoryczny wpis w serii.


Repozytorium: https://github.com/wombatDaiquiri/lajko

Permalink do commita o którym piszę: https://github.com/wombatDaiquiri/lajko/tree/v0.0.2


Nie ma nawet README, ale nie od razu Rzym zbudowano. Ma za to dwa pliki które napisałem ja i cztery których nie napisałem (kto ma wiedzieć ten wie #pdk kto nie wie ten widocznie jeszcze nie potrzebuje).


Kod jest napisany w JavaScript. To taki język którego kiedyś się używało żeby robić fajne przejścia między obrazkami w przeglądarce. Teraz dostępny też w formie języka programowania z silnikiem który po prostu wykonuje kod na kompie jak np. Pythona albo C++ (nie do końca, ale to nie praca naukowa tylko edutainment)


Żeby sobie odpalić te programy, to musicie np. zainstalować NodeJS: https://nodejs.org/en/download następnie ściągnąć repozytorium z linka (można kliknąć przycisk <> Code i wybrać Download ZIP a potem rozpakować, jak nie macie gita)


no i teraz możecie poczuć się jak hacker - odpalić terminal. Może być windowsowy (wpiszcie `cmd` w wyszukaj i uruchom czy coś takiego). Poniżej szybki tutorial "chodzenia po systemie plików". W sensie klikania w foldery w formie tekstowej.


  • `ls` pokazuje pliki w folderze w którym jesteś

  • `cd <nazwa_folderu>` przechodzi do folderu o nazwie `<nazwa_folderu>` który MUSI się znajdować w folderze w którym jesteś (czyli pokazywać się w komendzie `ls`) - ten krok będziemy nazywać KROKIEM W DÓŁ

  • , `cd ../` przechodzi do "folderu który zawiera folder w którym jesteś" - taki "KROK DO GÓRY" - czyli przeciwieństwo kroku w dół

  • a jak się zamotasz albo sprawdzasz jak działają komendy to `pwd` pokaże tak zwaną "ścieżkę" - trudniej mi będzie wyjaśnić niż Tobie sprawdzić i skumać eksperymentując


no i jak będziecie w folderze z kodem, to najpierw musicie napisać `npm install` żeby pobrać tak zwane ZALEŻNOŚCI, a potem to możecie sobie np. odpalić zaciągnięcie pierwszej strony "najnowszych" i zapisanie jej jako JSON (jak nie wiesz co to to wygoogluj) kopiując, wklejając do terminala i wciskając enter;


nodejs scrape.js


stworzy Wam się wtedy plik `data-snapshots/{czas_w_ktorym_odpaliliscie_scrapejs}.json` a w środku będzie TABLICA zawierająca OBIEKTY - jak sprawdzicie co to JSON i otworzycie taki plik to myślę że intuicyjnie skumacie co to tablice i obiekty.


no ale taki plik to jest w sumie do d⁎⁎y, bo to to samo co hejto.


tutaj wkracza drugi plik - `process.js`. Odpalić go można następująco;


opcja pierwsza - sortowanie po sumie lajków komentarzy (nie patrząc na lajki samego wpisu)


nodejs process.js --cmd=comment_likes_sum --source=data-snapshots/{czas_w_ktorym_odpaliliscie_scrapejs}.json


opcja druga - tak samo, tylko z komendą `likes_total` zamiast `comment_likes_sum` da Wam wpisy posortowane po sumie lajków posta i komentarzy.


liczę, że foldery znajdziecie sami.


UWAGA! z łaski swojej nie napierdalajcie za często `scrape.js` - po to zapisuje wpisy, żeby nie zepsuć hejto. nie spierdolcie tego. do adminów @hejto - myślę że filtrowanie useragent wystarczy żeby największy plankton zablokować.


A na jutro postaram się przygotować wpis jak sobie napisać taki scraper samemu, chociaż starałem się żeby kod był łatwy do czytania. Sam praktycznie nie znam JavaScriptu, więc nie będę używał żadnych mega magicznych narzędzi i skomplikowanych konstrukcji językowych.


jeśli coś Wam nie działa, to zapraszam do komentowania też. z fartem wariaty.

kurde zapomniałem zapisywać linka do posta xD grupa obniżania poziomu.


nie mniej gratuluję @adam_photolive @Cris80 i @smierdakow za posty pod którymi komentarze były najbardziej plusowane, oraz @adam_photolive @Cris80 i @smierdakow za posty które razem z komentarzami zgromadziły najwięcej lajków do spółki z komentarzami.


a sobie gratuluję dobrania fantastycznych metryk na start. mam nadzieję że w przyszłości efekty będą bardziej spektakularne

@wombatDaiquiri z czystej ciekawosci zajrzalem w kod, bo sam temat scrapowania mnie nie interesuje. Robisz .catch na main


main().

  then(() => console.log('posts length in main promise:' + posts.length)).

  catch(err => console.log(err));


ale to nic ci nie da jak wysypie sie w funkcji savePosts bo ona uzywa callbackow - nie zlapiesz bledu.

Zaloguj się aby komentować

Ktoś mi powie proszę jak zrobić logowanie przez facebooka na stronie? Trzeba ich skrypt dodać w index i co potem? Dostaję ten accessToken i muszę go zweryfikować i nim wyciągnąć dane o użytkowniku? Ma ktoś fajny artykuł o tym?

#facebook #webdev #programowanie

W końcu nadszedł ten dzień, w którym muszę poznać Kubernetesa bardziej niż "odpalasz ten skrypt i się deployuje". Oby mi starczyło cierpliwości na patrzenie na paski postępu. #programowanie #devops #zalesie #kubernetes #docker

@wombatDaiquiri - jak się ma wszystko zautomatyzowane i deploymenty lecą przez pipeline, to wtedy następuje regres umiejętności.

Dlatego od czasu do czasu buduję sobie klasterek ręcznie.

W ogóle ostatnio konteneruję podmanem zamiast dockerem i używam CRI-O jako runtime.

Tak patrząc na cały ekosystem, to pomimo swoich zasług dla konteneryzacji, Docker ze swoim daemonem (dockerd) i poleganiu na containerd (kolejny daemon, który musi działać na OSie) - co ma poważnie implikacje dla security - będzie tracił w enterprise na rzecz podmana.

@wombatDaiquiri Witaj w klubie. Podobno fajna książka to kubernetes in action, Marko Luksa. Jak coś to znam kogoś, kto zna kogoś, kto zna kogoś, kto...

Zaloguj się aby komentować

Od pewnego czasu trwa już przedsprzedaż drugiej edycji szkolenia AI Devs przeznaczonego dla programistów chcących nauczyć się integracji istniejących systemów IT z modelami językowymi (AI). Nie jest to szkolenie z pisania promptów.


Więcej informacji na stronie:

https://aidevs.pl/?ref=unknow


P.S. do niedzieli (10.09) do północy (23:59), obowiązuje niższa, przedsprzedażowa cena. Od poniedziałku ruszamy z ceną docelową (200zł podwyżki).

c331161b-b7ff-4f53-b9a6-71807e86b2f5

Zaloguj się aby komentować

Przez lata skompilowałem sobie listę pytań, z którymi najczęściej spotkałem się na rozmowach kwalifikacyjnych - może komuś się przyda:


  • Czym w ogóle jest Python i jakie ma wady i zalety?

  • Jakie prymitywne typy danych oferuje Python i jakie mają właściwości?

  • Które złożone typy danych są mutowalne i dlaczego jest to przydatne?

  • Jakie znasz różnice pomiędzy Pythonem 2 a 3?

  • Podaj metody formatowania ciągów znaków (stringów) i interpolacji zmiennych

  • Wymień kilka najczęściej używanych modułów z biblioteki standardowej i ich zastosowanie

  • Z jakimi zewnętrznymi modułami lubisz pracować najbardziej?

  • Wyjaśnij wyrażenia listowe (list comprehensions) i podaj ich przykład

  • Jak wykonać kod Pythona asynchronicznie?

  • Podaj przykład obsługi błedów w Pythonie

  • Jak używać menedżera kontekstu (context manager)?

  • Czym jest GIL (Global Interpreter Lock) i jak go obejść?

  • Jeśli klasa dziedziczy z innej klasy ale obie klasy mają tę samą metodę, to metoda z której klasy zostanie użyta? Tip: MRO (Method Resolution Order)

  • Wyjaśnij dekoratory i podaj różnice pomiędzy "@classmethod" i "@staticmethod"

  • Jak funkcja zwana "super()" pomaga w zarządzaniu dziedziczeniem?

  • Jak przyspieszyć wykonywanie kodu Pythona?

  • Jak testujesz swoje programy napisane w Pythonie?


Często są też zadania programistyczne ja na przykład:


  • Wyświetl określone informacje ze strony internetowej użwając Pythona

  • Zaimplementuj Most Recently Used (MRU) w Pythonie bez użycia modułów zewnętrznych

  • Zaimplementuj dowolny algorytm sortowania w Pythonie


Tych zadań programistycznych w internecie jest sporo ale większość firm używa wariacji tych samych kilku pytań - na szczęście poważne firmy odchodzą od takiego sprawdzania wiedzy, bo to jedynie sprawdza czy ktoś jest w stanie nauczyć się kilku rozwiązań na pamięć.

Jakby, ktoś chciałby zacząć się uczyć, to strona Pythona ma świetny tutorial po polsku: https://docs.python.org/pl/3/tutorial/index.html.

Oczywiście o wiele więcej jest materiałów po angielsku - jak na przykład ten całkiem przyjemny godzinny tutorial dla początkujących: https://youtu.be/kqtD5dpn9C8.


#technologia #programowanie #python

Zaloguj się aby komentować

Uruchamiam STM32F103C8, a konkretnie EXTI na liniach PA0 ... PA4. Siedzą na tych pinach zwykłe przełączniki typu pushbutton. Rozwikłałem reference manual na tyle, że jedno przerwanie działa, ale inne mimo takiej samej składni przy każdym pinie już nie chcą.


GPIO ustawiam:

GPIOA->CRL &= ~GPIO_CRL_CNF0_0; // floating input to pull-down

GPIOA->CRL |= GPIO_CRL_CNF0_1;

Puszczam zegar do EXTI (w tym procku AFIO):

RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;

Zdejmuję maskę z interesujących pinów:

EXTI->IMR |= EXTI_IMR_MR0 | EXTI_IMR_MR1 | EXTI_IMR_MR2 | EXTI_IMR_MR3 | EXTI_IMR_MR4;

Ustawiam reakcję na zbocze narastające:

EXTI->RTSR |= EXTI_RTSR_TR0 | EXTI_RTSR_TR1 | EXTI_RTSR_TR2 | EXTI_RTSR_TR3 | EXTI_RTSR_TR4;

Dodaję priorytety przerwania i uruchamiam przerwania (tu tylko po jednym żeby nie mnożyć):

NVIC_SetPriority(EXTI0_IRQn, 1);

NVIC_EnableIRQ(EXTI0_IRQn);

Przykładowe przerwanie:

__attribute__((section(".after_vectors"))) void EXTI0_IRQHandler()

{

   printf("++ \r\n");

   EXTI->PR |= EXTI_PR_PR0;

}


Co bym nie robił tak działa tylko jedno przerwanie i to z PA2. Wiązać pinów z EXTI niby nie muszę (po resecie akurat się zgrywają), ale robię to dla pewności, nie widzę już gdzie szukać. W komentarzu dla czytelności wrzucam cały kod okrojony do obsługi EXTI.

Co mogę robić źle albo gdzie szukać? Do debugowania mam UART i LEDa ( ͡° ͜ʖ ͡°)


#stm32 #embedded #programowanie #baremetal

static void gpio_init(void)

{

   RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN;

   RCC->APB1ENR |= RCC_APB1ENR_TIM3EN;


   // BUT_CANC (PA0)

   GPIOA->CRL &= ~GPIO_CRL_CNF0_0; // floating input to pull-down

   GPIOA->CRL |= GPIO_CRL_CNF0_1;


   // (PA1)

   GPIOA->CRL &= ~GPIO_CRL_CNF1_0; // floating input to pull-down

   GPIOA->CRL |= GPIO_CRL_CNF1_1;


   // (PA2)

   GPIOA->CRL &= ~GPIO_CRL_CNF2_0; // floating input to pull-down

   GPIOA->CRL |= GPIO_CRL_CNF2_1;


   // (PA3)

   GPIOA->CRL &= ~GPIO_CRL_CNF3_0; // floating input to pull-down

   GPIOA->CRL |= GPIO_CRL_CNF3_1;


   // (PA4)

   GPIOA->CRL &= ~GPIO_CRL_CNF4_0; // floating input to pull-down

   GPIOA->CRL |= GPIO_CRL_CNF4_1;

}


static void exti_init(void)

{

   RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;

   EXTI->IMR |= EXTI_IMR_MR0 | EXTI_IMR_MR1 | EXTI_IMR_MR2 | EXTI_IMR_MR3 | EXTI_IMR_MR4;

   EXTI->RTSR |= EXTI_RTSR_TR0 | EXTI_RTSR_TR1 | EXTI_RTSR_TR2 | EXTI_RTSR_TR3 | EXTI_RTSR_TR4;


   // connect pin to interrupt

   AFIO->EXTICR[0] |= AFIO_EXTICR1_EXTI0_PA;

   AFIO->EXTICR[1] |= AFIO_EXTICR1_EXTI1_PA;

   AFIO->EXTICR[2] |= AFIO_EXTICR1_EXTI2_PA;

   AFIO->EXTICR[3] |= AFIO_EXTICR1_EXTI3_PA;

   AFIO->EXTICR[0] |= AFIO_EXTICR2_EXTI4_PA;


   NVIC_SetPriority(EXTI0_IRQn, 1);

   NVIC_SetPriority(EXTI1_IRQn, 2);

   NVIC_SetPriority(EXTI2_IRQn, 2);

   NVIC_SetPriority(EXTI3_IRQn, 1);

   NVIC_SetPriority(EXTI4_IRQn, 1);

   NVIC_EnableIRQ(EXTI0_IRQn);

   NVIC_EnableIRQ(EXTI1_IRQn);

   NVIC_EnableIRQ(EXTI2_IRQn);

   NVIC_EnableIRQ(EXTI3_IRQn);

   NVIC_EnableIRQ(EXTI4_IRQn);

}


__attribute__((section(".after_vectors"))) void EXTI0_IRQHandler()

{

   EXTI->PR |= EXTI_PR_PR0;

}


__attribute__((section(".after_vectors"))) void EXTI1_IRQHandler()

{

   EXTI->PR |= EXTI_PR_PR1;

}


__attribute__((section(".after_vectors"))) void EXTI2_IRQHandler()

{

   EXTI->PR |= EXTI_PR_PR2;

}


__attribute__((section(".after_vectors"))) void EXTI3_IRQHandler()

{

   EXTI->PR |= EXTI_PR_PR3;

}


__attribute__((section(".after_vectors"))) void EXTI4_IRQHandler()

{

   EXTI->PR |= EXTI_PR_PR4;

}

Mam nadzieję, że formatowanie przetrwa.

Nie zeby to cos zmienilo (bo to wszystko sa zera) ale EXTI0...3 sa w AFIO->EXTICR[0] a EXTI4 w AFIO->EXTICR[1].


W ramach debugowania sprobuj wywolac przerwanie programowe ustawiajac bity w rejestrze EXTI->SWIER. To pomoze Ci znalezc czy problem jest po stronie EXTI / NVIC / CPU czy konfiguracji GPIO. Sprawdz tez, prosta petla, czy czytanie pinu GPIO i pokazywanie go na LEDzie dziala dla wszystkich pieciu. Najgorzej jest spedzic wieczor debugujac program jak problem jest sprzetowy.

@Skylark dzięki. Jutrzejsze popołudnie zapowiada się zatem pod znakiem debugu, oby skutecznego.

EXTICR[0] i EXTICR[1] próbowałem wcześniej, ale też nie chodziło. Nie zapuściłem żadnego SVN, to tak zostało : )

Jak na razie spędziłem kilka dobrych posiedzeń nad szukaniem przyczyny całkowitego niedziałania nawet zwykłego blinky, a wyszło że to był jakiś pokopany CMSIS, choć wprost pobrany ze źródła.

@Skylark przerwania programowanie wywołują się. Problem polega na tym, że na dwóch pinach zamiast 3V3 z pullupa rezystorem 10k pojawia mi się jedynie 0,7 V. Poprawiałem na nich diody, a że są w obudowie SOD323, to może jedną - dwie odwrotnie wlutowałem. Napięcie pasuje ładnie do złącza p-n.

No albo coś w kodzie, ale przy ctrl+c/v to raczej nie powinno tak się stać.

@cec trzy z pięciu są dość kluczowe do działania tego przyrządu, więc zależy mi na szybkim ich zadziałaniu. Zostają dwa, które w sumie też można wrzucić do jednego wora i mieć spokój Prosto, SZYBKO...

@macgajster miłej zabawy z drgającymi stykami ¯\_( ͡° ͜ʖ ͡°)_/¯

Takie rzeczy się robi na przerwaniu od timera. Co 5 - 10 ms timer odpala przerwanie i w nim sprawdzasz czy przycisk był naciśnięty przez kilka cykli po zmianie stanu. Jeśli tak to wywołujesz funkcje onButton i ustawiasz jakiś "cooldown", żeby nie odpaliła się kilka razy przy jednym naciśnięciu.

Obsługa przycisku na przerwaniu wymaga kasowania flagi przerwania przed wyjściem z niego i pewnie jakiegoś dodatkowego timera albo delaya, żeby obsługa przerwania nie wywołała się kilka razy.


P.S. daj znać czy udało się odpalić pozostałe przerwania.

Zaloguj się aby komentować

ciekawostka - hejto ma tylko 50 stron "najnowszych" - https://www.hejto.pl/najnowsze/strona/50 jak zwiększycie numerek, to będzie wyświetlało stronę 50. To oznacza, że aby zescrapować posty i zrobić z nich customowy feed, muszę je zbierać na żywo co ~2 dni. Inne opcje brzmią dużo bardziej skomplikowanie.


wiadomość najgorsza - nie widzę opcji na zbieranie danych historycznych (szczęśliwie mogę zbierać 'od dzisiaj do nieskończoności' - czyli te dane za jakiś czas mogę mieć i mogę obrabiać)


wiadomość zła - nie mam pojęcia co się dzieje w requestach, zakładam że jakaś frameworkowa magia. tak czy siak, dostęp do api nie wygląda friendly


wiadomość dobra - mogę pobrać po prostu https://www.hejto.pl/najnowsze/strona/50 i zparsować xD


kolejna wiadomość dobra - strona 50 była dwa dni temu, więc nie muszę za bardzo bombardować api xD


#lajko <--- moje próby stworzenia sobie newsfeedu, który nie będzie mnie wkurwiał. postaram się tagować.


#programowanie #starozytniprogramisci #hejto

@VonTrupka własne gorące to plan na PoC. Zobaczymy czy uda mi się je dowieźć i czy którąś z bardziej przyszłościowych myśli będę chciał realizować

Zaloguj się aby komentować

@wrazik Po prostu Scruma pcha się tam, gdzie nie powinno i nawet jeżeli stara się go dobrze używać to i tak nie ma sensu w takich przypadkach. To jakby wkrętarką wbijać gwoździa.

Z mojego doświadczenia scruma zazwyczaj zabijają 2 rzeczy: budżet (nie nadaje się do niskich budżetów, imho nawet do średnich) - został stworzony by poprawić efektywność produkcji oprogramowania w bogatych korpo, a wciskają go wszędzie. Po drugie to mikrozarzadzanie. Jak na review scrum master/po wie dokładnie co ma zobaczyć, to robicie to zle.

Zaloguj się aby komentować

Zaloguj się aby komentować

Siema.

Mam problem... Ogólnie robię sobie apkę w C# Maui na Androida i mam tam osadzoną przeglądarkę za pomocą kontrolki WebView. Ładuje do tej przeglądarki link do playera embbed z cda. I tu jest problem po załadowaniu strony, filmiki się nie uruchamia a w logach informacje że requesty są blokowane przez politykę CORS. Da się to jakoś obejść? Próbowałem dodać jakieś nagłówki (?) do request'ów i dalej nie działa. ಠ_ಠ


#programowanie #csharp #dotnet #maui #android

@kiko 

>kontrolka WebView

>c#

>CDA

Nie chcę Cię martwić, ale masz tam DMC.

Ja bym porzucił WebView w zamian za czysty datastream.

@vinclav Kurde zależy mi trochę żeby to jakoś działało bo kurde część linków w apce przestało mi działać...

@kiko no to pakujesz się w cross site scripting, hmm. No nie uciekniesz od natywnej apki. Już widziałem takie akcje z jakimiś sokami na zamówienie. Poważnie lepiej wystaw jakiś protobuf API albo rest albo vnc. Ale to brzmi jak DMC jakieś.

Na szybko, czy jest czas? Bo może wystarczy postawić jakiś streaming. End user się nie zorientuje.

@kiko do przeglądarek desktopowych są wtyczki do pomijania tego CORS checka, bo z tego co rozumiem, to jest zabezpieczenie po stronie przeglądarki. może kod tych wtyczek coś Ci podpowie

Update jakby ktoś był ciekawy...

Apke zaktualizowałem do net 8. Zauważyłem że do kontrolki WebView dodali możliwość zmiany UesrAgent'a, więc zmieniłem go na desktop'a i zaczęło działać. Zdziwienie.wav

Chyba że coś w samym CDA się zmieniło

Zaloguj się aby komentować

#unrealengine

robię se platformówkę, jak wcześniej wspominałem.

Poszukuję filmików, tutoriali etc. jak zrobić Mario Bros. (te klasyczne) w Unrealu.

Płacę piorunami i uśmiechami.

Z góry serdecznie dziękuję za pomoc!


Pozdrawiam!


PanGargamel

c8fa7e69-d49a-49d4-b8b8-ef80f9cb0d79

@PanGargamel w sensie, wszystko na ytb pod "ue5 platformer 2d tutorial" już widziałeś i trzeba więcej?

Zaloguj się aby komentować

Widziałem gdzieś wczoraj komunikat "Twoje hasło nie może być podobne do poprzedniego" i zdębiałem. Jak to podobne xD "Nie może być takie samo" - to znam, to rozumiem. Ale jak zmierzyć podobieństwo zahashowanych haseł xD Przecież to jest cały myk funkcji hashującej (oprócz tego że jest jednokierunkowa) że właśnie nawet najmniejsza zmiana inputu może powodować całkowitą zmianę outputu. Wniosek miałem jeden: dzbany przechowują niehashowaną wersję! Może jakoś zaszyfrowaną, może nawet całkiem dobrze, ale jednak odwracalnie. Już myslałem, że to jakiś prank ale popytałem znajomych i wielu spotkało się z podobną praktyką. Już taki zbulwersowany siedziałem, gdy nagle myślę "a może po prostu sprawdzę jak oni to robią xD" i słuchajcie jaki patent prosty a sprytny xD Biorą nowe hasło, i puszczają go przez jakiś tam wektor popularnych zmian, permutacje, i tego typu zabiegi. Dostają szereg "podobnych haseł" które teraz hashują i porównują z hashem zapisanym w bazie xD Jak sie zgadza, to bingo, hasło jest podobne!


[Pominę fakt że strasznie mi sie to zabezpieczenie nie podoba, opisuje tylko jak fajnie jest rozwiązane]


#programowanie #cybersecurity

Tylko jest pewien problem. Przechowują hashe Twoich poprzednich haseł. Przypuśćmy że ten ich algorytm jest słaby i coś pomija. W razie gdy ukradną im bazę można łamać wszystkie stare hashe. Po złamaniu któregoś z nich można atakować kolejne lepszym algorytmem za pomocą bazowego hasła i jeśli użytkownik miał jakiś schemat to zostaną łatwo złamane.

@tmg To prawda. To znaczy ja zakładam że w 2023 roku to już każdy używa nowego bcrypta nawet jak o tym nie wie, bo mu framework sam go wrzuca ¯\_(ツ)_/¯ Ogólnie ja mam takie poczucie że jak pierwszy raz ustawiam gdzieś hasło, to ono automatycznie przestaje być "moje" bo przecież nie wiem co sie z nim dalej dzieje. Dlatego (i z wielu innych powodów) menadżery haseł 100% RiGCz

@tmg wg tego co napisał OP to nowe hasło jest porównywane z obecnym hashem. Nie widzę tu trzymania starych haseł, jak walidacja przejdzie to obecne zostanie nadpisane

  • @Macer Mnie rozwala jak mam dobre hasło wygenerowane przez menadżer, a tu nagle dostaje komunikat "nieprawidłowe hasło" i szukam co im sie nie podoba a tam tak idiotyczne frazy jak "Żaden znak nie może być powtórzony więcej niż 2 razy" (co XD) albo "hasło nie może zaiwerać w sobie podobieństwa do loginu" - no i co to niby kurwa znaczy? W okcie przepuściło mnie dopiero hasło które nie miało żadnej literki z mojego loginu. To jest czysty debilizm

@Barcol to chyba jest celowo wymyslane zeby stworzyc podstawy pod wprowadzenie tego digital ID. ze to niby takie wygodne bo nie trzeba hasel wymyslac. ale i tak nie trzeba, bo nikt normalny nie lamie hasel pojedynczych uzytkownikow, jesli juz to kradnie bazy albo stosuje phishing.

@Barcol przebij polityke bezpieczeństwa u mnie

hasło nie może być dłuższe niż 12 znaków xDDDD

Tutaj tak wszystko na odpierdol jest, że plain text do haseł jest nie tyle prawdopodobny, co prawie pewny, i jeszcze janusze ustawiły taki śmieszny limit na tym xD

@redve Ja mam w banku max 16 ಠ_ಠ To znaczy rozumiem że limit musi być, ale kurde 16 znaków w tych czasach traktowane jako MAKSIMUM to tak średnio poważnie, o 12 nie mówiąc :v

Limit masz jak jest hasło maskowane, ale jak je wyłączysz to powinno dać się dłuższe, chyba, z zapomnieli i mają błąd xd.

Zaloguj się aby komentować

Zaloguj się aby komentować

@cec Stwierdziłem że wrzucę na streamable żeby ładny podgląd był. Wiesz, z edycją postów jest jak z update'ami hejto. Na początku spoko, ale po jakimś czasie dupa blada.

Zaloguj się aby komentować

Zaloguj się aby komentować

Jakiś czas temu jak jeszcze się dopiero zaczynałem orientować w programowaniu zawodowym natknąłem się na kilka myśli, spostrzeżeń, które mocno zmieniły moje spojrzenie na pewne rzeczy i podniosły jakość mojej pracy niemal z marszu. Czerpałem głównie z książek, bo jestem książkowym świrem i częściej sięgnę po książkę niż Hindusa na YT, choć zdarza się i tak. A pracę zaczynałem zaraz po technikum w januszeksach więc często nie miałem żadnego mentora w firmie.


No i jedną z tych myśli była klasyfikacja kodu wg złożoności i liczby zależności. Zaprezentował ją Khorikov w książce Unit Testing (dostępna tez po Polsku, Helion).

Idea polega na tym, że kod można ocenić pod względem:

**złożoności lub wagi domenowej** - czyli jak istotny jest kod dla podstawowego celu aplikacji (np algorytm wyznaczania ścieżki do celu w nawigacji) bądź jak bardzo jest on skomplikowany, czyli ile ma rozgałęzień, przypadków skrajnych i tak dalej;

liczby współzależności - czyli ile zawiera odniesień do zależności spoza kontroli bieżącego procesu, które mogą być modyfikowane również przez inne procesy, np połączenie z bazą danych, redisem, jakimś innym serwisem. Khorikov stawia tutaj wyjątek, że jeżeli serwis jest read only to nie traktuje się go jako współzależność ale ja lubię nie stosować się do tego wyjątku.


Jeżeli dwie powyższe miary zaprezentujemy na układzie współrzędnych (rozpatrując dodatnie połowy obu osi, ofc) to możemy podzielić go na cztery ćwiartki, pic rel. Jedna z nich to algorytmy, czyli kod o niskiej czy lepiej zerowej liczbie współzależności, które należy otestować jednostkowo. Idealnie jeśli ich rola sprowadza się do przyjęcia danych i zwrócenia wyniku, bez "efektów ubocznych". Druga to kontrolery, które testuje się integracyjnie. Niska złożoność ale dużo współzależności. Idealnie nie ma tam żadnych ifów, obliczeń, nic. Jedynie koordynacja komunikacji pomiędzy współzależnościami. Kod trywialny to kod o niskiej złożoności i liczbie współzależności (np gettery, settery etc). Nie testuje się go w ogóle bo nie opłaca się. I wreszcie **kod przekomplikowany **(jest takie słowo w języku niepotocznym? xD) to kod który jest i złożony i ma dużo zależności i jest to ten który widzicie w Waszych spagetti w Wordpressie. Ten ostatni typ to kod, który należy zrefaktorować, podzielić na algorytmy i kontrolery i otestować je indywidualnie.


Po lekturze tej książki natychmiast zastosowałem się do tych wskazówek w projektach w pracy i to był game changer. Od tamtej pory kod który piszę jest otestowany, przemyślany i poukładany. W każdym języku w którym miałem okazję napisać coś więcej ta porada znalazła zastosowanie. Jak ktoś dopiero zaczyna karierę albo dalej ma problem z pisaniem testowalnego kodu to polecam całym sercem.


PS to nie reklama, po prostu jakbym miał zaczynać jeszcze raz to sam bym chciał żeby ktoś mi polecił takie inspirujące rzeczy wcześniej niż odkryłem je sam.

2428e4ee-a8a5-4a2e-990c-f2ecac28b4b2

@Kshaq Największą zaletą pisania testów jednostkowych jest nakazanie ich pisania programistom do ich własnego chujowego kodu. Jeżeli pisanie testow do tego co wysrałeś to droga przez mękę i zajmie ci pół dnia, to powinno ci dać do myślenia.

@Kshaq Szczerze to totalnie nie zawracam sobie tym głowy od kiedy pisze w podejściu "Design by Contract" I używam weryfikacji formalnej

@Kshaq to co opisałeś brzmi jak osobna, "własna" interpretacja architektury warstwowej czy heksagonalnej przy DDD. Dodatkowo, jeśli musiałeś odkryć podobne podziały sam to najwidoczniej zawiedli koledzy albo po prostu firmy w których było Ci dane na początku pracować, ale to nic nowego, sam też niestety przechodziłem podobną ścieżkę.


Z perspektywy doświadczonego deva powiem tylko tyle, że takowe interpretacje własne i książki niesamowicie burzą spójność w świecie IT i po prostu ciężko się przez nie dogadać. Stosowanie różnych praktyk, pojęć, później czasem wychodzi nadmierne tłumaczenie przy CRkach albo po prostu przez różnice w nazywaniu tych samych rzeczy (bo każdy przeczytał inną książkę) wychodzą jakieś dziwne koncepcje.

@Voltage 

Wiadomo, boli jak zmieniasz pracę, projekt, klienta i musisz przerzucać się na inny "framework" ale nie uważam żeby to był rozwiązywalny problem. Różne koncepcje są przyjmowane w różny sposób w zależności od potrzeb. Takie DDD na przykład, czasami jest przyjmowane w całości, czasami częściowo, czasami wcale. Podobnie hexagonal, onion, CA. Każdy projekt to okazja do poszerzenia horyzontów, a każda nowa koncepcja którą ktoś przynosi to okazja do dyskusji, z której albo nie wyniknie nic albo wyłoni się potencjalnie lepsze rozwiązanie, a zbiór doświadczeń co działa i co nie to korzyść dla ciebie, bo będziesz znał wady i zalety podejść w przyszłości. Nie trzeba od razu implementować każdego nowego pomysłu a w mnogości języków, technologii, paradygmatów i zwykłych trendów zawsze ktoś będzie miał coś ciekawego do powiedzenia. To tyle jeżeli chodzi o świat IT, ale brak spójności w firmie, dziale czy nawet zespole to już inny temat.


A co do tego o czym pisałem: to nie jest "własna interpretacja" czy alternatywa dla żadnego gotowego "frameworka" tak jak nie jest nią np. dependency inversion, ocp albo coupling i kohezja. To jest obserwacja, uogólnienie jakiejś koncepcji, problemu i propozycja jego rozwiązania. Warto umieć nazwać i opisać elementarne problemy jakie rozwiązują różne "gotowe" architektury jak ten hexagonal czy onion, bo nie zawsze masz możliwość ich wprowadzenia, choćby kiedy masz za zadanie robić refactor jakiegoś śmietnika. A kiedy junior pyta dlaczego robisz to tak a nie inaczej, to dobrze jest umieć zaargumentować inaczej niż "bo tak jest w ddd".

@Kshaq Nie mówię że nie masz racji, chodzi mi po prostu o wspólny język w branży który przez takie redefiniowanie oczywistości stanowi często problem. Weźmy taki DDD (skoro już przy nim jesteśmy), którego podstawą jest ustalenie wspólnego języka, nie tylko wśród devów ale też na połączeniu dev-biznes. Im lepiej się rozumiemy tym szybciej, i bardziej bezproblemowo zaimplementujemy odpowiednie rozwiązania na akceptowalnym poziomie, i tym mniej długu narobimy. W Twoim przykładzie (a może po prostu źle go opisałeś?) wyodrębniasz "kod trywialny" którym opisujesz property oraz warstwę algorytmów jako szeroko pojętą domenę, a przecież np. w DDD modele i property mają swoje miejsce właśnie w warstwie domenowej. Tak, znajdują się w niej również serwisy domenowe, jednak tutaj już jest jakaś nieścisłość. Stąd moja opinia - im więcej ludzi pisze książki/blogi i miesza w nich pojęcia tym gorzej dla innych którzy to czytają i czasem łapią mindfucka konfrontując z innymi.


Oczywiście z większością tez mogę się zgodzić, piję jedynie do tego jednego problemu.

Zaloguj się aby komentować