Moje dawno odzyskane ogniwa Li-Ion (i nie tylko te) głównie leżakują w pudle. Postanowiłem cześć wykorzystać do budowy prostej baterii warsztatowej, która może mi się przydać przy zasilaniu różnych eksperymentalnych układów. Prostota jest najważniejsza, ale wykorzystanie gołych ogniw może być niebezpieczne w warunkach warsztatowych, gdzie o jakieś zwarcie i inne błędy nie trudno, dlatego potrzebny jest jakiś kontroler i zabezpieczenie…
To tylko zajawka z moich ostatnich eksperymentów i zabaw, mam nadzieję, że wkrótce pojawi się tutaj cały materiał ;)
Wprowadzone w C++11 wyrażenia i funkcje lambda umożliwiające “inlinowe” definiowanie lokalnych funkcji anonimowych były chyba jednym z najbardziej wyczekiwanych, a później docenionych, nowości dodanych w 2011 roku do języka C++. Dzisiaj raczej ciężko byłoby się bez nich obejść w codziennej pracy. Ale czy ktoś zastanawiał się jak one działają i jak zostały zaimplementowane pod maską języka i kompilatora?
Sam zaciekawiony tymi elementami postanowiłem zastanowić się nad możliwymi sposobami implementacji tych konstrukcji językowych oraz zajrzeć do środka sprawdzając jak to zostało zrobione.
Jak to zawsze bywa z UserScript-ami, niespodziewanie i nagle przestają działać. Allegro znów musiało coś pod maską pozmieniać, bo brakuje wyświetlania lokalizacji użytkownika na stronach aukcji.
Po szybkim sprawdzeniu okazuje się, że nic się tym razem nie wywala, tylko ten node, który zawsze zawierał bebechy Reacta już ich nie ma i getReactInst zwraca undefined. Po testach wyszło na jaw, że po pierwszym odpaleniu zakładki (boxa) z informacjami o “Dostawie i płatności” te wewnętrzne elementy pojawiają się w obiekcie DOM-owym.
Po odkopaniu mojego starego hacka na pseudo-lambdy sprzed ery C++11 z wykorzystaniem klas lokalnych, postanowiłem trochę głębiej pogrzebać wokół tego niezbyt popularnego i chyba mniej znanego elementu języka C++. Może ktoś wykorzystuje takie klasy i uda mi się znaleźć jakieś ciekawe zastosowania i użycia tej konstrukcji.
Natrafiłem na jakiś stary, sprzed ponad 5 lat, kod mojego autorstwa, gdzie w projekcie z różnych powodów używaliśmy starego środowiska, kompilatora lub języka w standardzie C++03. Były to już czasy grubo po premierze C++11 no i jak to bywa, człowiek zachłyśnięty nowymi elementami języka, strasznie usprawniającymi pracę, musiał sobie jakoś radzić w szarej rzeczywistości. Dla mnie takim największym problemem był brak anonimowych funkcji i wpadłem wtedy na genialną pseudo-protezę funkcji lambda, aby tylko nie trzeba było definiować zewnętrznych funktorów ;)
Przed świętami zrobiłem kilka poprawek w moich skryptach użytkownika, a teraz po świętach znów czekają mnie hurtowe poprawki, bo po wyczyszczeniu cache-u przeglądarki niektóre skrypty przestały poprawnie działać.
W logach konsoli często pojawiał się komunikat o problemach z dodawaniem jakiś elementów do dokumentu, na przykład jak ten poniżej, z jednego z moich innych skryptów próbujący wstrzyknąć jakieś CSS-y do nagłówka dokumentu:
Uncaught (in promise) TypeError: Cannot read property 'appendChild' of null at eval (userscript.
Do pełni szczęścia w poprawkach moich UserSripts brakuje jeszcze zabawy z YouTube Block Popups (SignIn/GDPR).
Skrypt ten nie był dawno aktualizowany, ale na szczęście dobrze sobie radził do tej pory z blokowaniem wyskakujących okienek zachęcających do zalogowania i/lub cookie-zgody i wymuszonym przerywaniem odtwarzania video.
W sumie jego logikę można byłoby obecnie zawrzeć w kilku linijkach filtrów do AdBlocka (znalezione na r/uBlockOrigin):
! YT consent youtube.com##+js(set, ytInitialData.topbar.desktopTopbarRenderer.interstitial.consentBumpRenderer.forceConsent, false) youtube.com##+js(json-prune, [].response.topbar.desktopTopbarRenderer.interstitial.consentBumpRenderer) youtube.com##+js(json-prune, topbar.
Jak już dziś zacząłem się babrać w JS-ie, to może skrypt do poprawek UI na głównej YouTuba też poprawię ;)
Poprawki mało znaczące, takie kosmetyczne, bo jedynie dostosowujące mój wstrzykiwany kod CSS do zmian na stronie. Dotyczących tylko “szkieletu” wyświetlanego przed załadowaniem się decylowej aplikacji, bo od jakiegoś już czasu widoczne było, ze te szare prostokąciki wyświetlane są w oryginalnej wysokości.
Ciężko mi powiedzieć co tam się pozmieniało w kodzie strony, ale wystarczyła zmiana nazwy selektora klasy, plus dodatkowe styl dla rodzica, aby wszystko wróciło do normy - utrzymania spójności strony głównej z innym i podstronami listującymi video, do czego w ogóle powstał YouTube Polymer UI Fix.
Skoro wydałem poprawki do skryptu na Allegro to skusiłem się też na naprawienie długo olewanego przeze mnie problemu ze skryptem do serwisu Olx i wypuszczenie nowej wersji tegoż skryptu.
Jedną z wykonywanych rzeczy przez olxowy skrypt użytkownika jest poprawienie wygody korzystania z paginacji. Skrypt dodaje własne elementy z odnośnikami do poprzedniej/następnej strony wraz z bardziej adekwatnymi ikonkami.
Ikonki te to nic innego jak glify pochodzące z ikonkowej czcionki. Kody znaków na sztywno dodałem w stylach:
Ostatnia wersja allegrowego skryptu długo utrzymywała się na powierzchni bez potrzeby poprawek. Niestety czas ten minął, bo na stronach aukcji nieco zmieniono strukturę i wygląd, co wymaga interwencji i nowej wersji.
Głównym zadaniem skryptu na stronach aukcji jest dodanie informacji o lokalizacji sprzedającego. Idealne do tego miejsce znajduje się tuż nad “Szczegółami o dostawie i płatności”. Kod do szukania kontenera na wstawkę jest banalny:
// wstawiamy nad wierszem z wyszczegolnionymi info o dostawie // dlatego szukamy poprzednika diva zawierajacego pierwsza linie node = itemNode.