poniedziałek, 16 maja 2016

Joy Ride Bike Fest 2016

Na festiwal zgłosiłem się kilka dni po otwarciu zapisów online. Wiedziałem, że chcę jechać, bo rok temu mi się podobało i uważam, że 150zł za 3 dni jeżdżenia wyciągiem, zawody w różnych konkurencjach z profesjonalnym pomiarem czasu, fajne targi i możliwość testowania rowerów czołowych producentów (w tym roku aż 5), to bardzo dobra oferta. Także nawet się nie zastanawiałem, tylko od razu zapłaciłem.

Piątek
Przyjechałem około dwunastej, przebrałem się i poszedłem pojeździć. Akurat byłem zapisany na testowego Canyona Strive'a i Speca Enduro, więc to od nich zacząłem zabawę. Nie będę mówił, że mnie zaskoczyło, że to bardzo dobre rowery, bo tego się oczywiście spodziewałem. Rok temu miałem tylko sztywniaka i nigdy wcześniej na fullu nie jeździłem, ale po festiwalu stwierdziłem że chce fulla. Spodobało mi się tam wtedy jeżdżenie na treku slashu, więc właśnie taki rower kupiłem. Tym razem czułem się więc na fullu pewniej i łatwiej było mi porównywać testówki do mojego sprzętu. Trafiły mi się wersje z carbonowymi ramami i naprawdę odczułem różnicę w jeździe. Lekki rower zauważalnie lepiej się prowadzi niż mój i nie jest to subtelna różnica tylko naprawdę widoczna. Zauważyłem też, że chyba wolałbym szerszą kierownicę niż aktualnie 750mm - te dwa rowerki miały 780mm i była to ich kolejna zaleta.
Mimo, że chciałbym rower na carbonowej ramie (no bo kto by nie chciał?), to raczej nie prędko w taki zainwestuję, bo jednak względem alu trzeba sporo dołożyć, a mój Slash i tak jest "na wypasie" i zdaję sobię sprawę, że na carbonowym jakoś znacznie lepiej jeździć nie będę. W każdym bądź razie, jeśli ktoś zastanawia się między wyborem rowerów takich jak Canyon Strive, Specialized Enduro czy Trek Slash, to ja bym po prostu sugerował wybrać najkorzystniejszą cenowo ofertę. Moim zdaniem każdy z nich to topowy sprzęt i na każdym jeździ się bardzo dobrze. Czyli co pan nie kupisz będziesz pan zadowolony.

Piątek był też przede wszystkim dniem rozpoznawczym, tego co się w Kluszkowcach pozmieniało. Niestety pogoda była kiepska - co jakiś czas padał deszcz i na trasach robiło się ślisko. Na pierwszy ogień poszedł a-line. Trasa jest przyjemna - lubię ją. Dużo hopek, bez jakichś hardkorowych przeszkód i z dropami w różnych wersjach, które można oczywiście ominąć. Tylko ten step up jakiś bezsensu, bo zdecydowana większość ludzi nie była w stanie go dolecieć. Trasa generalnie była do zawodów dobrze przygotowana, choć były pewne mankamenty, o których za chwilę.

W piątek zrobiłem też jeden przejazd trasą dh. Nie jestem zjazdowcem i to kolejna trasa, która mi to pokazała... Była trudna. Dla mnie za trudna. Na endurówce nie czułem się tam zbyt pewnie. Budowniczy bardzo dobrze wykorzystali to co mieli i trasa mimo że krótka, jest dość konkretna. Przynajmniej takie są moje odczucia. Z minusów to chyba tylko ta sekcja luźnych głazów na wjeździe do lasu i lekki podjazd pod koniec. Chwali się jak trasa dh jest wymagająca, a ta według mnie jest. Czyli jest dobrze.

Teraz będzie trochę narzekania - wróćmy do mankamentów, o których wspominałem. Niestety podczas jednej przejażdżki a-linem zaliczyłem glebę. Zaczynało padać, a deszcz i drewniane konstrukcje nie za bardzo się lubią. Najeżdżałem na dropa w końcówce a-line'a (tam gdzie są dwa dropy i po nich hopka w bandę), i skręciłem na tego mniejszego. Na początku dropa jest siatka antypoślizgowa, ale czemu nie ma jej na końcu to nie mam pojęcia. A, że na dropa trzeba najechać pod kątem, to efekt był taki, że uciekły mi koła i bez możliwości zrobienia czegokolwiek poleciałem jak worek kartofli w dół. Nic przyjemnego i jestem przekonany, że mógłbym tego uniknąć gdyby tylko była tam ta cholerna siatka. No ale trudno - taki sport, gleby się zdarzają. Pomyślałem jednak, że skoro prognozy pogody są kiepskie, to zasugeruję organizatorom, że ta siatka by się tam przydała. Na joyride przyjechało dużo osób - jedni lepsi, drudzy gorsi i myślę że warto zadbać o bezpieczeństwo tych mniej doświadczonych. Dlatego poszedłem do jednego gościa z ekipy joyride i powiedziałem mu, że może można by tam zamontować siatkę, bo trzeba trochę na dropa skręcić i jest niebezpiecznie. W odpowiedzi usłyszałem wypowiedziane lekceważącym tonem "chłopaki, tyle lat tam jeżdżę i nigdy nic się nie stało. Musicie wolniej jeździć". Zatkało mnie. "MUSICIE WOLNIEJ JEŹDZIĆ".  Że co proszę? Drop na którego wjeżdża się prawie zerową prędkością i gość ci powie, że musisz wolniej jeździć. Ręce opadają. Na szczęście gdzieś tam obok stał Siara i szybko uratował sytuację mówiąc "damy tam siatkę". 

