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ę ?

wombatDaiquiri

@bimberman nijak. Jak przeczytasz pierwszy post, to tam wyjaśniam że chcę sobie stworzyć nowe "gorące" i poprawić kilka innych rzeczy które mi się na tym portalu nie podobają. No i opisuję to w formie takich artykułów "nauka programowania". Kod z mojego repozytorium ( https://github.com/wombatDaiquiri/lajko ) możesz sobie pobrać i odpalić na kompie. Z czasem mam nadzieję dodawać ciekawsze funkcje.

bimberman

@wombatDaiquiri dzięki za odpowiedź, chodziło mi raczej o wypunktowaną listę co byś chciał poprawić /zmienić ? a co uważasz za zbędne ? w obecnej wersji ?

wombatDaiquiri

@bimberman nie podobają mi się "gorące" - bo lizanie dupy grupom odbiorców za dobrze promuje materiały, czarnolisto bo pozwala na manipulacje, brak statystyk "per użytkownik", brak informacji ile osób zobaczyło mój post, brak informacji jak dobrze moje posty radzą sobie na tle innych, brak "live feedu" na którym mógłbym odpowiadać "na żywo" zamiast odświeżać i skakać między wątkami, brak możliwości "cross-postingu" na inne media społecznościowe, ustalania daty publikacji posta, sprawdzania kto lajkuje i jak czytelnicy zmieniają się w czasie.


to takie rzeczy które mam "na pierwszy rzut myśli", pewnie znajdzie się tego więcej - jako Polak zawsze dam radę się do czegoś przyczepić i ponarzekać ( ͡° ͜ʖ ͡°)

bimberman

@wombatDaiquiri spoko dzieks, sam się zastanawiałem czy warto coś pogrzebać myślałem o zrobieniu pluginu do ff z kilkoma ulepszeniami bo wtedy masz bezpośredni dostęp do żywej strony i możesz dużo zmanipulować coś dograć coś wywalić itp,

pomyśle o tym co wrzuciłeś

wombatDaiquiri

@bimberman nie warto, ale jak masz ochotę to warto ( ͡~ ͜ʖ ͡°) gdybyś się zdecydował, to proszę zawołaj mnie do posta, chętnie poczytam!

bimberman

@wombatDaiquiri hmm chyba mnie zmotywowałeś , zobaczę co uda mi się ulepić przez weekend

Zaloguj się aby komentować