Lubię od czasu do czasu zasiąść za klawiaturą i pobawić się w generowanie losowych spacerów, o czym starsi Czytelnicy zresztą dobrze wiedzą i już zaczynają ziewać (chociaż jeszcze porządnie nie zacząłem).
Tym razem zamiast produkować pierdylion obrazków, zrobiłem sobie skrypt, który generuje jeden obrazek dziennie i zapisuje go w folderze Apacza. Apacz z kolei, za pomocą prostego widżetu HTML, łapie ów obrazek i prezentuje go na marginesie blogu. Et voila!
Generowanie obrazka jest wołane ze skryptu w bash
, który aktywuje właściwe środowisko wirtualne Pythona, następnie uruchamia skrypt w Pythonie, który wylicza trasę i produkuje plik .png
w lokalnym folderze. Następnie plik ów jest kopiowany do folderu www Apacza i w ostatnim kroku zmieniamy mu właściciela ze mnie na www-data
, żeby się go dało wyświetlić na wuwuwu.
Środowisko wirtualne jest potrzebne, bo skrypt Pythona używa kilku bibliotek, nieistniejących w instancji systemowej:
matplotlib
do narysowania spacerunumpy
iscipy
do "wygładzenia" trasy spacerusympy
do sprawdzenia pierwszości numeru bieżącego kroku (żeby zmienić kierunek zakręcania na przeciwny - bez tego wszystkie spacery zakręcają cały czas w prawo i jest nudno)
Ponadto, wyłącznie dla sportu, pokazuję na wykresie długość całej trasy, a także odległość między początkiem a końcem.
Któraś z pierwszych wersji skryptu podróżowała po torusie (pionowe krawędzie "sklejone", podobnie jak poziome), ale dla niektórych dat generowało to strasznie nieczytelne trasy, więc teraz wykres jest po prostu przeskalowany tak, żeby się zawsze zmieścił w całości, bez zawijania.
Po co to wszystko?
Bo się da!
Szczegółami technicznymi być może podzielę się w innym wpisie, jak mnie wena najdzie. Póki co - proszę po prostu podziwiać.
(Pana w ostatnim rzędzie uprasza się o zasłanianie ust przy ziewaniu!)
Tyle pytań, uwag, komentarzy…
1. Spacer jest losowy (zgodnie z tytułem) czy deterministyczny, na podstawie daty, jak sugeruje treść („ale dla niektórych dat generowało to”)?
2. Kiedy dokładnie następuje zmiana pliku? Północ?
3. Możliwe, że nieco przekombinowujesz z generowaniem (venv, kopiowanie, chown).
4. Tekst na obrazku jest nieczytelny, nawet na komputerze, o telefonie nie wspomnę. Może lepiej wstawiać go jako podpis? Albo żeby pojawiał się po najechaniu myszą na obrazek. W każdym razie jako tekst w przeglądarce.
> Spacer jest losowy (zgodnie z tytułem) czy deterministyczny
Pseudolosowy, oparty na dacie. A więc deterministyczny. A więc tytuł kłamie. Co potwierdza powszechnie znaną tezę, że media kłamią 🙂
> Kiedy dokładnie następuje zmiana pliku? Północ?
Teoretycznie – o północy w Niemczech (tam bowiem chwilowo stoi serwer z blogiem). Faktycznie to nie wiem, coś się chyba popiętroliło z cronem, będę walczył we wolnej chwili. Dzisiaj odświeżyłem ręcznie.
> Możliwe, że nieco przekombinowujesz…
Absolutnie się zgadzam!
> Tekst na obrazku jest nieczytelny…
Też powalczę, jak już naprawię crona.
Okazało się, że jeżeli skrypt bash jest wołany z crona, to polecenie „source” nie działa. A więc venv się nie aktywuje itd. Zastąpienie „source” kropką pomaga. Są szanse, że tym razem o północy obrazek się zmieni automagicznie, bez mojej manualnej interwencji.
P.S. Powiększyłem czcionkę i uprzezroczyściłem etykietę. Teraz powinno być odrobinę czytelniej, nawet na mobilku.
Teraz zasłania trasę…
MSPANC
Wiem, też nad tym ubolewam. W planach mam dodanie do etykiety informacji o procentażu trasy przykrytego etykietą, z rozbiciem na piksele kwadratowe i linearne, oraz szczegółową analityką z uwzględnieniem ostatnich 365 tras (366 w latach przestępnych). Alternatywą mogłoby być umieszczenie tej informacji wzdłuż trasy spaceru, ale to mogłoby wpłynąć na czytelność, zwłaszcza że trasa czasem przecina samą siebie, więc musiałbym kombinować w 3D. Kolejną opcją byłoby ustawienie przezroczystości tekstu i ramki na 100%.
Tyle możliwości, tak mało czasu…
Ach, gdyby tylko dało się tekst umieszczać jako tekst pod obrazkiem, a nie embeddować go w obrazek…
Alternatywnie można go też embeddować pod obrazkiem. Wtedy i wilk syty, i karawana na pochyłe drzewo dopóki jej się ucho nie urwie.
Można. I wtedy też nie będzie działało skalowanie, wyszukiwanie itd.