Zdjęcie w tle
Programowanie

Społeczność

Programowanie

1k+
async await - nie będę Wam jeszcze wyjaśniał co to jest, ale wyjaśnię jak sobie z tym radzić (chyba)

No więc ten post jest w pewien sposób eksperymentalny - nie mam mianowicie pojęcia, czy to co piszę jest prawdą i nie chce mi się szukać informacji i źródeł na ten temat.

Powód jest prozaiczny - chciałbym sprawdzić tolerancję odbiorców na drobne nieścisłości, oraz czy są wśród nas eksperci, którzy mogliby mnie poprawić. Jeśli będę zawsze chciał potwierdzać u źródeł czy dobrze mi się wydaje, to odcinki nie będą wychodziły codziennie, tylko co miesiąc. Pożyjemy, zobaczymy. Może mam dostatecznie dobrą intuicję, żeby nie wprowadzać Was za często w błąd.

W szczególności - pojęcia "wątków", "procesów", "korutyn", "przerwań", "rdzeni" zostanie w tym poście spłaszczone do abstrakcyjnej koncepcji "procesów wielowątkowych i jednowątkowych". Moje stosowanie zwrotu "wątek" nie ma na myśli pojęcia "thread", a abstrakcyjny "wątek który wykonuje się niezależnie na osi czasu". A purystom chuj w dupę.

Zacznijmy od programów "jednowątkowych". Jak mogliście do tej pory zakładać czytając wpis o process.js: https://www.hejto.pl/wpis/tlumacze-jak-lajko-sortuje-posty-zeby-stworzyc-inaczej-posegregowana-liste-to-na, wątek działa tak, że wykonuje kolejno komendy linijka po linijce. A to `console.log` coś wypisze, a to `let twoj_stary = 'najebany'` przypisze jakąś wartość do zmiennej. Dzień jak co dzień.

No i wszystko byłoby spoko, tylko w pewnym momencie się okazało, że właściwie to nie za bardzo się da zrobić tak żeby wątek (czyli lista instrukcji) wykonywał się szybciej.

No to wymyślono zamiast tego, że można zrobić kilka wątków i one będą się wykonywały w tym samym czasie. Pomyśl o tym tak - dziewięć kobiet nie urodzi dziecka w miesiąc, ale jeśli każda zajdzie w ciążę to urodzą dziewiątkę dzeci w dziewięć miesięcy. Średnio 1 dziecko/miesiąc. Pointa tego żartu to właśnie wyjaśnienie czym jest programowanie wielowątkowe i co może nam dać oraz jakie ma ograniczenia.

Zamieniając życie na programowanie, zamiast rodzenia dziecka przez kobiety porozmawiamy o wykonywaniu zapytań HTTP. Zapytanie HTTP to to co robi przeglądarka jak wpiszesz `hejto.pl/najnowsze/strona/1`. Ja będę to symulował pisząc `axios.get(...)` - axios to tak zwana biblioteka (ta służy do robienia zapytań HTTP), ale nie potrzebujesz jeszcze szczegółowej wiedzy w tym zakresie.

Z zapytaniami HTTP jest trochę jak z rodzeniem dziecka - czasem długo trwają. Myślę, że zauważył to każdy, kto odwiedza regularnie #hejto.

Więc programując w JavaScript używa się do tworzenia takiego "wątku" funkcji z napisem `async`. Z tego co rozumiem zwraca ona `Promise`. `Promise` będzie się wykonywał niezależnie od tego, co zrobimy w wątku który go stworzył (np. przez wywołanie funkcji). Jeśli w funkcji głównej wywołacie `sleep`, czyli nie robienie niczego na np. 20 sekund, to taki request (czyli ZAPYTANIE HTTP ale po angielsku i widzę że notorycznie wtrącam to słówko i jestem już zmęczony przepisywaniem) pewnie zdąży się wykonać i kolejne funkcje korzystające z odpowiedzi (response) na zapytanie (request) będą działały poprawnie.

Problem z JavaScriptem jest taki, że jeśli funkcja jest zadeklarowana jako `async` to po prostu będzie się wykonywała w tle (osobnym wątku - tzw. asynchronicznie) i trzeba robić specjalne sztuczki, żeby poczekać na jej wynik. No i `axios.get(...)` właśnie taką funkcją jest xD

Na przykładzie - załóżmy że przypiszemy `Promise` zwrócony przy wykonywaniu zapytania to zmiennej `p` (pewnie coś w stylu `let p = axios.get(...)`). Proces wysyłania zapytania i odbierania odpowiedzi odbywa się "w tle". `Promise` (czyli typ zmiennej `p`) pozwala nam na poczekanie na odpowiedź na dwa sposoby;
- napisanie `await p()`, żeby poczekać aż się wykona przed wykonaniem kolejnych instrukcji
- napisanie `p().then()`, żeby zrobić coś po tym jak się wykona