Poprzeglądałem jeszcze wydarzenie na facebooku i widzę, że chyba nie tylko ja zgłaszałem problem, co utwierdza mnie w tym, że moja sugestia była słuszna. Zresztą sami spójrzcie:

Dokładajo do dżojrajda :(

Całkiem sporo lajków

Chyba nie tylko ja jechałem tam za szybko...

A to moja pamiątka  - przez tydzień nie pośpię na lewym boku :(



Wieczorem pointegrowalismy się całą, bardzo liczną ekipą, która przyjechała z Rybnika. Wnioski? 
1. Znakomita ekipa i do jazdy i do pijaństwa
2. Mój dziadek pędzi przepyszne wino ;)
Zresztą ten dzień to chyba całe Kluszkowce zakończyły w podobny sposób.

To tylko część z nas
Tu już trochę niewyraźnie :))


Sobota
W sobotę cały dzień deszcz. Raz padało, a raz lało. Nie chciało przestać nawet na chwilkę. Przez to calutki dzień spędziłem w pensjonacie. Tego dnia zaplanowany był dual i podobno wszyscy, którzy tam byli nieźle wymarzli. Gratulacje dla Kuby Kocjana - mojego teamowego kolegi, który wygrał dual w kategorii junior. 
Mi natomiast bardzo szkoda, że ten dzień tak uciekł :(
Jedyne co zrobiłem tego dnia to zobaczyłem film. Jagten (Polowanie). Polecam.

Niedziela
Niedziela to dzień zawodów DH, w których ostatecznie postanowiłem nie startować i zawody na pumptracku. 
Na pumptracku sobie wystartowałem, ale poszło mi niestety gorzej niż bym chciał. Nie takie proste te kręcenie się w kółko jakby się mogło wydawać. W przejedzie na jedno okrążenie chciałem zejść poniżej 8s, co się nie udało, a w przejedzie na dwa okrążenia poniżej 16s, co też się nie udało. Ostatecznie byłem 7. Na pumptracku miał miejsce ciekawy pojedynek między Bartkiem Giemzą i Pawłem "Koparą" Wieczorkiewiczem. Chłopaki razem budują pumptracki w BT Project, więc to takie jakby derby. Tym razem Kopara "porobił" Giemzę w eliminacjach i było widać, że miał sporą chrapkę na  powtórkę w finale. Niestety wypadł, więc skończył niesklasyfikowany, także wygrał Bartek (13.41s), przed Sławkiem Łukasikiem (+0.31s) i Mariuszem Jarkiem (+1.03). Trzeba jednak dodać, że całą tą ekipę i tak przegonił junior - Artur Więcławek (rocznik 2001) z czasem 13.16s. Całkiem przyjemne takie luźne ściganki. 

W niedzielę przejechałem się też trasą "FR". Odbija się na nią z aline'a prawie na początku, zaraz za tym pierwszym dabelkiem na trasie. Dopiero w niedzielę się o tej trasce dowiedziałem, a tak to może zjechałbym nią jeszcze parę razy, bo była całkiem całkiem. Nie za szybka, dość stroma i mocno techniczna. Dużo korzeni, trochę kamieni i bardzo ciasno. Miłe urozmaicenie!

Potem już tylko szybkie pakowanie i do domu.

Podsumowanie
Pogoda sporo napsuła. Piątkowy dzień w kratkę - raz względnie sucho, raz bagno. Sobotni dual rozegrany tylko dzięki determinacji tych zawodników, którym chciało się moknąć i marznąć. W niedzielę dobry downhill i miłe zawody na pumptracku. Nie wspomniałem w całym tekście o enduro i maratonie (bo to dla mnie osobne imprezy) i flybagu który miał być, a go nie nie było. Mi to tam obojętne, ale w niedzielę to raczej mógł stać, tym bardziej, że w poprzednich latach trochę chętnych na poduchę było. Jak ktoś na poduchę czekał, to raczej może się czuć lekko zawiedziony (oszukany?).

Ja szczerze mówiąc to nie najeździłem się przez te 3 dni, ale to raczej przez to siedzenie w domu w sobotę i kiepską pogodę, która nieco hamowała mój zapał do jazdy. Jak zwykle na dżojrajdzie było masę zajawkowiczów, którzy przyjechali dobrze spędzić czas. W kolejkach do wyciągu nie było spin, w drodze na górę, można było miło pogawędzić i generalnie panowała bardzo luźna, przyjemna atmosfera. Dobrze widzieć, że w naszym rowerowym światku jest tak wielu wspaniałych, życzliwych ludzi! Trasy w Kluszkowcach też są w porządku - myślę, że każdy sobie tam pojeździ i znajdzie coś dla siebie.

To czy impreza rowerowa jest udana, czy nie, zależy przede wszystkim od zawodników, od ich podejścia, nastrojów i myślę, że o tym należałoby częściej pamiętać.


Joy Ride BIKE Festival 2016 zakończony. Ja zostaję z lekkim niedosytem, obolały, ale ogólnie zadowolony.


Zdjęcie zamieszczone przez użytkownika Artur (@aknowakowski)


A siatka na dropie się nie pojawiła...

środa, 11 maja 2016

RaspberryPI Python service - exit nicely with GPIO.cleanup()

I have my python script used as a linux service. It is started by start-stop-daemon from /etc/init.d/myservice script. Because my program uses GPIO, I was thinking how to call GPIO.cleanup() when I stop my service with sudo service myservice stop command.

The solution I've found is to register signals handlers. It looks like:
 
import signal
handle_exit(signal_number,stack):
    GPIO.cleanup()
    exit()

signal.signal(signal.SIGTERM, handle_exit)
signal.signal(signal.SIGINT, handle_exit)

You may find great explanation of signals here, but what you need to know is that SIGTERM is sent for example when you simply kill your program with kill command (without -9) and SIGINT is a result of pressing Ctrl+C. The handler is called with two arguments: the signal number and the current stack frame (but it doesn't matter in this example - you only have to define them as arguments to avoid the error "TypeError: handle_exit() takes no arguments (2 given)")

If you don't know how to create script starting your python app when system starts up, you should read this tutorial: http://blog.scphillips.com/posts/2013/07/getting-a-python-script-to-run-in-the-background-as-a-service-on-boot/

To make this tutorial's code work with your signal handlers you should change the following line:
start-stop-daemon --stop --pidfile $PIDFILE --retry 10  
to
start-stop-daemon --stop --pidfile $PIDFILE --retry TERM/30/KILL/5 --oknodo --user $DAEMON_USER  

This will send TERM signal when you type sudo service myservice stop, and because of registered handlers, your app will exit nicely.


This is a full code of my script placed in /etc/init.d/
#!/bin/sh

### BEGIN INIT INFO
# Provides:          startgate
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Put a short description of the service here
# Description:       Put a long description of the service here
### END INIT INFO

# Change the next 3 lines to suit where you install your script and what you want to call it
DIR=/home/pi/bmxstartgate13-02-2016/bmxstartgate
DAEMON=$DIR/startgate.py
DAEMON_NAME=startgate

# Add any command line options for your daemon here
DAEMON_OPTS=""

# This next line determines what user the script runs as.
# Root generally not recommended but necessary if you are using the Raspberry Pi GPIO from Python.
DAEMON_USER=pi

# The process ID of the script when it runs is stored here:
PIDFILE=/var/run/$DAEMON_NAME.pid

. /lib/lsb/init-functions

do_start () {
    log_daemon_msg "Starting system $DAEMON_NAME daemon"
    start-stop-daemon --start --background --pidfile $PIDFILE --make-pidfile --user $DAEMON_USER --chuid $DAEMON_USER --startas $DAEMON -- $DAEMON_OPTS
    log_end_msg $?
}
do_stop () {
    log_daemon_msg "Stopping system $DAEMON_NAME daemon"
    #start-stop-daemon --stop --pidfile $PIDFILE --retry 10
    start-stop-daemon --stop --pidfile $PIDFILE --retry TERM/30/KILL/5 --oknodo --user $DAEMON_USER
    log_end_msg $?
}

case "$1" in

    start|stop)
        do_${1}
        ;;

    restart|reload|force-reload)
        do_stop
        do_start
        ;;

    status)
        status_of_proc "$DAEMON_NAME" "$DAEMON" && exit 0 || exit $?
        ;;

    *)
        echo "Usage: /etc/init.d/$DAEMON_NAME {start|stop|restart|status}"
        exit 1
        ;;

esac
exit 0


I've found also another solution with using atexit (it is mentioned here in comments) but for me it worked only on ctrl+c.
Solution I've described in this post is based on this topic: https://www.raspberrypi.org/forums/viewtopic.php?t=63051


Feel free to ask if you have any questions :)