Oprócz `then` można zrobić też `catch`, żeby sobie np. wypisać błąd jak się wydarzy (w przypadku hejto - czasem jest to błąd z "klasy 500" czyli błędów serwera typu wszelakiego. O tym pogadamy za dość długi czas). W przypadku `await` wydaje mi się, że używa się bloków `try { ... } catch { ... }`, natomiast sugeruję po prostu robić tylko `.then(...).catch(...)` podczas "prototypowania".

No i tutaj kolega @VonTrupka słusznie przewidział w jednym z historycznych wpisów, że wybór nodejs był w pewien sposób pójściem na kompromis xD Otóż w wypadku `nodejs` nie można zrobić `await` w głównym wątku, jak początkowo chciałem. Wydawało mi się, że powinno się dać zrobić `let resp = await axios.get(...)`. No ale się nie da. Zajęło mi ze trzy godziny pogodzenie się z wrzuceniem tego co faktycznie chcę żeby się wykonało w ramach tego "skryptu" (czyli małego programu) do funkcji `main` i użycie `main().then(...).catch(...)` w głównym wątku.

Żeby zrozumieć czemu ten cały cyrk ma sens trzeba wiedzieć jak działa nodejs na dość specjalistycznym poziomie. Ja mam swoją teorię spiskową że jest jednowątkowe i tylko "udaje" wielowątkowość. Ale nie wiem czy to prawda, a Ty ani nie musisz tego wiedzieć ani tym bardziej rozumieć o czym mowa.

Moje eksperymenty doprowadziły mnie do przeczucia, że czekanie na to aż funkcja kryjąca się pod `p` typu `Promise` się wykona, to zastosowanie formatu - `p().then(...).catch(...)` - w ten sposób możemy w `then` po prostu przypisać zwracaną wartość do jakiejś zmiennej i udawać że cały program jest jednowątkowy.

Jeśli udało Wam się zrozumieć co się dzieje z mojego opisu - gratuluję. Trochę Wam, trochę sobie, bo wydaje mi się że koncept "rzeczy dziejących się jednocześnie" i czekania na nie żeby nie działy się jednocześnie tylko po kolei nie jest super intuicyjne.

W nagrodę kolejny wpis będzie łatwy - o tym co zwraca hejto i jak wyciągnąłem z tego treść Waszych wpisów.

#lajko <--- mój tag (przesunąłem na pierwsze miejsce i posortowałem resztę w takiej kolejności, w jakiej uważam że trafienie do ich odbiorców jest dla mnie istotne, sorki memorki jeśli kogoś uraziłem)

#programowanie #tworczoscwlasna #gruparatowaniapoziomu #javascript
666

@wombatDaiquiri panie, praktyka tak, ale w parze z rownolegla nauka. Inaczej bedziesz uskutecznial cargo cult programming czyli nigdy nie zrozumiesz jak dziala kod i czego sie spodziewac.


w wypadku `nodejs` nie można zrobić `await` w głównym wątku, jak początkowo chciałem

oczywiscie ze mozna. Od node v15+ jest to mozliwe LINK


Kolejna rzecz to jednowatkowosc node.js. Wszyscy tak pisza a prawda jest taka ze node.js od samego poczatku jest wielowatkowy out of the box. wszelkie operacje i/o (operacje sieciowe, czytanie dysku, itp) przetwarzane sa w osobnym watku (czy tam procesie).

Przykladowo:


console log('xxxxx');

const data = axios.get(....); <- node.js wlasnie tworzy nowy watek i kiedy zakonczy pobieranie danych zwroci wartosc. Wykonywanie kodu leci dalej i nie czeka na axios

const xx = 'ala ma kota' <- kod wykonywany w glownym watku rownoczesniej z pracujacym axiosem w innym watku

logger('wiadomosc'');

console.log( await data); <--- glowny watek wroci tutaj do wykonywania kodu w momencie kiedy watek obslugujacy polaczenie sieciowe zwroci dane


Do ksiazek a nie "zobaczymy co sie stanie"!

rakokuc

No w końcu coś o JavaScript, jedynym słusznym (i potrzebnym ludzkości) języku programowania.


Panowie, proszę wincyj takich dyskusji.

Meverth

@wombatDaiquiri należałoby jeszcze dorzucić do tego, że część się wykonuje na wątkach react, część jest oddelegowana do przeglądarki.

@Flaaj, @666, poprawcie mnie, proszę.

```

console.log(0);

const defferred = async function timeouted2() { await new Promise(resolve => setTimeout(() => { console.log(1); resolve(); }, 5)); };

setTimeout(() => {console.log(2);}, 5);

new Promise(resolve => setTimeout(() => { console.log(3); resolve(); }, 5)).then(() => console.log(4));

defferred().then(() => {setTimeout(() => {console.log(6); }, 5);});

setTimeout(function timeouted() { console.log(7) }, 5);

console.log(8);

```

Zaloguj się aby komentować

przyznaję, że post o #lajko powinien być wczoraj, a będzie dzisiaj (w sensie, w czwartek, ale później)

no ale chociaż wrzucę zajawkę czym będziemy się zajmować w nieodległej przyszłości - robieniem "hejto które mamy w domu" czyli używania potężnego frameworka do prostego wyświetlania treści xD jutro o async/await z perspektywy człowieka który nie wie do końca jak działa async/await. ale jakoś tam dałem sobie radę #javascript
b9b85a87-dd9c-4136-9f2a-c462c0487875

Zaloguj się aby komentować

Zostań Patronem Hejto i odblokuj dodatkowe korzyści tylko dla Patronów

  • Włączona możliwość zarabiania na swoich treściach
  • Całkowity brak reklam na każdym urządzeniu
  • Oznaczenie w postaci rogala , który świadczy o Twoim wsparciu
  • Wcześniejszy dostęp, do wybranych funkcji na Hejto
Zostań Patronem
#programowanie #zalesie

Pamiętam, jak miałem bekę z Fallouta 3 i jego implementacji pociągu metra, aż tu człowieka dopada wewnętrzny korpo legacy framework o nie lepszej elastyczności i wtedy już jest #niesmieszne ECHHH
koszotorobur

@TRPEnjoyer - dla kogoś, kto nie wie o co chodzi to silnik miał ograniczenia dotyczące pojazdów, więc problem rozwiązano tworząc kapelusz dla NPC w kształcie pociągu - w taki oto sposób nie trzeba było modyfikować silnika a gra miała ruszające się pociągi napędzane niewidocznym (schowanym pod ziemią) NPCekiem: https://youtube.com/shorts/VAwgCEghYLQ

Zaloguj się aby komentować

zanim powstało lajko - WebStorm ratuje mi życie, a copilot mnie wkurwia, czyli jak wytwarzać oprogramowanie w skończonym czasie

jeśli nie wiesz o co chodzi, albo nie wiesz co to terminal, to tutaj post wprowadzający: https://www.hejto.pl/wpis/programowanie-javascript-tworczoscwlasna-gruparatowaniapoziomu-lajko-lt-moj-tag-?commentId=13977332-7772-4f89-a067-d76784aa5c18

jeśli wyobrażacie sobie, że odpaliłem notatnik i piszę sobie różne magiczne komendy z pamięci, no to grubo się mylicie. Oczywiście, pamiętam że istnieje kilka podstawowych "klocków" - moduły, funkcje, zmienne, `if`, `for`, `let` i `const` do zmiennych i kilka innych jak nawiasy klamrowe.

Ale co do zasady, ani ja ani żaden inny programista którego znam nie pamięta "wszystkiego". Po ponad pięciu latach pewnie pamiętam dużo z biblioteki standardowej Go w którym przez ten czas pisałem, ale w innych językach - nie.

Z drugiej strony - przerywanie pisania żeby googlować, bo nie pamiętam jaka jest sygnatura każdej metody też jest bez sensu. Zajmuje to bardzo dużo czasu, i wybija mnie z twórczego rytmu.

Ponieważ najwyraźniej nie tylko ja mam słabą pamięć i nie tylko mnie to irytowało, powstały programy które nazywają się IDE. To taki notatnik, tylko oprócz "zapisz" i "wczytaj" mają dużo więcej opcji;
- informacja czy funkcja istnieje czy nie istnieje
- podpowiedzi jakie argumenty ma funkcja którą wywołuję
- podpowiedzi w którym miejscu zapomniałem nawiasu zamykającego albo otwierającego
- przeglądanie plików
- podłączanie debugera (o tym kiedy indziej)
- odpalanie programu
- zmiana nazwy obiektu w wielu plikach
- UI (interfejs graficzny zamiast terminala) do przeglądania bazy danych

i pizdylion innych. Każde IDE wspiera też tak zwane "pluginy" - czyli rozszerzenia, pisane przez indywidualnych twórców albo firmy. A jak firma chce zarabiać, to musi mieć klientów. A jak klient używa IDE, to łatwiej mu sprzedać produkt jak można go wpiąć w środowisko w którym już pracuje.

Przykładem takiego pluginu jest copilot. Ale za nim o copilocie, to linki do dwóch IDE;
- WebStorm - https://www.jetbrains.com/webstorm/ IDE z którego ja korzystam. Płatne. Ciężko mi powiedzieć w sumie, dlaczego za nie płacę. Prawdopodobnie dlatego, że korzystałem z niego w pierwszej firmie i nigdy nie chciało mi się uczyć gdzie co jest w darmowych.
- Visual Studio Code - https://code.visualstudio.com/ IDE które jest darmowe i z tego co mi wiadomo posiada takie same funkcje jak WebStorm (tzn. IDE od JetBrains) - polecam jeśli dopiero się uczysz. Jeśli zaczniesz z vscode, to potem oszczędzisz pieniądze na subskrypcjach, a jeśli nie widać różnicy - to po co przepłacać?

I teraz temat który w tym roku eksplodował - GitHub Copilot. Copilot to narzędzie, które podpowiada "co prawdopodobnie chcesz napisać dalej". No i w zależności od tego jak go używacie - może być błogosławieństwem lub przekleństwem.

Na przykładzie - jeśli napisałem już funkcję `savePosts`, ale z jakiegoś powodu chciałbym zapisywać posty pojedynczo, to wystarczy że zacznę pisać `function saveSinglePost` - copilot zasgeruje właściwie dokładnie to co sam bym zrobił (obrazek pierwszy).

Dzięki temu mogę znacząco skrócić swój czas pracy nad kodem, bo zamiast zastanawiać się nad pierdołami, korzystam z "domyślania się copilota". W tym momencie wystarczy, że "zatwierdzę sugestię" klikając "tab" i nie muszę się męczyć w myślenie gdzie subtelnie zmienić kod żeby uzyskać efekt.

Istnieje jednak druga, dużo bardziej mroczna strona copilota. I poza oczywistym (czyli sugerowaniem totalnych głupot w kodzie) chciałbym zwrócić uwagę na dwa mniej oczywiste problemy;

Problem pierwszy - w przypadku pisania tekstu (np. takiego jak ten) copilot generuje bardzo rozpraszające podpowiedzi, które nie mają sensu. Przykład - w następnym zdaniu napiszę tylko pierwsze słowo, a reszta zdania będzie dokończona przez copilota. Dowód na drugim obrazku. W tym przypadku copilot sugeruje mi, że "nie ma sensu" pisać o tym, że copilot sugeruje mi co mam napisać. No i ma rację, ale to nie jest to o czym chciałem napisać.

Problem drugi - komentarze funkcji. Copilot pisze totalne oczywistości, ponieważ nie jest w stanie zrozumieć czym są "informacje które mogą ciekawić potencjalnego odbiorcę". Ponieważ nie ma świadomości - nie wie, że istnieje jakikolwiek "odbiorca".

Jeśli chcecie natomiast zaimponować swoim kolegom programistom, to możecie dorzucić informację że copilot nie sugeruje usuwania tekstu, oraz nie sugeruje zmiany tekstu - a jak wszyscy wiemy ( ͡° ͜ʖ ͡°) w programowaniu nie chodzi tylko o to kto napisze więcej tekstu, ale też o zrozumienie kodu który zastaniemy i wprowadzanie zmian w kodzie w przyszłości, w sposób który nie rozpierdoli całego systemu.

Lennyface został zaproponowany prez copilot. Także może bywa wkurwiający, ale przynajmniej memiczny.

#programowanie #ai #tworczoscwlasna #gruparatowaniapoziomu #lajko <--- mój tag
49c0369c-9599-4f17-a4c0-b6c8c72a454b
9cc2e50c-52ee-42c1-b0d1-4dcce5c09b6f
Cześć, polecacie może jakieś książki do nauki C#? Ja wiem, że książki już w momencie publikacji są przestarzałe, a w internecie wszystko jest za darmo, ale tak już mam, że lubię się uczyć z książek.

Przyjmę wszelkie porady, pro tipy, ostrzeżenie. Po OLXach śmigają np. książki autorstwa Jesse Liberty po kilka złotych, ale przypuszczam, że wydanie z 2005 roku jest już baaaardzo nieaktualne.

Z góry dzięki!

#nauka #naukaprogramowania #gownowpis
MostlyRenegade

@ERH ja nie polecam książek. Jak napisałeś - w internecie jest za darmo i aktualne. Serio, uczenie się z książki nie ma sensu.

No i nie napisałeś, na jakim poziomie jesteś i czego konkretnie chcesz się nauczyć. Język sam w sobie jest banalnie prosty.

cec

W zasadzie każda książka jest tak samo dobra jak i zła. Jeśli chcesz się uczyć podstaw i nie programowałeś nigdy wcześniej to ta z 2005 będzie tak samo dobra jak i współczesna - podstawy się raczej nie zmieniły. Jeśli umiesz jako-tako programować to szukaj czegoś nowego opisującego bardziej dobre praktyki w C# i wzorce projektowe itp. Najlepiej samemu przejrzeć daną książkę i samemu wybrać co Ci najlepiej podpasuje - chodzi o styl książki, kolejność i sposób wprowadzania nowych informacji, a czasem nawet i szatę graficzną. A najlepiej to po prsotu pisać swoje programy - znaleźć sobie jakiś cel i go spróbować rozwiązać w praktyce. A w sumie C# jest dość szeroki i jeszcze możesz doprecyzować pytanie, czy chcesz pisać aplikacje webowe, programy okienkowe czy jeszcze coś innego?

poljet

Też lubię książki.


  • Porada: masz tam u siebie wyższą uczelnię? Otwórz katalog biblioteczny i zobacz czy mają książkę do C#. Zwykle do czytelni nie musisz się zapisywać, a do biblioteki możesz zapisać się nawet nie będąc studentem.

  • Protip 1: www.google.pl -> "hackernews C# book", https://www.manning.com/books/c-sharp-in-depth-fourth-edition ?

  • Protip 2: a Zeal Pan zna?

  • Ostrzeżenie: pod żadnym pozorem nie kupuj książek technicznych na Amazone, żadnych i nigdy. Amazon sprzedaje podrobione książki: na kiepskim papierze, z błędami drukarskimi, rozpadające się. Temat jest znany, ale przypomnienie nie zaszkodzi.

Zaloguj się aby komentować

tłumaczę jak lajko sortuje posty żeby stworzyć inaczej posegregowaną listę

^ to na górze tak napisałem, bo tzw. slug (sprawdźcie jak wejdziecie w posta to jak wygląda adres w przeglądarce) generuje się na podstawie początku wpisu. Wydaje mi się, że to może być istotne dla SEO, a mnie nie boli. Może zadziała jako darmowy clickbait.

jeśli nie wiesz o co chodzi, albo nie wiesz co to terminal, to tutaj post wprowadzający: https://www.hejto.pl/wpis/programowanie-javascript-tworczoscwlasna-gruparatowaniapoziomu-lajko-lt-moj-tag-?commentId=13977332-7772-4f89-a067-d76784aa5c18

Ale dzisiaj nie o tym - dzisiaj o tym jak to się dzieje, że mamy tablicę postów posortowaną chronologicznie a potem robimy z niej topkę.

Wszystko dzieje się w pliku process.js i do wszystkiego doszedłem googlując, bo na początku prawie nie wiedziałem co się dzieje (poza typowymi koncepcjami z programowania jak `if` albo `for`).

Pierwsza ważna uwaga - to nie jest tak, że napisanie tego kodu to jest to samo co napisanie 62 linijek tekstu. Kod który widzicie, to efekt prawdopodobnie ~8 godzin pracy w sumie na dwa pliki (średnio 4h na plik) i parę miesięcy rozważania różnych projektów i rozwiązań. Ale o pracy z ADHD też innym razem xD

No więc jak już napisałem jak trudno było napisać, to mam nadzieję że było warto i będzie łatwo zrozumieć.

Kawałek po kawałku;
- te linijki z `require` są po to żeby móc używać funkcji które ktoś inny napisał. W moim przypadku potrzebuję jeszcze poza "standardem języka";
- czytania i zapisywania plików (moduł `fs`)
- procesowania argumentów z wiersza poleceń (terminala) (moduł `yargs`).
- Ten drugi moduł to wynika z mojego doświadczenia - teraz mogę sobie wpisać który plik chcę przesortować (`--source=data-snapshots/{czas_w_ktorym_odpaliliscie_scrapejs}.json`) i według jakiego "algorytmu" sortowania ()

Oba znalazłem po prostu googlując 'how to <tutaj to co chciałem zrobić np. parse command line arguments in nodejs>'.

Potem to już było metodą prób i błędów - sprawdzam czy istnieje folder na wyniki, jak nie to tworzę. Sprawdzam komendę, sortuję z pomocą wybranego KOMPARATORA (zaraz o tym) i zapisuję do podfolderu stworzonego dla wybranego algorytmu (funkcja `savePosts`).

No dobra, to teraz o tym czym jest KOMPARATOR. Może słyszeliście kiedyś, że naukę programowania powinno się zacząć od algorytmów sortowania. To prawda. Ale nie dlatego, że są często używane, tylko dlatego że pokazują że jest dużo metod na wykonanie nawet prostej czynności, a w dodatku można je porównywać. A to porównywanie można łatwo obrazować.

Ale to nie studia tylko portal ze śmiesznymi papieżami xD

Na portalach z papieżami oraz w życiu nie pisze się funkcji sortujących, a co najwyżej KOMPARATORY - czyli funkcje które przyjmują dwa argumenty i zwracają informację który z nich jest mniejszy lub większy - czyli w jakiej kolejności względem siebie powinny się znajdować w wynikowej tablicy.

W przypadku JavaScriptu (co też znalazłem w necie xD https://www.w3schools.com/js/js_array_sort.asp sekcja "Numeric Sort") powinniśmy zwrócić liczbę ujemną, zero albo liczbę dodatnią;
- ujemną jeśli obiekt który jest pierwszym argumentem (postA) powinien być w wynikowej tablicy PRZED drugim (postB)
- dodatnią jeśli obiekt który jest pierwszym argumentem (postA) powinien być w wynikowej tablicy ZA drugim (postB)
- zero, jeśli obiekty są równe

Jak mi nie wierzycie to możecie sprawdzić na kartce, ale jest nawet w przykładach na podanej stronie, że jak mamy dwie liczby A i B wynik operacji `A - B` da nam w wynikowej tablicy liczby posortowane rosnąco.

I teraz żeby to było użyteczne dla nas, to napisałem dwie funkcje. Najpierw zobaczmy prostszą - `compareByCommentLikes`. A właściwie `commentLikes`, bo to ta funkcja liczy "wartość posta". Otóż `commentLikes` przechodzi po wszystkich komentarzach i dodaje ich lajki do `likeSum` a gdy przetworzy już wszystkie komentarze, to zwaca `likeSum`.

Na tej podstawie napisałem kolejną funkcję - `compareByLikesTotal`. Co sprytniejsi mogli zauważyć, że rożni się ona jedynie dodaniem do sumy lajków z komentarzy lajków oryginalnego wpisu. Tak więc licząc wartość posta dla tego "filtra" dodam sobie lajki oryginalnego wpisu do wartości posta która jest liczona przez poprzednio opisaną "funkcję wartości" - `commentLikes`.

Z pozostałych sztuczek - jak się napisze `${cos} i reszta tekstu`, to zamiast `${cos}` zostanie wstawiona wartość zmiennej `cos`. Tak więc następujący kod;

let cos = "stary leży"
console.log(`${cos} najebany na wersalce`)

wypisze w konsoli `stary leży najebany na wersalce`. pdk (nie taguję bo ponoć tylko pięć pierwszych tagów działa) - zapraszam do postowania źródłowej piosenki w komentarzach

Co robi `split` to sobie możecie poeksperymentować sami, polecam wypisać (`console.log`) samo `source` i `source.split('/')` i zobaczyć co się dzieje.

O funkcji w której robię przy zapisywaniu `if (err)` porozmawiamy sobie w nieodległej przyszłości - omawiając plik `scrape.js`.

Następny wpis nie jutro, a pojutrze. Powód jest prozaiczny - wyjeżdżam na weekend i pisząc w czwartek piąty post zdałem sobie sprawę, że ważne jest by pisać regularnie (czemu? przekonacie się według nowego rozkładu jazdy już 21.09), a żeby pisać regularnie - to trzeba mieć dostatecznie dużo czasu na pisanie. A jeśli będzie mnie to stresowało, to chuj będzie nie seria, bo się wypalę, a Wam się znudzi.

Tak więc pojutrze porozmawiamy sobie o tym jak pisać w języku którego się nie zna - czyli jak urządzić sobie środowisko pracy i dlaczego jeśli jesteś biedny to masz o wiele mniejsze szanse podczas nauki oraz na rynku pracy.

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

ok i co to ostatecznie robi ? jak to ulepsza stronę ?

Zaloguj się aby komentować

Czy wiesz że:
Android i iOS mają specjalne API do zbierania danych o aktywności seksualnej?
Czy to nowy poziom targetowania reklam?

public final class SexualActivityRecord implements Record

Captures an occurrence of sexual activity. Each record is a single occurrence. ProtectionUsed field is optional.

Pole "użyto antykoncepcji" jest opcjonalne xD
Bez obaw, nie ma pola: "Czas trwania"

Ktoś lepiej obeznany jest mi w stanie powiedzieć jak oni to mierzą?

https://developer.android.com/reference/androidx/health/connect/client/records/SexualActivityRecord

https://developer.apple.com/documentation/healthkit/hkcategorytypeidentifier/1615769-sexualactivity/

#android #ios #programowanie i chyba #szpiegujo
LondoMollari

Ktoś lepiej obeznany jest mi w stanie powiedzieć jak oni to mierzą?


@entropy_ Może smartwatche + mikrofony?

entropy_

@LondoMollari ciekawe czy zliczy jak włączę głośno film dokumentalny xD

def

@LondoMollari nie mierzą, to api dla zewnętrznych aplikacji/akcesoriów

wombatDaiquiri

@entropy_ jak się dowiesz to daj znać, jestem mega ciekaw ile normalnych czynności wygeneruje powiadomienie "czy walisz konia?" xD

shiranai

W przypadku Googla, ręczne wpisanie do Google Fit? Strzelam, że Apple też ma coś takiego.

Można bardzo łatwo sprawdzić - potrzebny jest program listujący aktywności oraz partnerka (cielista lub dmuchana )

Zaloguj się aby komentować

#gamedev nie wiem, czy dobrą społeczność wybrałem.
O co chodziło (już zmiękli troszkę;) w imbie z Unity:
"Pracując w branży od 13 lat wychodzę jeszcze z ery gdzie za silnik płaciło się 100 000 $ i coroczną subskrypcję. Mało kto mógł sobie pozwolić na tworzenie gier więc i developerów i gier było mało. Potem przestawiono się na model subskrypcyjny co miesiąc / co rok, od stanowiska, jeżeli masz mały zespół to płacisz odrobinę więcej, jak masz grupę 100 os. to płacisz per jednostka mniej, ale sumarycznie więcej i wszystko ok. Dzięki temu wzrosła liczba devów i firmy tworzące silniki zobaczyły: "O, dużo hajsu się generuje". Potem postanowiono wprowadzić darmowe silniki (+ ewentualną opcję premium z dodatkowym wsparciem autorów). Demokratyzacja narzędzi spowodowała lawinę developerów, z której to masy co jakiś czas trafia się spory sukces, od którego Unity czy Unreal postanowili pobierać procent. I to znów jest jak najbardziej ok - to spowodowało że np. Epic mimo że liczy swój procent od lifetime revenue gry, to nadal zarabia setki milionów rocznie. Unity również. Co łączy te wszystkie elementy? PRZEWIDYWALNOŚĆ. Wiesz ile musisz zapłacić co miesiąc , wiesz czego się spodziewać przy prospekcie finansowym. Jaki więc problem z pobieraniem opłat per instalacja? Otóż instalacja nie jest liczona per użytkownik / urządzenie tylko per FAKT INSTALACJI, więc każda instalacja: Na GamePassie, czy innej subskrypcji, w paczkach charytatywnych (tu się ponoć poprawili), każda instalacja na PC / konsoli / telefonie. Stąd generuje to ryzyko, że np. dany jeden zakup gry za 5$ nie kosztuje tych przysłowiowych 20 centów, tylko 20 centów x liczba instalacji których nie wiadomo ile może być. Dodatkowo, jest ryzyko, że nie dość że dyskontowane ale i pirackie kopie mogą generować koszty, a do tego użytkownicy mają możliwość np. generowania tych kosztów celowo, czyli mogą zrobić "install bombing" a tym samym pogrzebać finansowo developera. Przykład z życia - znajomy stworzył gierkę która kosztowała ok. 1$, miała 50 mln pobrań, ale koszt wydawcy i opłat pożerało 90% przychodu (licencja produktu, marketing, pozyskanie klienta, opłaty dla platform). Zostaje teoretycznie 5 mln$ ALE koszt developmentu dla developera (programiści, assety) to kolejne 2 mln. Idąc dalej mamy wciąż milionera, prawda? 3 mln$ ? Otóż nie - lifetime fees dla Unity to ok. 2 450 000$. Czyli zostajemy przy 550 000 dolców na czysto - i tyle mniej więcej mu zostało. Fantastyczne pieniądze (serio - fajnie zarobić ponad 2 mln złotych na gierce) To teraz wchodzą opłaty per instalacja - 50 mln instalacji to... uwaga: 1 020 000$. Czyli w powyższym przypadku znajomy JEST W PLECY 470 000. I to w przypadku, gdy każdy z klientów zainstaluje grę TYLKO RAZ. A teraz wyobraź sobie że każdy zainstaluje grę, odinstaluje i zrobi to ponownie... I jasne - 90% developerów nie będzie operowało na takich liczbach, ale wielu devów retroaktywnie może otrzymać opłaty to raz, dwa - jeżeli to przejdzie, to Unity będzie gotowało tą żabę i krok po kroku będzie dodawało kolejne elementy regulaminu bo kto im zabroni xD Tutaj chodzi o zatracenie zaufania do twórców silnika, niepewność kosztów developmentu, etc. Mam nadzieję, że dostatecznie szczegółowo to wyjaśniłem."
Komentarz spod filmiku na ten temat:
https://www.youtube.com/watch?v=CmHrTnUHvN8
globalbus

@PanGargamel to jest mechanizm opracowany pod tytułem "strata kazika" #pdk

Powinni mu jakieś tantiemy odpalić od tego.

cec

Frajerzy pokrzyczą, pojęczą, a i tak się nie nauczą korzystać z wolnego oprogramowania tylko będą płacić ¯\_( ͡° ͜ʖ ͡°)_/¯

dziadek_z_milionerów.mpg

PanGargamel

@cec niee, pewnie od 24h trwa przechodzenie na UE5

Barcol

@cec @PanGargamel no właśnie, na UE5, a mogłoby być na Godot ¯\_(ツ)_/¯

Yossarian

To jedna wielka manipulacja.


  1. Jeśli koszty są wyższe, niż przychody, to jest strata. Tak działa biznes. Każdy.

  2. Przewidywalność? Bardzo bym chciał mieć przewidywalność w moim sklepie internetowym, przecież klienci mogą zwracać towar, konkurencja obniży cenę... A co ma powiedzieć PZU, jeśli nagle klienci nieprzewidywalnie zaczną rozbijać częściej samochody? Nie ma czegoś takiego, jak przewidywalność. Możesz jedynie szacować ryzyko, robić projekcje finansowe. Jak źle oszacujesz- wypadasz z rynku na którym jest konkurencja, bo będziesz albo za drogi, albo pod wodą.


Nie wiem, o co chodzi ze zmianami w opłatach Unity, ale ten komentarz niczego nie tłumaczy, poza jednym - chlip, chlip, jest drożej i mi się nie spina. Brakuje jeszcze posta z Grupy Azoty, że gaz podrożał i powinien być tańszy.


PS Trzecie primo (ultimo!): opłaty od pirackich instalacji mi sie podobają. Nie umiesz zabezpieczyć gry, żeby użytkownicy płacili - płać ty.

rafal155

@Yossarian Wstyd byłoby mi pisać te dyrdymały nawet z zamysłem bycia trollem.

PanGargamel

@Yossarian obejrzałeś ten filmik ze zrozumieniem?

Zaloguj się aby komentować

#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 dupy, 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.
wombatDaiquiri

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

Yossarian

@wombatDaiquiri 


Jak można Ci postawić kawę?

wombatDaiquiri

@Yossarian absolutnie nie trzeba, w przyszłości jeśli mi starczy cierpliwości to zrobię swoją bramkę płatności w ramach tej serii. Ale bardzo dziękuję za wyrazy uznania.

VonTrupka

@wombatDaiquiri ale żeby nodejs? (☉__☉”)

92506c60-a52f-4158-9c69-c8523fd329b9
wombatDaiquiri

@VonTrupka ostatnio kupiłem NAS i 2x1TB dysk. Potrzebuję motywacji żeby go skonfigurować.


A tak serio, w pythonie nie rozumiem envów i nie chce mi się ich chwilowo poznawać. W go będziemy pisać trochę później, bo na tym etapie nie ma sensu się bawić w statyczne typowanie. No i będę chciał zrobić UI, to gdyby ktoś chciał się uczyć programowania na podstawie moich postów, to nie będzie musiał się uczyć ośmiu języków na raz.


Dorzucam do listy "tematów do poruszenia". A obrazek klasyk

VonTrupka

>ostatnio kupiłem NAS i 2x1TB dysk. Potrzebuję motywacji żeby go skonfigurować.


@wombatDaiquiri na mocy danej mi słowem honoru motywuję cię do konfiguracji NASa ku lepszemu życiu, łatwiejszym taskom i bezpieczeństwu danych.

Idźcie zatem i ... jedzcie vontrupke s cebulko ( ͡~ ͜ʖ ͡°)


Ja to cokolwiek opartego na nodejs mógłbym dopiero od niedawna odpalić, czego nie zrobiłbym na talerzowcu 5400.

Niemniej jednak idea całego nodejs jest dla mnie tak samo niepojęta, jak prawa fizyki zachodzące w czarnych dziurach (´・‸・ ` )

666

@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.

wombatDaiquiri

@666 ok, a co powinienem zrobić zamiast tego? Ten catch to jest głównie na 500 z hejto. A tematyka z czasem będzie się zmieniała - ale gdzieś trzeba zacząć. Dzięki a komentarz!

666

@wombatDaiquiri Wiadomka ze jakos trzeba zaczac a potem iteracyjnie rozwijac i ulepszac. Kip goin


Fix: jesli to jakas w miare nowa wersja node.js, tak 14+ to uzyj https://nodejs.org/docs/latest-v14.x/api/fs.html#fs_promises_api

Czyli troche inaczej robisz require/import ("fs" -> "fs/promises"), a potem zamiast callbacka dajesz

await fs.jakasfunkcja()


Dodaj testy w Jest to takie problemy mozna latwo wykryc

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
koszotorobur

@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

@koszotorobur ja to wszystko rozumiem, że biznes, że wzrost, że postęp. Ale czy naprawdę koniecznie muszę się uczyć wszystkiego zamiast pisać sobie stateless apki i pisać do działu adminów o bazę danych a potem przez tydzień się opierdalać aż stworzą?

koszotorobur

@wombatDaiquiri - tak dobrze to już nigdy nie będzie - większość firm chce zatrudniać wyłącznie ludzi-orkiestry

No chyba, że zatrudnisz się w jakimś zacofanym urzędzie czy banku - ale ja bym tam usechł

rayros

Tego nie ma tak dużo, zresztą chatgpt umie pisać konfiguracje

Meverth

@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
Half_NEET_Half_Amazing

@Unknow 

widzę Chroboka, grzmoce

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
ZohanTSW

Ktoś dzisiaj jeszcze pyta o różnice między pythonem 2 a 3?

Strus

@ZohanTSW Jak dla kogos to jest istotne to i tak nie chcesz w tej firmie pracowac

koszotorobur

@ZohanTSW - to takie trochę podchwytliwe Pytanie - sprawdza cztery rzeczy:


  • Czy ktoś pracuje z Pythonem na tyle długo by znać te różnice

  • Czy ktoś wie, że Python 2 jest End of Life

  • Czy ktoś wie jakie ulepszenia każda nowa wersja Pythona wprowadziła (i ich potrafi użyć)

  • Czy ktoś po prostu interesuje się Pythonem i jego ekosystemem i w jakim stopniu


Ja zdecydowanie bym nie zaakceptował oferty z firmy która wymaga używania Pythona 2 - niech się inni męczą

GetBetterSoon

@koszotorobur Na pythoninstitute.org jest tez zacny kurs.

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
macgajster

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.

Skylark

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.

macgajster

@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.

macgajster

@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

To kara za obsługę przycisków na przerwaniach ( ͡° ͜ʖ ͡°)

macgajster

@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...

cec

@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

@wombatDaiquiri co jest głównym założeniem?

własne "gorące"?

wombatDaiquiri

@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ć

#heheszki #humorobrazkowy #programista15k
80e214f0-fe8b-4e9b-8e23-36c9cc1f7300
viollu

@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.

wrazik

@viollu co ty gadasz musiałeś złego scruma spróbować nie da się nie lubić mówie ci różne są

otoczenie_sieciowe

Scrum działa najlepiej wtedy kiedy każdy ma wywalone na święte zasady i stosuje co najwyżej jakiś customowy zalążek scruma

globalbus

@otoczenie_sieciowe tzw sradżajl

sebie_juki

@otoczenie_sieciowe @globalbus raczej scrum-but (jak w "we have scrum but we don't do dailies")

e5aar

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ć