Weblog Tomasza Przechlewskiego [Zdjęcie T. Przechlewskiego]


scrum
random image [Photo gallery]
Zestawienie tagów
1-wire | 18b20 | 1wire | 2140 | 3rz | alsamixer | amazon | anniversary | antypis | apache | api | applebaum | arm | armenia | astronomy | asus | atom.xml | awk | aws | bachotek | bakłażan | balcerowicz | balta | bash | batumi | berlin | bibtex | bieszczady | biznes | blogger | blogging | blosxom | bono | borne-sulinowo | breugel | bt747 | budapeszt | bursztyn | canon | cedewu | chello | chiller | chillerpl | chown | chujowetaśmy | ciasto | cmentarz | contour | cron | css | csv | curl | cycling | d54250wykh | dbi | debian | dejavu | dhcp | dht22 | dia | docbook | dom | ds18b20 | dulkiewicz | dyndns | dynia | ebay | economy | ekonomia | elka | elm | emacs | emacs23 | english | erasmus | erasmusplus | ess | eu | excel | exif | exiftool | f11 | fc | fc11 | fc15 | fc29 | fc5 | fc8 | fedora | fedora21 | fenix | ffmpeg | finepix | firefox | flickr | folau | fontforge | fontspec | fonty | food | fop | foto | france | francja | fripp | fuczki | fuji | fuse | gammu | garmin | gawk | gazwyb | gdańsk | gdynia | gender | geo | geocoding | georgia | gft | git | github | gmail | gmaps | gnokii | gnus | google | googlecl | googleearth | googlemaps | gotowanie | gphoto | gphoto2 | gps | gpsbabel | gpsphoto | gpx | gpx-viewer | greasemonkey | gruzja | grzyby | haldaemon | handbrake | hhi | historia | history | hitler | holocaust | holokaust | hpmini | humour | iblue747 | ical | iiyama | ikea | imap | inkscape | inne | internet | j10i2 | javascript | jhead | k800i | kajak | kamera | kleinertest | kml | kmobiletools | knuth | kociewie kołem | kod | kolibki | komorowski | konwersja | krutynia | kuchnia | kurski | latex | latex2rtf | latex3 | lcd | legend | lenny | lesund | lewactwo | lgbt-folly | liberation | linksys | linux | lisp | lisrel | litwa | lizbona | logika | ltr | lubowla | lwp | lwów | m2wś | malta | mapquest | mapsource | marchew | marvell | math | mathjax | mazury | mbank | mediolan | mencoder | mevo | mh17 | michalak | michlmayr | microsoft | monitor | mp4box | mplayer | ms | msc | mssql | msw | mswindows | mtkbabel | museum | muzyka | mymaps | mysql | nafisa | nanopi | natbib | navin | nekrolog | neo | neopi | netbook | niemcy | niemieckie zbrodnie | nikon | nmea | nowazelandia | nuc | nxml | oauth | oauth2 | obituary | okular | olympus | ooffice | ooxml | opera | osm | otf | otftotfm | other | overclocking | ozbekiston | panoramio | pdf | pdfpages | pdftex | pdftk | perl | photo | photography | picasa | picasaweb | pim | pine | pis | pit | plotly | pls | plugin | po | podróże | politics | polityka | polsat | portugalia | postęp | powerpoint | połtawa | prelink | problem | propaganda | pstoedit | putin | python | r | radio | random | raspberry | raspberry pi | raspberrypi | refugees | relaxng | ridley | router | rower | rowery | rpi | rsync | rtf | ruby | rugby | rumunia | russia | rwc | rwc2007 | rwc2011 | rwc2019 | rzym | samba | selenium | sem | sernik | sheevaplug | sienkiewicz | signature | sks | skype | skytraq | smoleńsk | sqlite | srtm | sshfs | ssl | staszek wawrykiewicz | statistics | stats | statystyka | stix | stretch | suwałki | svg | svn | swanetia | swornegacie | szwajcaria | słowacja | tbilisi | terrorism | tex | texgyre | texlive | thunderbird | tomato | totalnaopozycja | tourism | tramp | trang | transylwania | truetype | ttf | turcja | turkey | turystyka | tusk | tv | tv5monde | twitter | typetools | ubuntu | uchodźcy | udev | ue | ukraina | umap | unix | upc | updmap | ups | utf8 | uzbekistan | varia | video | vienna | virb edit | vostro | wammu | wdc | wdfs | webcam | webdav | webscrapping | wh2080 | wiedeń | wikicommons | wilno | win10 | windows | windows8 | wine | wioślarstwo | word | wordpress | wrt54gl | ws1080 | wtyczka | ww2 | www | wybory | wybory2015 | włochy | węgry | xemex | xetex | xft | xhtml | xine | xml | xmllint | xsd | xslt | xvidtune | youtube | yum | zakopane | zakupy | zdf | zdrowie | łeba | świdnica | żywność
Archiwum
O stronie
wykorzystywany jest blosxom plus następujące wtyczki: tagging, flatarchives, rss10, lastbuilddatexhtmlmime. Niektóre musiałem dopasować nieco do swoich potrzeb. Więcej o blosxom jest tutaj
Subskrypcja
RSS 1.0
Mevo na umbrielu








Umbriel to mój serwer. W pliku crontab są następujące nastawy:

## co 120s
*/2 * * * * /home/tomek/bin/mevo_get.sh
## Codziennie 2:33 po północy
33  2 * * * /home/tomek/bin/mevo_process_yesterday.sh
## Raz w miesiącu 2:43 (musi być po mevo_process_yesterday.sh)
43  3 1 * * /home/tomek/bin/mevo_process_lastmonth.sh

Uruchamiany co 2 minuty mevo_get.sh pobiera (mevo_get_store.pl) ze strony plik locations.js, wyciąga z niego najważniesze dane, które dopisuje do pliku YYYYMMDD_log.csv

Uruchamiany raz dziennie mevo_process_yesterday.sh agreguje (robi to skrypt mevo_yesterday_f.pl) dane z pliku YYYYMMDD_log.csv, które zapisuje do pliku MEVO_DAILY_BIKES.csv.

Zawartość MEVO_DAILY_BIKES.csv jest następująca:

day;bikes;zb;dist.total;ga;gd;sop;tczew;rumia;s10111;s10111d;s10112;s10112d;zstat;sstat;\
gd0p;ga0p;sop0p;tczew0p;rumia0p;gd1p;ga1p;sop1p;tczew1p;rumia1p;slope3;\
slope5;stage2;stage4;stage6;stage8;stage10;stage12;stage14;stage16;stage18;stage20;stage99

gdzie:

bikes -- łączna liczba rowerów dostępnych/wykazanych w ciągu dnia w plikach locations.js;

zb -- łączna liczba rowerów wykazanych, które nie były używane (zero-bikes);

dist.total -- dystans łącznie (liczony po prostej);

ga/gd/sop/tczew/rumia -- dystans łącznie (liczony po prostej dla miast; jeżeli rower przejechał z miasta do miasta to każde miasto dostaje połowę);

s10111/s10112 --przeciętna liczba rowerów na stacjach s10111/s10112 liczona jako $\sum_{i=1}^N r_i / N$ (N -- liczba pobrań pliku locations.js, jeżeli pobrano wszystkie to $24 \times 30 = 720$);

s10111d/s10112d -- przeciętna liczba rowerów na stacjach s10111/s10112 w godzinach 5--23;

zstat -- przeciętny odsetek stacji bez rowerów (zero-stations), liczony jako $\sum_{i=1}^N s_i / (S \times N)$ (N -- liczba pobrań pliku locations.js, $S$ -- liczba stacji w systemie);

sstat -- przeciętny odsetek stacji z maksimum jednym rowerem (single-stations), liczony jako $\sum_{i=1}^N s_i / (S \times N)$;

gd0p/ga0p/sop0p/tczew0p/rumia0p -- przeciętny odsetek stacji bez rowerów (zero-stations) dla miast (gd/ga/sop/tczew/rumia). Liczony jak zstat tylko $S$ -- liczba stacji w danym mieście oczywiście;

gd1p/ga1p/sop1p/tczew1p/rumia1p -- przeciętny odsetek stacji z maksimum jednym rowerem (single-stations) dla miast (gd/ga/sop/tczew/rumia). Liczony jak sstat tylko $S$ to liczba stacji w danym mieście oczywiście a nie ogółem;

slope3/slope5 -- łączny dystans przejechanych odcinków o nachyleniu przeciętnym 3%/5%;

stage2/stage4 itd -- łączny dystans przejechanych odcinków o dlugości 0--2km, 2--4km itd...

Następnie uruchamia skrypt mevo_daily_report.pl, który z pliku MEVO_DAILY_BIKES.csv wyciąga ostatni i przedostatni dzień; kompiluje raport dzienny tj. oblicza podstawowe statystyki, tworzy raport tekstowy (ograniczony do 280 znaków bo Twitter więcej nie potrafi) tworzy bardziej obszerny raport w formacie TeXa, konwertowany później do obrazka (za pomocą XeTeXa/converta) Publikuje na twitterze (twitter_post.py) obrazek i ww raport tekstowy.

Następnie uruchamia skrypt mevo_yesterday_hr_f.pl, który agreguje dane z pliku YYYYMMDD_log.csv w ujęciu godzinowym. Zapisuje wynik do pliku MEVO_STAT_BIKES_HRS_YYYYMM.csv (plik przechowuje zagregowane dane godzinowe dla miesiąca). Ten skrypt niczego nie publikuje na twitterze

Plik MEVO_STAT_BIKES_HRS_YYYYMM.csv ma następującą zawartość:

day;hr;bikes;nzstations;bikesGD;bikesGA;bikesSP;nzsGD;nzsGA;nzsSP

day/hr -- dzień i godzina;

bikes -- przeciętna liczba rowerów na wszystkich stacjach (definiowana jako suma rowerów/suma pomiarów);

nzstations -- przeciętna liczba stacji z minimum jednym rowerem (non-zero stations);

bikesGD/bikesGA/bikesSP -- przeciętna liczba rowerów na stacjach w mieście

nzsGD/nzsGA/nzsSP -- przeciętna liczba stacji z minimum jednym rowerem w mieście

Wykonywany raz w miesiąc mevo_process_lastmonth.sh uruchamia mevo_monthly_report.pl, który agreguje w skali miesiąca dane z pliku MEVO_DAILY_BIKES.csv; kompiluje raport miesięczny tj. oblicza podstawowe statystyki, tworzy raport tekstowy i obrazek (w sposób analogiczny jak raport dzienny) publikuje na Twitterze (twitter_post.py) obrazek i raport tekstowy.

Następnie uruchamia skrypt mevo_stat_bikes_hrs.pl, który konwertuje/łączy MEVO_DAILY_BIKES.csvMEVO_STAT_BIKES_HRS_YYYYMM.csv do pliku MEVO_HRS.csv. Na podstawie danych z pliku MEVO_HRS.csv tworzone są wykresy, do czego wykorzystywany jest R.

Plik MEVO_HRS.csv ma następującą zawartość:

dow;dowNN;hr;bikes;bikesGd;bikesGa;bikesSp;stats;statsGd;statsGa;statsSp;\
pbikes;pbikesGd;pbikesGa;pbikesSp;pstats;pstatsGd;pstatsGa;pstatsSp

gdzie:

dow -- dzień tygodnia (0 -- powszedni; 1 -- święta, soboty i niedziele)

dowNN -- liczba dni powszednich i niepowszednich (w miesiącu)

hr -- godzina

bikes/bikesGd/bikesGa/bikesSp -- przeciętna liczba rowerów na wszystkich stacjach i na stacjach w mieście;

stats/statsGd/statsGa/statsS -- przeciętna liczba stacji z minimum jednym rowerem ogółem i w mieście;

pbikes/pbikesGd/pbikesGa/pbikesSp -- przeciętna % rowerów na stacjach ogółem i w mieście (% średniej dobowej);

pstats/pstatsGd/pstatsGa/pstatsSp -- przeciętny % stacji z minimum jednym rowerem ogółem i w mieście (% średniej dobowej);

Konkretnie zaś uruchamiany jest R ze skryptem mevo_hrly.R, który generuje wykresy do pliku Mevo_hrly_YYYYMM.pdf. Następnie Mevo_hrly_YYYYMM.pdf jest konwertowane (convert) do formatu JPG (Mevo_hrly_YYYYMM-0.jpg, Mevo_hrly_YYYYMM-1.jpgMevo_hrly_YYYYMM-2.jpg).

Publikuje na twitterze (twitter_post.py) Mevo_hrly_YYYYMM-*.jpg

Uruchamia R ze skryptem mevo_daily_bikes.R. Uruchamia R ze skryptem mevo_daily_zstats.R. Skrypty generują wykresy do plików mevo_daily_bikes.pdfmevo_daily_zstats.pdf. Pliku mevo_daily_bikes.pdf/mevo_daily_zstats.pdf są zamieniane na format JPG. Publikuje na twitterze (twitter_post.py) mevo_daily_bikes.jpg/mevo_daily_zstats.jpg.

Reasumując tworzone/wykorzystywane są następujące pliki danych: YYYYMMDD_log.csv (dzienny log dopisywany co 2min); MEVO_DAILY_BIKES.csv (dzienny log aktualizowany co 24h (o 2:33)); MEVO_STAT_BIKES_HRS_YYYYMM.csv (dzienny log godzinowy aktualizowany co 24h (o 2:33)) MEVO_HRS.csv (plik tymczasowy z MEVO_DAILY_BIKES.csv/MEVO_STAT_BIKES_HRS_YYYYMM.csv (raz w m-cu))

Przy okazji się okazało że XeTeX na Debiana 4.9.51-1 (chyba Stretch) w wersji Armel jest epicko spieprzony. Konkretnie nie może znaleźć fontów systemowych, bo szuka jakiś dziwnych obciętych nazw. Przykładowo Iwona-Reg.otf nie znajduje, bo szuka Iwona-Reg.. Dziwaczny błąd. Zrobiłem link ln -s Iwona-Reg. Iwona-Reg.otf i działa bo mi się nie chciało tracić czasu na poprawienie tego lepiej.

Anyway za 4 ostatnie miesiące zbiorcza statystyka wygląda następująco (dystanse w tys km za wyjątkiem Dist/r -- miesięczny średni przebieg roweru w km):

YYMM Days   Dist %Change Dist/r   GD %Change    GA %Change   SOP %Change
------------------------------------------------------------------------
201905 31  569.8  241.1  531.5  359.5  235.6  126.6  267.3   42.9  244.3
201906 30  856.9  150.4  677.4  501.4  139.5  220.5  174.2   76.2  177.7
201907 31  751.4   87.7  570.9  438.8   87.5  187.9   85.2   69.0   90.5
201908 31  781.0  103.9  592.3  466.5  106.3  180.3   96.0   73.3  106.3
------------------------------------------------------------------------

Czyli najlepiej było w Czerwcu, bo jeżdżą wcale nie przyjezdni tylko miejscowi do roboty. Potwierdza to też zmienność tygodniowa (mniej się jeździ w soboty i niedziele). Połowa odcinków ma mniej niż 4km (liczone w linii prostej przypominam). Długość odcinków o nachyleniu 3% jest śladowa (a 5% to już ślad w śladzie). Resztę na wykresach widać...

url | Wed, 04/09/2019 19:05 | tagi: , ,
MEVO: rozkminianie systemu (odcinek trzy)

Miało nie być o MEVO do września, ale najechałem na stojący w zasadzie w polu rower przed Chwaszczynem. Zrobiłem zdjęcie i się okazało że figuruje on w bazie. Przypomnę, że w poprzednim odcinku trylogii o MEVO założyłem że plik locations.js zawiera informacje nt stacji oraz informacje o luźnych-rowerach-w-dziwnych-miejscach (np w Warszawie), które postanowiłem pomijać. Że przypomnę:

[luźne-rowery] mają dziwną nazwę a w atrybucie bike mają true (albo jeden), a w atrybucie spot mają zero (czyli false). Z tego wychodzi, że te stacje to nie są stacje tylko jakieś luźne rowery pozasystemowe. Taką mam koncepcję...

Znalezisko spod Chwaszczyna podkopało moją wiarę w koncepcję. No bo jeżeli baza zawiera także rowery normalnie eksploatowane, ale nie parkowane na stacjach, to pomijam -- być może istotną -- część ruchu w systemie MEVO. Żeby ustalić w miarę szybko stan rzeczy wymyśliłem, że podsumuję pozycje wszystkich rowerów -- zarówno tych na stacjach i tych luźnych -- i zobaczę co wyjdzie. Konkretnie czy parkowanie poza stacjami to incydent, który można pominąć czy niekoniecznie oraz czy dzikie parkingi się skupiają w pewnych lokalizacjach, a jak się skupiają, to gdzie?

Plik locations.js zawiera zmienną NEXTBIKE_PLACES_DB, która wygląda jakoś tak:

  var NEXTBIKE_PLACES_DB = '[{"places":[
  {"uid":14242676,
   "lat":52.281631111111,
   "lng":21.011891111111,
   "bike":true,
   "name":"Jagiellońska 88A",
   "address":null,
   "spot":false,
   "number":0,
   "bikes":1,
   "booked_bikes":0,
   "bike_racks":0,
   "free_racks":0,
   "special_racks":0,
   "free_special_racks":0,
   "maintenance":false,
   "terminal_type":"","
   bike_list":[{"number":"600262","bike_type":114,
      "lock_types":["frame_lock"],
      "active":true,
      "state":"ok",
      "electric_lock":true,
      "boardcomputer":7551015898,
      "pedelec_battery":62,
      "battery_pack":{"percentage":62}}],
 "bike_numbers":["600262"],
 "bike_types":{"114":1},
 "place_type":"12",
 "rack_locks":false,
 "city":"Gdańsk-Wawa"}]}]';

Pole places zawiera listę elementów, z których każdy to opis miejsca, tj. stacji lub pozycji luźnego roweru (dalej LB od luźnego-bajka). Czy jest to stacja czy rower można wykoncypować na podstawie wartości pola bike (jeżeli true/1 to luźny rower). Są ponadto współrzędne miejsca (lat, lng); numer miejsca (number, lub zero dla LB) liczba rowerów zaparkowanych w miejscu (bikes); lista numerów rowerów w miejscu (bike_numbers); nazwa miejscowości (city). Pole uid to moim zdaniem unique id miejsca. Zatem stacja ma numer, LB nie ma numeru. Każda para współrzędnych ma ten sam uid.

W zasadzie jeżeli bike = true, to bikes=1 ale niekoniecznie i nie potrafię wykoncypować co znaczy taki rekord:

{"uid":14302318,
 "lat":54.350404444444,"lng":18.586652222222,
 "bike":true,
 "name":"BIKE 99170",
  ...
 "bikes":0,
 ...
 city":"Gdańsk"}

Takich wpisów jest circa pięć więc pomijam wyjaśnienie tego fenomenu. Robię skrypt parsujący apiać wszystkie pliki locations.js pobrane w okresie maj--lipiec (ostatni miesiąc niekompletny). Skrypt zapisuje: uid, numer, pozycję, miasto, typ miejsca (stacja albo LB) oraz liczbę powtórzeń (liczba wpisów dotyczących miejsca o współrzędnych lat/lng; każda stacja w tym okresie ma 53 tysiące wpisów. LB ma mniej oczywiście.) Dla czerwca wychodzi 20 tysięcy różnych zarejestrowanych miejsc. Dla całego okresu 60 tysięcy (różnych).

Wyświetlenie 60 tys kropek na mapie nie będzie proste więc wymyśliłem sobie, że rozpocznę od zagregowania liczby ,,parkingów'' do rozsądnej wielkości rzędu kilku tysięcy. W pierwszym podejściu założyłem, że duża liczba miejsc parkowania to rezultat błędów w ustalaniu pozycji GPS i że pozycji będzie mniej jak się zmniejszy dokładność pomiaru. Konkretnie zamiast 8 cyfr spróbować zastosować 4 (tj. przykładowo 54.12345678 obciąć do 54.1234) i zobaczyć co wyjdzie.

Wyszło 40 tysięcy czyli redukcja taka sobie, ale ujawniły się dziwne miejsca koncentracji: w Gdańsku na ul. Pokoleń Lechii/Amber Expo, w Warszawie na ulicy Jagiellońskiej w okolicach numeru 88 oraz w Cedrach Wlk! W Cedrach na ul. Pionierów Żuław 42 (gdzie na Google Maps jest firma UEGZ). Wygląda, że wszystkie wymienione miejsca to stacje, tyle że serwisowe rowerów.

Ponieważ oprócz Warszawy LB sporadycznie są raportowane także, w różnych innych dziwnych miejscach, to wymyśliłem, że będę pomijał miejsca znajdujące się poza prostokątem o współrzędnych wierzchołków równych: 53.8/17.4 (dolny lewy) i 55.0/19.5 (górny prawy).

Na okoliczność LB z Pokoleń Lechii/Amber Expo dodałem warunek, że pomijane są także miejsca znajdujące się wewnątrz prostokąta o współrzędnych wierzchołków równych: 54.387395/18.630779 (górny lewy) i 54.385733,18.635221 (dolny prawy). Cedry zostawiłem w spokoju za to policzyłem kwantyle tych 40 tysięcy miejsc (bez 650 oficjalnych stacji):

kwantyl 25%   50%   75%   90%   95%  100%
------------------------------------------
wpisy     2    9     29  121    246 32760

Dwa wpisy to 4 minuty skoro każdy wpis jest co 2 minuty średnio. 50% miejsc było zajmowanych przez około 20 minut, a 5% wszystkich miejsc to parkingi na 8 godzin i dłużej (w ciągu 2,5 miesiąca przypominam) czyli dalej niewiele. Zamiast kombinować z dokładnością pomiaru można pominąć te miejsca które pojawiają się sporadycznie. Jeżeli za typowe przyjmiemy takie, które występują minimum 250 razy (około 5% największych wartości), to miejsc jest 2232 (w tym 650 stacji). Co ważniejsze udział wpisów dotyczących LB w całości wpisów to 5,6%. Spokojnie można tego nie analizować bo przecież i tak moje szacunki są przybliżone. A pominięcie LB ma tą zaletę że upraszcza rachunki. Na mapie te 5% najczęściej powtarzających się miejsc wygląda następująco:

Zostało osiem miejsc z liczbą wpisów większą od 5000, w tym 5 w Cedrach (gdzie jak już ustaliłem coś serwisują niechybnie). Te 3 duże dzikie parkingi to: Stężyca (2) oraz Sierakowice.

Reasumując: znalezisko spod Chwaszczyna niewiele zmienia. Nie będę uwzględniał w statystykach wykorzystania MEVO rowerów parkowanych poza stacjami.

url | Tue, 16/07/2019 15:57 | tagi: , ,
MEVO po trzech miesiącach

Rowery/dystanse

Rowery na stacjach 10111/12

Obiecuję ostatni wpis n/t Mevo. Następny po wakacjach, czyli po mitycznym 18 sierpnia (czemu mitycznym poniżej).

Obszerny wywiad z prezesem się ukazał 19 maja, ale ja go przeczytałem dopiero przedwczoraj (cały wywiad w repo na githubie, link poniżej). Prezes pisze, że:

26 marca na ulice wyjechały 1224 rowery [...] [Potem] liczba rowerów zaczęła spadać. Trafiały do serwisu, mieliśmy problem z ładowaniem. Zainteresowanie systemem w pierwszych dniach nas zaskoczyło [...] Zwiększyliśmy zatrudnienie do około 40 osób, przenieśliśmy serwis do większej hali w MTG. Codziennie wyjeżdża stąd około 250 rowerów. Przygotowujemy się do obsługi pełnej floty docelowych 4 tysięcy rowerów [...] Kolejne rowery planujemy dostarczać stopniowo, po 100-200-300 tygodniowo. Ostatnią partię dostarczymy 18 sierpnia.

Mój komentarz. Po pierwsze: czy wyjechało 1224 to ja nie wiem -- pewnie tak, ale w kwietniu średnio jeździło niecałe 800, a raczej jeździło 624 a 163 nie jeździło tylko było (wykazywane że są, ale nie przejechały nic). W tym kontekście twierdzenie prezesa, że przyczyną (wielokrotnie podkreślaną) problemów jest nadzwyczajne zainteresowanie rowerami jest cokolwiek niezborne ze stanem przygotowań. System jest sprawny na 800/4000 = 20%, a on jest zaskoczony, że rowerów brakuje. Nie wiem co prezes kończył za szkoły, ale z logiką na bakier jest... No i pytanie pomocnicze: gdyby wyjechało na przykład 2000 rowerów (w sensie wyjechało i jeździło) czyli 250% tego co jeździło (w kwietniu), to dalej byłaby klapa czy jednak nie? A te 2000 to 50% tego co miało jeździć. Albo inaczej po co system na 4000 rowerów skoro miało wystarczyć 1220?

Dwa: zatrudniają 40 ludzi do obsługi około 1000 rowerów (dane za maj). Ile musi być zatrudnionych do obsługi 4000 (czyli o 300% więcej niż mają) i to do 18 sierpnia (w trzy miesiące licząc od daty wywiadu).

Trzy: 250 wyjeżdżających rowerów z MTG to jak rozumiem rowery niesprawne, serwisowane i włączane z powrotem do ruchu. Hmmm... czy to oznacza, że z grubsza jest codziennie 250 serwisowanych (czyli wyłączonych z ruchu)? Że rower się psuje, to normalne więc nie ma w tym nic dziwnego, że są rowery popsute i trzeba je naprawiać. Wychodzi, że tych rowerów jest 250 z 1250 czyli około 20%. Albo i nie, bo dziennikarz nie dopytuje... Ale jeżeli tak, to na 4000 będzie 800 popsutych przy założeniu 20%. No może mniej będzie, bo obciążenie/rower będzie mniejsze, a rowery będą usprawniane pod kątem słabych punktów, ale nawet jak będzie to 10% to dalej jest 400 rowerów do naprawy codziennie czyli o 60% więcej niż teraz (40 ludzi:-) może nie wystarczyć.)

Cztery: jeżeli planują dostarczyć stopniowo po 100--300 tygodniowo a mają do dostarczenia 2800, to dostarczając 100/tydzień przez 3 miesiące dostarczą 2400. He, he... Gorzej że na dziś system wykazuje około i zaledwie 1500 rowerów. Pozostało 2500 do dodania, a tygodni do 18 sierpnia zostało 5. Wychodzi po 500/tydzień, starting from now...

+--------------------------------------------------+
|           |         średnio dzienne              |
| Miesiąc   +--------------------------------------+
|           |     NZB |      ZB | NZB+ZB  | NZB%   |
| ----------+---------+---------+---------+------- +
| kwietnia  |  624.93 |  163.87 |  788.81 | 79.09  |
| maja      |  893.13 |  179.03 | 1072.16 | 83.18  |
| czerwca   | 1094.97 |  172.07 | 1267.03 | 86.45  |
| lipca     | 1089.00 |  248.25 | 1337.25 | 81.58  |
+-----------+---------+---------+---------+--------+

NZB -- rowery ruszające się; ZB -- rowery które nie jeździły, ale były wykazywane. Porównaj też wykresy. Drugi wykres pokazuje dostępność rowerów na stacjach 10111/10112 (Sopot Mickiewicza/Armii Krajowej), które są najbliżej mojego domu. Dostępność liczona jako prosta średnia (liczba rowerów)/(liczba pomiarów)...

Generalnie trend jest OK tylko to ślimacze tempo. Załamanie lipcowe spowodowane jest przypuszczalnie (fatalną) pogodą (lipiec liczony dla tylko dla pierwszych 8 dni). Dane są przypominam tutaj.

url | Tue, 09/07/2019 10:08 | tagi: , ,
Mevo w czerwcu 2019

Zestawienie wybranych parametrów pomorskiego roweru miejskiego MEVO (maj--czerwiec 2019). Dystanse i średnie są w kilometrach. Zapis Łącznie x% nach. oznacza łączną długość odcinków z przeciętnym nachylenie x% oraz większym. Odcinki z nachylenie 5% i więcej stanowiły odpowiednio 0,06% (maj) oraz 0,05% (czerwiec) łącznego przejechanego dystansu (ŁPD) a z nachyleniem 3% i więcej odpowiednio 0,72% oraz 0,66% ŁPD. To tyle odnośnie potrzeby instalowania silników elektrycznych w każdym rowerze ponieważ Trójmiasto pełne jest stromych podjazdów. Chyba chodziło o coś innego z tymi silnikami...

Wyszczególnienie Maj Czerwiec Zmiana
Liczba rowerów 1333 1518 13.9%
Łącznie odcinki 235455 330074 40.2%
Dystans łącznie (km) 649904.3 974943.1 50.0%
Średnio na rower/dzień (km) 15.7 21.4 36.3%
Średnio na rower/miesiąc (km) 487.6 642.3 31.7%
Łącznie 5% nach. (km) 393.9 491.5 24.7%
Łącznie 3% nach. (km) 4687.1 6440.4 37.4%
Łącznie 2% nach. (km) 16722.7 23386.0 39.8%

Przypominam, że powyższe policzono w taki oto sposób iż: ze strony https://rowermevo.pl/ co 120 sekund jest pobierany plik locations.js który zawiera listę rowerów zaparkowanych na stacjach w systemie roweru miejskiego Mevo. Długość/szerokość geograficzna stacji jest w pliku locations.js. Wysokość npm. stacji (SRTM) dodałem korzystając z programu gpsprune.

Mapa najczęściej używanych odcinków:

Dane, że tak powiem źródłowe dotyczące ruchu rowerów MEVO maj/czerwiec 2019 są dostępne tutaj.

url | Mon, 01/07/2019 15:42 | tagi: , ,
MEVO: rozkminianie systemu (odcinek dwa)

Numery stacji w systemie MEVO są pięciocyfrowe i zaczynają się od 10, 11 oraz 12. Takich stacji jest 654 (albo 653 zależy jak liczył). Oprócz tego jest stacja 999993 o współrzędnych w Wawie(52.261177495785/20.968099236488), która zapewne omyłkowo jest wykazywana w zestawie (https://rowermevo.pl/mapa-stacji/). Jak się naciśnie guziczek Pobierz bieżące lokalizacje, to się dostanie plik CSV o nazwie locations_YYYY-MM-DD_HH-MM-SS.csv. Plik ten ma 704 stacje czyli o 50 więcej niż wykazywana na stronie. Te pomijane stacje mają numer zero.

Z tych 654 stacji 363 jest w Gdańsku 55,56%; Gdynia 145 (22,17%); Tczew 28 (4,28%); Sopot 27 (4,13%); Rumia 23 (3,52%); Reda 17 (2,60%); Puck 14 (2,14%); Inni 18 (Władysławowo, Kartuzy, Sierakowice, Somonino, Stężyca, Żukowo.)

Te 50 coś stacji-niestacji wygląda jakoś tak:

uid;number;name;city;latlng;bikes;bike;spot;bikeSpot;terminal;address
13915356;0;BIKE 99127;Tczew;54.08056000 18.79086222;1;1;0;;;

Mają dziwną nazwę a w atrybucie bike mają true (albo jeden) a w atrybucie spot mają zero (czyli false). Z tego wychodzi, że te stacje to nie są stacje tylko jakieś luźne rowery pozasystemowe. Taką mam koncepcję...

url | Mon, 17/06/2019 14:25 | tagi: , ,
Mevo w maju

Ze strony https://rowermevo.pl/ co 120 sekund jest pobierany plik locations.js który zawiera (jak mniemam) listę rowerów zaparkowanych na stacjach w systemie roweru miejskiego Mevo. Jak rower zmienił stację to znaczy, że ktoś się nim przejechał (lub go przewieziono dla jakiś celów.)

Pobrane dane są dostępne tutaj. Konkretnie plik MEVO_bikes_ROKMIESIĄC.csv to plik CSV, którego każdy wiersz zawiera czas, idRoweru, stanBaterii oraz współrzędne geograficzne. Rejestrowane są tylko przemieszczenia, tj. na przykład jeżeli rower jest wykazywany przez 10 kolejnych pobrań jako zaparkowany w tym samym miejscu, to tylko pierwszy wpis jest zapisywany. Z kolei MEVO_tracks_ROKMIESIĄC.csv zawiera idRoweru, liczbę przemieszczeń oraz kompletny ślad w postaci par współrzędnych.

Plik MEVO_bikes_201905.csv (czyli za maj) zawiera 265 tys wierszy, plik MEVO_tracks_201905.csv zawiera 1550 wierszy (czyli zarejstrowanych rowerów w systemie). Tutaj uwaga: część wpisów/rowerów jest dziwna: są rowery jeżdżące po Warszawie, po Bałtyku a nawet w księstwie Monako. Szczegóły tutaj.

Na podstawie pliku MEVO_tracks_ROKMIESIĄC.csv obliczyłem łączny i średni dystans pokonany przez rowery w maju, pomijając „dziwne” wpisy. Za kryterium dziwności przyjęto punkt znajdujący się na zewnątrz prostokąta 53.8--55.0/17.4--19.5 (długość/szerokość). W ten sposób zostało 1370 rowerów a odpadło 180 „dziwnych”. Konkretnie policzyłem poniższym skryptem:

#!/usr/bin/perl
use Geo::Distance;
my $geo = new Geo::Distance;

my $distGrandTotal;
my $distTotal;

while (<>) {  chomp();
  ($bike, $nodes, $track) = split /;/, $_;
  $track =~ s/[ \t]+$//;
  @trkpts =  split / /, $track;

  $distTotal=0;  $skipBike = 0;

  foreach $t (@trkpts) {
     ($lon, $lat) = split /,/, $t;
     if ($lat < 53.8 || $lat > 55.0 || $lon < 17.4 || $lon > 19.5 ) {##
        $skipBike = 1;
        print STDERR "SKIPPED $bike: lat = '$lat' / lon = '$lon'\n";
     } 
     else { 
        if ($latPrev > 54.0 ) {
           $dist = $geo->distance( "meter", $lonPrev, $latPrev => $lon, $lat );
           $distTotal += $dist;
        }
        $lonPrev =  $lon; $latPrev = $lat;
     }
  }

  unless ($skipBike) {
    $mean = $distTotal / 31;
    printf "%s;%.2f;%.2f\n", $bike, $distTotal, $mean;
    $distGrandTotal += $distTotal;
    $validBikes++;
  }
}

$grandMean =  $distGrandTotal / (31 * $validBikes);
print STDERR "Średnio: $grandMean ($validBikes)\n";

Wyniki i analiza

Minimum przejechane 0km, pierwszy kwartyl 12,8km, mediana 17,8km trzeci kwartyl 21,2km. Maksimum 30,7km. Przypominam, że są to średnie dzienne dla 31 dni maja. Oczywiście nie są to wielkości prawdziwe: po pierwsze dystans jest liczony jako proste pomiędzy punktami (rejestrowanymi co 120s); po drugie nie wszystkie przemieszczenia polegają na pedałowaniu--czasami rower jest wieziony. Arbitralnie przyjmijmy że prawdziwa wartość to 200% zarejestrowanej (to chyba dużo mimo wszystko). Dalej załóżmy że gdyby z roweru korzystało się 6 godzin na dobę (można by policzyć ile się korzysta ale tego jeszcze nie zrobiłem)--co dalej nie wydaje się czymś nadmiernie wyśrubowanym (połowa czasu od 8 rano do 20 wieczorem). Wreszcie przyjmijmy 12km/h jako prędkość przemieszczania się (jak na pojazd z silnikiem -- moim zdaniem -- już mniej się nie da). Wychodzi 6 x 12 = 72km. A jest 30km czyli nawet nie połowa...

Rozkład średnich przedstawia histogram poniżej

url | Mon, 03/06/2019 08:42 | tagi: ,
Spóźnione podsumowanie 2018

Dystans wg dni tygodnia

Średni dystans wg dni tygodnia

Dystans wg tygodni w roku

Średnio rocznie wg tygodni

To był rekordowy rok w wielu kategoriach:-)

Zacznijmy od pogody, którą mierzę od 2010 roku przypominam. U mnie średnia wyszła 9,56 C, do tej pory rekord to było 9,44 C w 2015 r. Szczegółowo to tak wygląda:

rok     : 2010  2011  2012  2013  2014  2015  2016  2017  2018
--------------------------------------------------------------
średnia : 8.65  8.94  8.17  8.63  9.33  9.44  9.18  8.75  9.56

Rekordowo niska była też suma opadów: 447.9mm (148 dni opadowych); dla porównania w 2017 roku spadło 763,8mm deszczu (194 dni). Rekord do tej pory to 2014 rok: 450,6 (148 dni) czyli w zasadzie tyle samo (z dokładnością do błędu).

Na rowerze przejechałem 19,100 km (302 razy, co nie oznacza dni, bo czasami były dwa razy dziennie). Poprzedni rekord z 2017 r wynosił 17,855 km. Z tej okazji podsumowałem swoje życiowe wyczyny, a mam statystykę szczegółową od 1993 r. Kurcze 26 lat pykło, w których to latach przejechałem prawie 210 tys km. Do tego w latach 1990--1992 przejechałem ponad 20 tys km, ale nie zachowała się niestety dokładna rozpiska. Z okazji tych wszystkich wyczynów podsumowanie zrobiłem wg dni tygodnia i wg. tygodni w roku (wg. miesięcy to liczę na bieżąco). Konkretnie to podsumowanie jest zestawem 7 wykresów słupkowych rysowanych w R. Dane do skryptu i sam skrypt jest z kolei generowany przez prosty program w Perlu:

  #!/usr/bin/perl -w
use Date::Calc qw(Week_Number Day_of_Week);

##my $RRcmd = 'R CMD BATCH'; ## see below

my $color= 'pink';
my $current_yr = 2019;

my %Miesiac = (1 => 'styczeń', 2 => 'luty', 3 => 'marzec', 4 => 'kwiecień',
        5 => 'maj', 6 => 'czerwiec', 7 => 'lipiec', 8 => 'sierpień',
        9 => 'wrzesień', 10 => 'październik', 11 => 'listopad', 12 => 'grudzień',);
my %DoWName = ( 1 => 'pon', 2 => 'wto', 3=> 'sro', 4 => 'czw', 5 => 'pia', 6 => 'sob', 7 => 'nie' );


open(O, ">dow.R") || die "Cannot open!\n";
open(P, 'LANG=C grep "dist\|date" c*.xml|' ) || die "Cannot open!\n";

while (<P>) { 
  chomp();
  ##print ">>$_;";
  if (/date[^'"]+["']([0-9\/]+)["']/) {$date = "$1";}
  if (/dist[^'"]+["']([0-9\/]+)["']/) {$D{$date} += $1;}
}

close(P) || die "Cannot close!\n";

for $d (sort keys %D ) {    
  ($dyy, $dmm, $ddd) = split '/', $d;
  if ($dyy == $current_yr ) { next } ### skip as incomplete

  my $dow = Day_of_Week($dyy,$dmm,$ddd);
  $DoWs{$dow} += $D{$d}; $DoWNums{$dow}++;

  my $woy = Week_Number($dyy,$dmm,$ddd);
  $WoYs{$woy} += $D{$d}; $WoYNums{$woy}++;
  $RdT++;
  $Years{$dyy}=1;
}

@YNo = sort(keys (%Years));
$YNo = $#YNo +1;

print O "##Generated content == do not edit\n";
print O "##By Day of Week\n";
#
for $d (sort keys %DoWs) { 
  $mean = sprintf "%.1f", $DoWs{$d} / $DoWNums{$d}; 
  $t += $DoWs{$d}; 
  $days_totals .= "$DoWs{$d}, ";
  $days_means .= "$mean, ";
  $days_ns .= "$DoWNums{$d}, ";
  $days_labels .= "'" . $DoWName{$d} . "', ";
  ##printf "%-12.12s %7i %.1f (%i)\n", $DoWName{$d}, $DoWs{$d}, $mean, $DoWNums{$d};
  ;
}
$days_totals =~ s/, $//; $days_means =~ s/, $//;
##$days_ymeans =~ s/, $//;
$days_ns =~ s/, $//; $days_labels =~ s/, $//;

print O "days_totals <- c($days_totals);
  days_means <- c($days_means);
  days_ns <- c($days_ns);
  days_labels <- c($days_labels);\n";

print O "barplot(days_totals, 
 main='Distance (total $YNo[0]--$YNo[$#YNo]): $t kms', horiz=F,  
 names.arg=days_labels, col=c('$color'));
barplot(days_means, main='Day means ($YNo[0]--$YNo[$#YNo])', 
 horiz=F,  names.arg=days_labels, col=c('$color'));
barplot(days_ns, main='RideDays (total): $RdT', horiz=F,
 names.arg=days_labels, col=c('$color'));\n";

print STDERR "##Razem: $t\n";

##print "====\n";

print O "\n\n##By Week of Year\n";

for $w (sort {$a <=> $b } keys %WoYs) { 
  $mean = sprintf "%.1f", $WoYs{$w} / $WoYNums{$w}; 

  $vals_totals .= "$WoYs{$w}, ";
  $vals_ymeans .= sprintf "%.1f, ", $WoYs{$w}/$YNo;
  $vals_means .= "$mean, ";
  $vals_ns .= "$WoYNums{$w}, ";
  $vals_labels .= "$w, ";
}

$vals_totals =~ s/, $//; $vals_means =~ s/, $//;
$vals_ymeans =~ s/, $//;
$vals_ns =~ s/, $//; $vals_labels =~ s/, $//;

print O "vals_totals <- c($vals_totals);
  vals_ymeans <- c($vals_ymeans);
  vals_means <- c($vals_means);
  vals_ns <- c($vals_ns);
  vals_labels <- c($vals_labels);\n";

print O "barplot(vals_totals, main='Distance (total $YNo[0]--$YNo[$#YNo]): $t kms', 
  horiz=F,  names.arg=vals_labels, col=c('$color'));
barplot(vals_ymeans, main='Weak means ($YNo[0]--$YNo[$#YNo])', 
  horiz=F,  names.arg=vals_labels, col=c('$color'));
barplot(vals_means, main='Day means ($YNo[0]--$YNo[$#YNo])',
  horiz=F,  names.arg=vals_labels, col=c('$color'));
barplot(vals_ns, main='RideDays (total): $RdT', 
  horiz=F,  names.arg=vals_labels, col=c('$color'));\n";

print O "### ENDE!\n";

close(O);

print STDERR "##R dow.R\n";

system ("R", "CMD", "BATCH", "dow.R");
print STDERR "##xpdf Rplots.pdf\n";

print STDERR "##convert -density 300 Rplots.pdf opus_by_dow.jpg\n";
system ("convert", "-density", "300", "Rplots.pdf", "opus_by_dow.jpg");

Na koniec przyznam że mam mieszane uczucia co do zeszłorocznego wyczynu, w sensie że za dużo wyszło. Oprócz roweru też jest życie...

Tak więc w przyszłym roku raczej rekordu nie będzie.

url | Thu, 24/01/2019 20:19 | tagi: , ,
Podsumowanie listopada

Wizyta w rezerwacie Ptasi Raj (26/10/2018)

Jeszcze formalnie październik, ale warto też wspomnieć w zestawieniu listopadowym, bo byłem pierwszy raz w życiu w rezerwacie PtasiRaj (Sobieszewo w kierunku Górek Zachodnich). Wrażenia pozytywne (przyroda) i negatywne bo coś śmierdziało i hałasowało non stop praktycznie. Ludzi mało, bo zwykły weekday i po sezonie. Hałas był niewielki--bardziej stanowił kontrast pomiędzy pierwotną przyrodą rezerwatu--człowiek myślał że jest w Białowieży a tu coś stuka i wierci w oddali (stocznie a głos po wodzie się niesie). Puściutka-dzika plaża, ale na horyzocie widać Port Północny albo instalacje Lotosu.

Teren zagospodarowany w tym sensie że są wytyczone ścieżki edukacyjne, tablice z opisami flory/fauny, dwie wieże obserwacyjne (lornetkę należy mieć koniecznie) a nawet restauracja (przed rezerwatem oczywiście) Wracając do smrodu, to może dzień był pechowy--też nie tak że jakość strasznie cuchnęło ale było czuć że bynajmniej nie jest to zapach bryzy-od-morza.

Stutthoff -- 1-sza wizyta (27/10/2018)

Pierwszy raz w Niemieckim KL w ogóle (nigdy nie byłem w Auschwitz/Majdanku itp). Nie lubię takich miejsc oglądać ale się reklamowali że jest wystawa czasowa pn `Prawo i zagłada' o roli Policji w Trzeciej Rzeszy w Zbrodniach (jak mniemam) No więc ponieważ interesuję się historią, a temat wydał się ciekawy to postanowiłem pojechać i obejrzeć. Upewniłem się czy w Sobotę działają. Działają tyle że krócej, bo mają imprezę plenerową później.

Jadę (rowerem). Dojeżdżam o 12:20 (wg info mieli działać do 13:00).
-- Wystawa?--no dziś zamknięta
-- Nosz kurna toż się pytałem
-- No to pracujemy ale wystawa zamknięta wyjątkowo bo mamy koncert o 18:00

Czyli typowe w PL-państwówce. Mieli pretekst to sobie poszli do domu o 12.45 (bo już o tej godzinie zamknęli bramę) bynajmniej nie pomagać przy imprezie (która zaczynała się za 5h). Ale jak już tam byłem, to wlazłem na teren. Niewiele tam jest do oglądania--prawie nic. Chyba że coś pominąłem ale raczej nie, by się w oczy rzucało. Nie ma atmosfery grozy miejsca zbrodni--taka łąka a la ośrodek wypoczynkowy tyle że płot z drutem kolczastym. Krematorium niby jest ale teraz to palenie zmarłych nie jest czymś niezwykły, izby w (bodajże czterech) barakach co zostały niezniszczone/albo je odbudowali -- przerobione na sale muzealne, urządzenia sanitarne nieliczne (jedna łazienka konkretnie).

Wiele instalacji (ogród obozowy) ewidentnie nieoryginalna. To co jest to gabloty z papierami i jakimiś drobnymi przedmiotami typu łyżka czy but...

Kopalino #1 (02/11/2018)

Pierwszy raz w życiu--ciekawe miejsce, zwłaszcza po sezonie.

Tutaj są zdjęcia.

Do Jankowa k/Kowal 03/11/2018

Tam w sklepie rowerowym A. Wojtasa (m.in. masażysta Bora-HansGrohe (B-HG)) fajna impreza była, o której się dowiedziałem z FB. Trwało to 2 godziny, w tym czasie właściciel sklepu (czyli Wojtas) opowiedział (w detalach) jak wyglądało odżywianie kolarzy podczas jednego (6 godzinnego) etapu Tirreno-Adriatico (na którym R. Majka zajął 2-gie miejsce BTW). W przerwach między gadaniem gotował ryż (z owocami--przepis na zdjęciu), z którego potem zrobił kostki po 60--70g (25g suchego ryżu podobno). Masa wskazówek jak uzyskać właściwą konsystencję, jak opakować żeby łatwo odpakować na rowerze itp...

Przy okazji wiele ciekawostek opowiedział na przykład na temat diety Sagana (że misie Haribo lubi i makaron z manufaktury Martelli co kosztuje B-HG całkiem okrągłą kwotę), że B-HG ma autobus restauracyjny, tj. kolarze jedzą w autobusie, a nie w hotelu (szybciej i lulu spać), że B-HG ma samochód meblowy i przed etapem taki samochód jedzie do hotelu i wymienia materace, kołdry, itp w pokoju na swoje. Że B-HG zatrudnia 80 ludzi (do obsługi 30 kolarzy) i ma budżet 22mln EUR z czego 4mln idzie na TdF.

Tutaj są zdjęcia.

Sztutowo #2 06/11/2018

Byłem w Sztuthoffie raz jeszcze. Wykorzystałem okazję bo Elka jechała do Łomży to mnie odstawiła do Nowego Dworu Gdańskiego więc praktycznie miałem w jedną stronę podwózkę. Obleciałem cały obóz. Poprzednio pominąłem parę rzeczy typu komora gazowa. Byłem też na tej wystawie co ją chciałem obejrzeć, ale okazała się w sumie lipą. Takie tam Niemieckie bicie się w piersi (jak już wszyscy potencjalnie do oskarżenia nie żyją)--bo wystawa jest Niemiecka. Ogólnie znane fakty; no i mała--kilkanaście plansz.

Ciekawostkowo: nie było ochrony, wlazłem ot tak. Do tej pory jak tam byłem dwa razy bodajże, to zawsze opiernicz od ochrony, że rower, nie wolno itp. Bo jak już się przejdzie przez bramę, to na terenie obozu nie ma żadnego dozoru, tylko napisy że kamery są...

Wystawa niemiecka była w szklarni. Poprzednio jak byłem, to nie mogłem wejść, bo szklarnia była zamknięta. Komuś kurna nie chciało się pójść i zamka przekręcić--bo reszta obozu była dostępna, a szklarnia -- nie wiedzieć czemu -- nie.

Tutaj są zdjęcia

Otwarcie mostu na W. Sobieszewską 10/11/2018

Przypadek polegał na tym że pojechałem celem zwiedzenia rezerwatu ,,Ptasi Raj'' a nie na otwarcie (o którym nie miałem pojęcia). Nawet chciałem poczekać i obejrzeć uroczystość ale chaos był i nie było wiadomo kiedy się zacznie. Otóż organizatorzy nie pomyśleli i moim zdaniem źle zaplanowali otwarcie. Postawili mikrofony na początku mostu i przewidzieli otwarcie-podniesienie jako gwóźdż programu (bo to zwodzony jest most). Widząc tłum na moście kazali ludziom stanąć przed mostem, co znakomicie pozbawiłoby wielu możliwości obejrzenia czegokolwiek. Więc przez 15 minut trwały targi żeby tłum się cofnął, a że się nie cofał to sobie odpuściłem. Tam z boku był plac było tam zrobić przemówienia a potem otworzyć most (na przykład.)

Co do smrodu, to był mniejszy i w innym miejscu. Las przy plaży pełen śmieci i ludzi (bo to sobota była). Za to nie było hałasu ze stoczni...

Tutaj są zdjęcia. A tutaj jest filmik.

Cmentarz francuski (12/11/2018)

Impreza na 100 lecie rozejmu kończącego 1-szą wojnę światową. Ja sie znam z konsulem honorowym rep. Francuskiej (też rowerzysta) to poszedłem z ciekawości. Miał być ambasador i w ogóle...

Przyjechałem grubo za wcześnie, bo mi się godziny pomyliły, ale nie byłem pierwszy. Młody mężczyzna jakiś chodził między grobami w zielonym berecie, ale ubrany w cywilne łachy. Sylwetka sportowa, ogolony łep na rekruta... Oho myślę ochrona ambasadora. Ale potem przyszedł drugi, starszy, o lasce z całą klatą w medalach w takim samym berecie. A potem następny i jeszcze następny, razem z 10 było, w różnym wieku. Się okazało że to Polacy, bo po polsku gadali. No to się przyjrzałem bliżej bo naszywkę każdy miał na ręce:

Legion Entrangere.

O-żesz. Mówili perfekt polszyzną (do siebie bo jak się ustawili do warty to przeszli na francuski) i bez przekleństw, a nie kurwa-kurwa co drugie słowo jak nie przymierzając b. premier Belka. Czyli selekcja jest i byle kogo do Legii nie biorą.

Ciekawostka #2. Były 2 przemówienia: krótsze ambasadora i dłuższe biskupa Głodzia, który pierdyknął mowę na 10 minut (albo i lepiej), ale o czym mówił to ja nie wiem, bo było po francusku... Szczena nie tylko mi chyba opadała bo generalnie ma on nie najlepszą opinię.

Tutaj są zdjęcia.

13/11/2018 Cmentarz angielski

Podobna impreza, ale w Malborku bo tam jest cmentarz Brytyjskiej Wsp. Narodów. Słabiej wypadło. Liczyłem na kobziarzy, a przyszedł tylko pluton w mundurach polowych + pułkownik z ambasady. Orkiestry nie było, tylko na trąbce sygnały grali. Za to miejscowi się starali (a w GDA nie--z UM/Urzędu Wojewódzkiego to ja w GDA nikogo nie widziałem.)

Był jeden kombatant (na zdjęciu), ksiądz anglikański. Po uroczystości Angole złożyli wieniec (z plastikowych maków) na jednym grobie. Pytam się czy to ktoś z ich jednostki (bo tam tradycja -- oddziały po 300 lat istnieją) ale nie rodzina przysłała/dała wieniec to położyli.

Powrót w ulewnym (miejscami) deszczu. Takie były w sumie prognozy ale miałem nadzieję. Jakoś takoś jednak nie przemarzłem (dobra kurtka przeciw deszczowa) i doturlałem się z Malborka do GDA, a tam do SKM-ki bo już mi się nie chciało przez miasto jechać.

Tutaj są zdjęcia

15/11/2018 Kopalino#2/Mechowo

Drugi raz się kopsnąłem w tym kierunku. Pierwszy raz byłem w Grotach Mechowskich. Atrakcja taka sobie--bilet trzeba kupić żeby nie tyle wejść--bo słowo grota to na wyrost jest -- co podejść do groty... Nie kupiłem:-) Spieszyło mi się, poza tym płot jest 5m od groty i jest ażurowy więc widać co jest za płotem...

Tutaj są zdjęcia.

Upgrade roweru

Cichcem zrobiłem upgrade swojej bryki CX kupując koła Campagnolo Vento (drugie od dołu:-) 1100 PLN nowe). Fajne koła za 400 PLN, używane, ale w dobrym stanie. Jeszcze nawet opony dodał gość, ale te akurat 23mm i dupiate (Hutchinson za 40 PLN nowe) w zasadzie do wywalenia, mimo że w dobrym stanie, m.in. dlatego, że ja definitywnie przeszedłem na 25mm.

Ponadto wymieniłem sztycę, bo w starej już dwa razy złamała się śruba mocująca. Niby firmowa (Amoeba), a miała IMO defekt konstrukcyjny: śruby mocujące siodło to zaledwie #5. No ktoś przesadził. Minimum 6mm i się nie łamią. Tu z kolei kupiłem niby karbonowego Ritcheya, a nieoficjalnie chińską podróbkę tegoż (za 170 PLN nie kupi się Richeya). Że chiński to wskazuje także to, że sztyca ma ciut za małą średnicę i się osuwała w rurze podsiodłowej. Okleiłem ją taką taśmą przeciwogniową z warstwą aluminium (klej ma toto dobry) i jakby teraz nie spada...

Jeszcze dokupiłem pedały jednostronne Kellys za 99 (przecenione z 300 PLN na Allegro). Fajne pedały. Wreszcie przypadkiem nowe siodło 4za za 95 PLN (czyli Ridley--żółte do żółtego roweru!) Kiedyś używałem podobnego siodła i się pałąk łamał--kijowe było, ale tamto to był Stratus a to Cirrus (wizualnie to to samo:-). Ten Cirrus to nawet jest tańszy--ale to może i lepiej, bo tańsze to często są trwalsze

Rower waży teraz 9,9kg (opony 35mm, dętki też niczego sobie) co uważam za b. dobry wynik.

url | Thu, 29/11/2018 04:49 | tagi: , ,
Żuławy w Koło 2018 (how it unfolded)

Trasa z kierunkiem wiatru

Nonsensowny drogowskaz na Rubno Wlk.

00:20 wracam do domu z niesamowitej imprezy urodzinowej kol. BL zorganizowanej w Blues Club Gdynia.

01:05 idę spać. Straciłem z pół godziny (żeby rano zaoszczędzić 15 minut) usiłując kupić bilet do Malborka przez Internet ale się nie udało. System nie działał. Tzn. prawie działał. Naciśnięcie ostatniego guzika skutkowało zwisem...

04:20 wstaję. 04:55 jadę na dworzec PKP, kupuję bilet i jadę pociągiem do Malborka. Wysiadam 06:10, przedtem jem śniadanie z pudełka w pociągu.

W Malborku jest już szaro. Z mocnym wiatrem w plecy jadę do Nowego Dworu Gdańskiego (circa 25 km). 07:15 jestem na miejscu. Start za 45 minut bo podobnie jak w imprezie Kociewskiej plan jest taki żeby zapierdzielać w grupie dopóki się da, a na bufetach stawać i jechać z następną grupą. Więc żeby tych grup do podczepienia się było potencjalnie jak najwięcej chcę zacząć z pierwszą. Pierwszy bufet zamierzam odpuścić, bo jest na 37 km czyli blisko startu.

Pogoda jest niezła. Dużo lepsza niż była prognozowana. Miało być zimno, wietrznie i miało padać. Jest około 13C, czyli nie aż tak bardzo zimno, faktycznie wieje, ale nie pada i się nie zanosi żeby padało, a to najważniejsze.

07:50 ustawiam się na linii startu. Trochę wcześnie, ale chę być w pierwszej grupie, bez konieczności wpychania się poza kolejnością. Wśród czekających rowerzyści-turyści na rowerach nie do końca stricte szosowych.

Startujemy z lekkim opóźnieniem o 08:05.

Tempo pierwszego kilometra turystyczne dyktują ci na turystycznych. Inaczej niż w zeszłym roku -- słynny start z kol. Wiktorem -- kiedy to startując w grupie #2 już od początku mieliśmy wściekły zapieprz. Wygląda na to, że najwięksi ściganci się nie spieszą i ustawiają się w kolejnych grupach na starcie. No i dobrze...

Po pierwszym kilometrze zmiana. Prowadzących i tempa. Jedziemy na wschód z wiatrem jakieś 33--35 km. Miło i przyjemnie, do czasu aż doganiają nas ci superściganci. Zabieram się z nimi. Tempo może i specjalnie nie wzrasta, ale to tylko dlatego, że teraz mamy wiatr boczny, a potem czołowo-boczny. Wieje całkiem mocno na wschód/północny-wschód (na Kaliningrad he, he). Zapieprz całkiem konkretny, aż do skrętu na drogę 502 w Tujsku. Tutaj poprawia się jakość asfaltu, ale też tempo wzrasta. Z jednym takim mocnym w nogach, ale powiedzmy słabym w taktyce odpadamy. Mocarze pojechali. Za nami z kolei też nikogo nie widać. Mój kompan jest tak mocny, że gdyby miał lepszą taktykę, to bez problemu by jechał w pierwszej grupie, a tak to mnie tylko holuje (zmian nie daję, o czym go uprzedzam).

Dojeżdżamy do bufetu #1. Ponieważ sytuacja się rozwinęła, tak jak się rozwinęła sugerują żeby stanąć. Pierwszy bufet w Jantarze tak trochę na uboczu, z drogi go nie widać. Zajeżdżamy. Okazuje się, że grupa czołowa też tu stanęła. Bufet super zaopatrzony zresztą: ciasta domowej roboty, naleśniki, bułki z czymśtam. Nawet jakaś zupa. Jakby spróbować tylko każdej z potraw to by człowiek nie był w stanie dalej jechać. Jem dwa kawałki ciasta i dwa naleśniki. Dwa następne w kieszeń...

Jadę dalej. Nawet zaczynam z grupą czołową znowu, ale za duże tempo więc odpuszczam. Dogania mnie za to całkiem mocny gość a potem jeszcze jeden. Jedziemy zgodnie tym razem aż do Nowej Kościelnicy. Tutaj wyłącza mi się kamera (bo zapomniałem włączyć guziczek `Ładuj' w Powerbanku--zawsze czegoś zapomnę). Mówię tym, z którym jadę żeby chwilę zwolnili, bo chcę ustalić co dalej z kamerą, ale oni nie potrafią wolno--no trudno zostałem sam, ale z tyłu ktoś kręci, więc się nie napinam tylko czekam aż mnie dogonią.

Znowu dwóch, ale innych. Słabsi niż ci co nie chcieli czekać i do tego słabi technicznie, że tak powiem. Ja tam po zmianie się za nich chowam oni nie--na kole nie jadą, tylko obok albo 10m za. Mimo tego trzymają się, pomimo tego wściekłego bocznego wiatru. Jedziemy wzdłuż Wisły aż do Mątowów (Dorota z Mątew), tyle że po drodze wreszcie urywam swoich partnerów, ale mam za to dwóch innych. Jednego już znam, jechałem z nim wcześniej. Przeoczyłem bufet #2, on stanął a teraz mnie doszedł (z kolegą).

Za Mątowami skręt jakby na wschód, na wschód, na Miłoradz. Teraz wiatr jest w plecy aż do bufetu #3 (raptę parę kilometrów). Jedziemy we trzech spacerowo, tym bardziej że jeden z nas ma kapcia (ale takiego że idzie jechać--zmieni dętkę na bufecie). Jest generalnie przekonanie że od Miłoradza będzie miło i przyjemnie z wiatrem. Potem się okazało że nie było i nawet nie było szans żeby było przy tym kierunku wiatru (o tym później). Wykorzystując przerwę w zapieprzu uświadamiam współścigantom gdzie są. Że są w Mątowach, wsi w której urodziła się słynna bł. Dorota. Pytam się czy słyszeli o Dorocie. Nie. No to ja że to matka 9-ga dzieci, która kazała się zamurować w celi, gdzie zmarła. No bo jak taki/taka się już zamurował, to no-way, wychodził już tylko nogami do przodu. -- Ale po co? pyta współścigant. -- Ku chwale Bożej -- odpowiadam -- dawniej ludzie tak mieli. -- No ale coś z tego było? A to nie wiem -- odpowiadam :-)

Bufet w Miłoradzu całkiem zwyczajny: chleb z marmoladą i smalcem. Ale dają też kopytka na słodko. Swoim zwyczajem nie rozsiadam się, jem kopytka i dalej sam--dogonią mnie. I faktycznie doganiają w Pogorzałej Wsi. Stąd jest z wiatrem wzdłuż Nogatu prosto do Malborka. Zapierdzielamy całkiem żwawo, a mnie się już przstało chcieć, jeszcze dociągam do Zamku i odpuszczam na zakręcie DK55 na Kościeleczki. Co się będę spinał--z wiatrem sobie pojadę te ostatnie 20km sam (sobie myślę).

Bym znał profil trasy dokładnie, to bym nie miał takich złudzeń. Znowu wieje nieprzyjemny boczny wiatr (aż do Lubiszewa czyli aż praktycznie do mety). Generalnie z tym wiatrem to masakra była. Kilka odcinków z wiatrem, reszta zwykle z nieprzyjemny bocznym albo nawet pod wiatr.

Kilka kilometrów jadę sam, ale dogania mnie następna grupa. Ci są z firmy, są jednakowo ubrani, całkiem mocni i wiedzą co to jazda w grupie. Jadę z nimi prawie do końca, czyli do Lubiszewa. Tam odpuszczam, bo tempo wzrasta a mi się już nie chce (pobudka 4:20 ostatecznie--więc mam wymówkę)

13:02 jestem na mecie. Jem makaron i do Malborka na pociąg. Jest pod wiatr, non-stop. No ale ja się nie spinam. Mam pociąg 15:02 i dużo czasu, tyle że jak się jedzie 18kmh, po przejechaniu 25 +135 = 160 km to trochę się dłuży droga, by się już chciało skończyć.

Dojeżdżam jakoś tak 14:40. Się okazuje, że pociąg jest 14:57 i całkiem sporo ludzi w kolejce do kasy. Kupuję bilet, jest 14:50.

W Kałdowie dosiada się współścigant z pierwszej grupy. Podobno był drugi, jechał circa 4:20 (ja circa 4:57). Na mecie się ociągał, wyjechał o 14:00 i ledwo zdążył pod ten wiatr. By pociąg nie stawał w Kałdowie (nie wszystkie stają, bo to mały przystanek jest bez kas i budynku, a nie żadna stacja), to by nie zdążył. Uświadamiam go jakie miał szczęście :-) NB ja też mogłem w Kałdowie wsiadać, ale wolałem do Malborka, bo to różnie bywa (w sensie, że w Malborku bardziej komfortowo się do pociągu wejdzie--co jest istotne jak się ma takiego klamota jak rower)...

W domu jestem circa 16:20. Minęło 12h od pobudki...

Filmik dając pojęcie jak (ciężko) było :-) jest tutaj. BTW odszukaj na googleMaps Rubno Wlk jeżeli nie wiesz czemu drogowskaz w Marzęcinie wydaje się bezsensowny.

url | Mon, 24/09/2018 05:30 | tagi: ,
Żuławy w Koło 2018

Się tak rozochociłem, że zapisałem się na Żuławy w Koło 2018 (99 PLN). W ramach przygotowań, że tak powiem taktycznych postanowiłem rozpoznać możliwości przeciwnika:-) Konkretnie ustalić jak jechali ci co się zapisali, a co już startowali w ŻwK w roku 2017 albo 2016. Zadanie zatem polega na odszukaniu na liście zgłoszeń tych co się zapisali na edycję 2018 i jednocześnie ukończyli ŻwK w latach 2016/2017. Oczywiście nie ręcznie, tylko automatem:

## poniższe ściąga plik z listą zapisanych
wget 'http://www.czasomierzyk.pl/zapisy2016/zulawywkolo/index.php?akcja=lista' -O ZwK2018.out

Plik HTML ma tak prostą strukturę, że jego zamiana (za pomocą wyrażeń regularnych) na CSV jest banalna. Jak już mam ten plik CSV, to porównuję go do połączonych wyników z lat 2017/2016 (też w formacie CSV). Skrypt mam co porównuje pliki CSV:

perl join_csvs.pl -fn1 ZwK201809190908.csv  -fs1 1,2 -fn2 ZwK16_17.csv -fs2 1,2

Porównuje pliki ZwK201809190908.csv oraz ZwK16_17.csv, w oparciu o (wspólną) wartości dla kolumn nr 1 oraz nr 2 (w tym przypadku są to kolumny zawierające nazwisko i imię). Innymi słowy fs1 c1,c2..., to klucz główny, a fs2 c1,c2, to klucz obcy. Skrypt wypisuje połączone wiersze odpowiadające tym wierszom dla, których klucz główny = klucz obcy. Na dziś (19 września) takich wierszy wypisał 55, (na 104 zgłoszenia na dystansie 140km), ale pomijam tych co startowali kiedyś na najkrótszym dystansie lub tych, którzy startowali wprawdzie na najkrótszym, ale mieli średnią mniejszą niż 24kmh (odpada w ten sposób 10 zostaje 45). Na koniec plik jest zapodawany do prostego skryptu rysującego wykres słupkowy:

z <- read.csv("ZwK_2018_vs_2017.csv", sep = ';',
   header=T, na.string="NA", dec=".");

s140 <- summary(z$speed)

z <- subset (z, ( speed > 16.0 )); ## bez maruderów

# wykres słupkowy
h <- hist(z$speed,
  breaks=c(18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35),
  freq=TRUE,
  col="orange",
  main="Dystans: 140 (biorący udział w latach 2017-16)",
  xlab="Prędkość średnia w latach 2017--16 [kmh]",ylab="L.kolarzy",
  labels=T, xaxt='n' )
  axis(side=1, at=c(18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35))
  text(38, 37, summary_label, cex = .8, adj=c(1,1) )

Jak widać paru ludków w okolicach 30kmh jest. Będzie za kim jechać.

url | Wed, 19/09/2018 12:54 | tagi: , , ,
Kociewie Kołem 2018 (how it unfolded)


Z Elką wyjechaliśmy 6:10 albo coś w tym stylu (plan był że o 6:00)

Po z grubsza godzinie byliśmy na tym Owidz-Grodzisku...

Poleciałem po numer i 7:40 byłem gotowy. Elka odjechała. Na start podjechałem 7:50 a tam tłumów nie ma; ostatecznie wystartowałem o 8:06 z pierwszą grupą.

Plan był taki żeby zapierdzielać w grupie dopóki się da, ale na bufetach stawać i jechać z następną grupą. W tym zbożnym celu nie wziąłem prawie nic do jedzenia (ostatecznie za start zapłaciłem 111 PLN, więc niech się chociaż trochę zwróci). Ponieważ dobrze mi szło i ponieważ pierwszy bufet był już na 40 km, to go ominąłem. Być może to był błąd, bo tak do 70 km to mi szło, a potem już jakby nie do końca. Do 80 km jeszcze się trzymałem, ale do bufetu #2 (na prawie 100 km) dotarłem w kiepskim stanie i za grupą. W bufecie szandar i ciasta, przy czym szandar, to zapieczone utarte ziemniaki z cebulą i boczkiem. Rodzaj mega-placka ziemniaczanego (przepis w goole można znaleźć). Jem tego 2/3 porcji, resztę w kieszeń na spróbowanie dla Elki. Do szandara kawka + mały serniczek i jadę dalej. BTW mi ten szandar smakował, ale opinia może być nieobiektywna, bo głodny byłem.

Część grupy, z którą jechałem bufetowała tak długo, że mogę kontynuować jazdę w mocnym towarzystwie. Całkiem nieźle mi znowu idzie, co z jednej strony pewnie zasługą szandara, a z drugiej że grupa ciut wolniej pomyka, bo jednak najsilniejszych już w niej nie ma. Na 115 km bufetu #3. Ja skręcam do bufetu, a moja grupa nie. Na bufecie tłumy, bo tą część trasy pokonują już uczestnicy, którzy się zapisali na krótsze dystanse. Zamiast szandara dają racuchy i jakąś zupę z kapustą. Za zupę dziękuję, jem dwa racuchy (dwa następne biorę na spróbowanie dla Elki) z kawką i dalej.

Teraz jadę w sumie sam, mijając pojedynczych maruderów. Wreszcie dogania mnie poważna grupa i następne parę kilometrów mam solidne koło. Tylko parę, bo bufet #4 jeszcze został (130 km). Moja grupa jedzie dalej a ja skręcam. Dobra decyzja, bo bufet #4 najlepiej zaopatrzony. Wprawdzie bardziej oglądam niż jem, ale nawet dla popatrzenia warto było stanąć. Są omasty w tuzinie bodajże wariantów (z nieśmiertelnym smalcem na czele, ale zmieszanym z grzybami), ciasta, jogurty... Ja decyduję się na kaszę manną z czarną jagodą + dwie małe porcje jogurtu. Kasza tak mi smakuje, że dwie porcje ładuję do bidonu dla Elki (w domu się dowiaduję, że Elka nie lubi kaszy mannej.)

Od bufetu #4 do mety mam 25km. Z 10 km jadę ze starszym gościem, resztę sam. Dojeżdżam do mety o 13:20 czy jakoś tak czyli po 5h z niewielkim ogonkiem. Trasa co mi się wydawała na rysunku mocno sfalowana okazała się całkiem płaska. Jedyna niewielka dolegliwość to stan dróg, nie tyle dziurawych co o nierównej nawierzchni (pofalowany/popękany asfalt)

Idę po medal, potem po makaron. Potem jadę 30 km do Tczewa na pociąg :-). Do Pelplina jest bliżej, ale tam najbliższy pociąg do Gdańska odjeżdża o 16:45.

Żeby się nie stresować, nie sprawdzam połączeń z Trójmiastem z Tczewa do którego docieram o 15:15. Pociąg mam 15:17 i już na niego nie zdążę. Następny jest o 16:30. Pech...

W domu jestem o 17:40.

Sprawy sprzętowe

Eksperymentalnie dokleiłem do mostka powerbank (Anker Mini 3000 mAh) do zasilania kamery, która normalnie działa circa 2h. Alternatywą byłoby wymienianie akumulatora na bufetach, ale to zawsze stres i kłopot, bo trzeba odkręcić śrubę mocującą, wyjąć kamerę z obudowy a potem wsadzić i zakręcić. U mnie nie jest to aż tak trywialne z uwagi na konstrukcję obudowy i sposób jej umieszczenia (pod kierownicą, bo przecież nie będą jeździł z obciachowo sterczącą kamerą.) Pomysł z powerbankiem się sprawdził, a kamera się wyłączyła no dokładnie na linii mety (czasami ma się szczęście.) Teraz mam 128Gb do przetworzenia...

Ślad jest tutaj (albo kml.) Kilka zdjęć jest tutaj.

url | Mon, 10/09/2018 07:18 | tagi: ,
Przygotowania do Kociewie Kołem


W zeszłym roku wziąłem udział w imprezie kolarsko-rekreacyjnej pn. Żuławy w Koło, a teraz zapisałem się na Kociewie Kołem, która ma się odbyć 9 września. Ta sama firma organizuje jak się łatwo domyśleć.

Żeby nie jechać w ciemno pobrałem stosowne dane ze strony organizatora, zamieniłem je na plik CSV i policzyłem różne statystyki. W 2016 średnia prędkość na najdłuższym dystancie (170 km) wyniosła na przykład 27,05 km/h. Rok później (dystans 155 km) było to 26,69 km/h. Czyli sporo, bo na płaskiej i krótszej trasie Żuławy w Koło było dla przykładu w 2016 roku 25,47 km/h, a w 2017 26,23 km/h. Więcej szczegółów na wykresach pudełkowych obok.

Ściągnąłem też w środę listę uczestników, których okazało się jest 719, w tym z Gdańska 332, z Gdyni 107, a tak w ogóle to ze 120 różnych miejscowości. Za pomocą Google Fusion Tables można pokazać listę na mapie. Żeby kropki z tej samej miejscowości się nie nakładały na siebie zastosowałem losowe `drganie' (jitter) wg. algorytmu:

### Jitter w kole o średnicy $r
$factorJ = 0.00001; ## ustalone heurystycznie

$sd = sqrt($factorJ * $N); # $N liczba kropek dla miejscowosci, tj dla GDA 332
$r = $sd * sqrt(rand()); $theta = rand() * 2 * $pi;
$rand_lat = $lat + $r * cos($theta);
$rand_lon = $lon + $r * sin($theta);

### Jitter w prostokącie o boku $r
$rand_lat = $lat + rand($sd);
$rand_lon = $lon + rand($sd);

Rezultat jak na obrazku poniżej, albo tutaj.

Lewy obrazek to mapa bez `jittera' a prawy z zastosowanym `jitterem'.

url | Fri, 07/09/2018 07:46 | tagi: , , , , ,
Pętla: Skarszewy-Starogard-Pelplin-Tczew

Pojechałem sobie w niedzielę (19.05) właśnie taką trasą

Mieszkając w środku 3Miasta ma się problem z wyjechaniem z miasta w kierunku wschód/zachód. Na północ się nie pojedzie, bo morze. Pozostaje południe, tyle że się nudzi te ciągłe jeżdżenie na kierunku Osowa-Chwaszczyno-Kielno.

Weekend jest zatem dobrym momentem przejechania przez duże miasto w miarę sprawnie (światła/ruch/skrzyżowania), a zwłaszcza w godzinach porannych. Tak do 6:00--7:00 Gdynia to prawdziwe #GhostTown. W Gdańsku jest już wtedy większy ruch, ale też bez porównania z tym co się dzieje później, o ruchu w normalne dni/godziny nie wspominając.

No to pojechałem na Kociewie, rozpoczynając o 7:10. Wg planu przejechałem Gdańsk swoją trasą optymalną (dłuższą niż wzdłuż al. Zwycięstwa ale minimalizującą liczbę świateł, na których trzeba stawać i czekać na zmianę): Czyżewskiego-Polanki-Partyzantów-Matejki-Do Studzienki. Potem Końskim Traktem aż do Ronda Ofiar Katynia (lepiej znanym pod nazwą Plac Zebrań Ludowych). Teraz 3 Maja-Armii Krajowej i myk już jestem na #DK91. Ruch znikomy więc komfortowo pomykam na Pruszcz. DK91 generalnie jest bezpieczna, bo szeroka, tyle że jak jest duży ruch to hałas jest. Tą ścieżką na wale nie jeżdżę--nawierzchnia słaba/dużo przeszkód typu wysokie krawężniki. Nie mam obowiązku używania tej ścieżki zresztą więc działam też zgodnie z kodeksem.

Wylot (albo wlot) na Starogard (#DK222) jest zamknięty -- bo remont -- więc jadę dalej do Pruszcza z zamiarem wjechania na #DK226 albo #DK222. Skręcam od razu w ul. Raciborskiego, czyli decyduję się na DK222. Bym jechał dalej to mógłbym skręcić w ul. Zastawną (pierwszy skręt w prawo za Radunią). O tyle ten wariant jest nie-ten-teges, że ileś świateł jest po drodze i to takiej pryncypialnej, że trochę głupio na czerwonym wjeżdżać (a nawet bardzo głupio). Się zresztą okazało, że DK222 jest remontowana nie tylko na odcinku ulicy Starogardzkiej, ale później też. Co jakiś czas ruch jest tylko jednym pasem. Światła na krańcach takich odcinków skutecznie zniechęcają potencjalnych użytkowników, więc droga jest praktycznie pusta. Hurraaa! Do tego wiatr w plecy więc podjeżdżanie na odcinku Pruszcz--skrzyżowanie DK222/DK226, gdzie generalnie jest pod górę, idzie w warunkach komfortowych.

Dalej też zgodnie z planem DK226 do Mierzeszyna, a tutaj wątpliwość co dalej z uwagi na niejasny drogowskaz. Pytam się miejscowego, ale on nie wie, która to 226 (co za ciemniak), i że jak na Nową Karczmę to prosto. Na szczęście się go nie słucham i skręcam w lewo. Droga robi się jakościowo mocno średnia: dziur nie ma, ale nawierzchnia jest wyboista więc trzęsie. Sucha Huta--odludna wieś na skraju dużego lasu. Jeszcze parę kilometrów i skręt na Skarszewy. Do tej pory miałem wrażenie, że wjeżdżam z prawym bocznym przeciwnym wiatrem pod górę. Teraz będzie z wiatrem w plecy. No i dużo w dół, bo generalnie mam się finalnie znaleźć na poziomie Wisły.

W Skarszewach kilka fotek w tym malownicze rozlewisko Wierzycy i dalej jadę na Starogard. Przed Starogardem w Linowcu natykam się, prawie na poboczu na zastrzelonego jelenia. Dziwna sprawa, bo jest około 10:00 a zwierzę leży. Jeżeli to efekt polowania (o czym by świadczyłaby ogromna dziura z boku klatki piersiowej), to pewnie straciło życie wcześnie rano więc upłynęło już wystarczająco dużo czasu żeby go zabrać. Anyway pierwszy raz w życiu widzę coś takiego.

Starogard bez historii--nie planują się tutaj zatrzymywać. Jadę na Pelplin drogą #DK222/#DK229. Wzdłuż obu zbudowali ścieżkę, a na drodze non stop zakaz jazdy rowerem. Zakaz to zakaz--nie jadę. Ścieżka jest bardzo dobrej jakości. Da się jechać szybko, prowadzi jedną stroną drogi więc nie ma tak uciążliwych w przypadku wielu innych ścieżek miedzymiastowych zmian prawa/lewa strona drogi co kilka kilometrów.

Mijam A1 (aka autostrada Bursztynowa), wjeżdżam do Pelplina. To tak w ogóle ciekawe miasteczko jest i godne zwiedzania: muzeum diecezjalne/katedra, ale ja zwiedzałem i jedno i drugie niedawno, więc tylko zdjęcie katedry na dowód, że byłem i jadę dalej kierując się na Rajowy-Maniowo-Radostowo.

Droga znowu robi się wyboista (ale nie dziurawa). Tempo spada wiatr przestał wiać w plecy, jest teraz boczny, często niesprzyjający. W Rajkowach widzę kościół i skręcam. Dobra decyzja: przy kościele stary cmentarz z grobami z końca 19 wieku. Polskie nazwiska i inskrypcje. Jeden kuty krzyż o interesującym wyglądzie oraz jeden żeliwny odlewany. Ha, jeden skalp więcej (mowa o tym żeliwnym odlewanym--których geotagowane zdjęcia kolekcjonuję). Następny przystanek jest już planowany: gospodarstwo pn. Radostowskie Rarytasy. Z daleka widać napis sprzedaż serów czy jakoś tak.

Radostowskie Rarytasy wypatrzyłem na Facebooku. Spodobało mi się, że się fajnie promują. Teraz mam okazję zobaczyć sklep w realu i też mi się podoba. Kupuję kilka małych kawałków różnych serów. Każdy elegancko opakowany w firmowy papier. Do tego masło dla Elki. Pani proponuje jeszcze twaróg i mleko, no ale ja nie mam już miejsca w plecaku, no i do Sopotu jeszcze trochę zostało więc plecak za ciężki to też nie powinien być. Pani sprzedawczyni robi mi zdjęcie przed sklepem i jadę dalej.

Wjeżdżam na DK91 w Subkowach, skręcam na Tczew.

Oczywiście Tczew też warto zwiedzić tak w ogóle, ale ja tu już byłem milion razy więc nie wjeżdżam do miasta tylko DK91 na Gdańsk.

NB chciałem wracać przez Żuławy, ale zmieniam zdanie. Na liczniku już circa 120 km, do domu jeszcze trochę zostało. Szacuję że jak pojadę DK91 to wyjdzie circa 170. Przez Żuławy byłoby dalej. Jadę DK91. Wbrew pozorom jazda tą drogą jest całkiem OK--ruch jest mały, bo większość aut jeździ po A1. Teraz jest pod wiatr, ale ponieważ jest ciepło, to jest OK, tyle że jadę wolniej niż gdyby wiało w plecy.

W Gdańsku mógłbym wracać z grubsza tą samą trasą co jechałem rano, ale decyduję się na inny wariant: DK91 do Huciska (tunelem pod DK501/Armii Krajowej w szczególności)-- Podwale Staromiejskie--Podmłyńska/Rajska (albo Stolarska/Łagiewniki). Jeżeli Podwale Staromiejskie to do skrzyżowania przy Zieleniaku no i dalej standard czyli ścieżka rowerowa wzdłuż al. Zwycięstwa. Jeżeli zaś Stolarska/Łagiewniki, to bardziej skomplikowana trasa: Marynarki Polskiej--Uczniowska--Czarny Dwór itp. Dziś wybieram wariant #1 Podmłyńska/Rajska--al. Zwycięstwa.

W domu jest tuż przed 15:00, na liczniku (prawie) 170km.

Niedziela

Zaczynam godzinę później tj. 8:10. Miasto puste (niehandlowa niedziela BTW). Trasa znana i już raz objechana w całości, a wielu fragmentach, to nawet wielokrotnie: Gdynia-Pierwoszyno-Mrzezino-Puck-Łebcz-Władysławowo. W Pucku ciekawostkowe muzeum jest BTW eksponujące modele wodnosamolotów Lublin R-XIII (nie zwiedzałem, podobno ciekawe). Inna atrakcja w drodze do Pucka to Rzucewo gdzie jest pałac/hotel oraz zejście na plażę z minimolem. Tyle, że droga do Rzucewa (3km) koszmarnie dziurawa

We Władysławowie powrót drogą główną, tj. DK216 (mały ruch) do Widlina, tam skręt na Mrzezino. Stąd praktycznie tą samą trasą co rano tyle, że w przeciwną stronę.

Wycieczka bez historii. W Połchowie są groty (trzeba skręcić przy sklepie w prawo na Gdynię), na które tak w ogóle warto rzucić okiem (google:grota połchowo), ale ja już rzucałem więc nie skręcam. Poza tym, przed Połchowem dogania mnie i śmiało wyprzedza facet na niebieskim Fuji. No to ja mu na koło i jedziemy. Odnoszę wrażenie że gość chce mnie urwać. Zagina się i rantuje. W końcu odpuszcza--się zorientował, że wprawdzie gość (czyli ja) wolno jechał sam, ale teraz to magicznie ożył i nie-da-rady go zgubić. Typ mruka o silnych nogach. Nie odzywa się, ani cześć ani pocałuj-wójta... Za Mrzezinem facet zaczyna się denerwować, widać że moja jazda za nim nie podoba mu się, w końcu macha rękami, zwalnia i zjeżdża w lewo. No to daję zmianę, ale gość nie korzysta z koła--jedzie 10m za mną. Amatorka totalna. Tak dojeżdżamy do skrzyżowania z DK100, gdzie znowu mnie wyprzedza. Tym razem daję mu spokój. A niech jedzie. Niedziela jest, co go będę stresował:-)

W domu jest tuż przed 12:45, na liczniku (prawie) 110km.

Do pobrania ślady kml ze zdjęciami; zdjęcia (flickr); ślad gpx; ślad kml.

url | Mon, 21/05/2018 12:54 | tagi: , ,
Żuławy wKoło 2017 -- podsumowanie



Podsumowanie wyników dla lat 2015--2017

z16 <- read.csv("wyniki_zulawy_2016_D.csv", sep = ';',  header=T, na.string="NA", dec=",");
aggregate (z16$time, list(Numer = z16$dist), summary)
z16$year <- 2016;

z15 <- read.csv("wyniki_zulawy_2015_D.csv", sep = ';',  header=T, na.string="NA", dec=",");
aggregate (z15$time, list(Numer = z15$dist), summary)
z15$year <- 2015;

z17 <- read.csv("wyniki_zulawy_2017_D.csv", sep = ';',  header=T, na.string="NA", dec=".");
aggregate (z17$time, list(Numer = z17$dist), summary)
z17$year <- 2017;

zz15 <- z15[, c("dist", "kmH", "time", "year")];
zz16 <- z16[, c("dist", "kmH", "time", "year")];
zz17  <- z17[, c("dist", "kmH", "time", "year")];

zz <- rbind (zz15, zz16, zz17);

## tylko dystans 140
zz140 <- subset (zz, ( dist == 140 ));
sum140 <- aggregate (zz140$kmH, list(Numer = zz140$year), summary)

boxplot (kmH ~ year, zz140, ylab = "Śr.prędkość [kmh]", col = "yellow", main="140km" )

## tylko dystans 55
zz75 <- subset (zz, ( dist > 60 & dist < 90 ));
sum75 <- aggregate (zz75$kmH, list(Numer = zz75$year), summary)
sum75
boxplot (kmH ~ year, zz75, ylab = "Śr.prędkość [kmh]", col = "yellow", main="80/75km" )

## tylko dystans 55
zz55 <- subset (zz, ( dist < 60 ));
sum55 <- aggregate (zz55$kmH, list(Numer = zz55$year), summary)
sum55
xl <- paste ("średnie 2015=", sum55$x[1,4], "kmh   2016=",
  sum55$x[2,4], "kmh   2017=", sum55$x[3,4], " kmh")

  boxplot (kmH ~ year, zz55, xlab = xl,
  ylab = "Śr.prędkość [kmh]", col = "yellow", main="55km" )

A ja (numer 418) byłem 70 w kategorii 140 km, z czasem 5:42:03 co dało 24,56 kmh przeciętną. Do pierwszego bufetu się spinałem, potem już nie...

url | Thu, 28/09/2017 05:17 | tagi: , ,
Przed Żuławy w Koło 2017

Jutro planuję przejechać 140km biorąc udział w imprezie pn. Żuławy wKoło 2017. Niby Żuławy a profil trasy sugeruje jakieś istotne wzniesienie w okolicach 25--40km:

Uważnie przyjrzenie się liczbom (zwłaszcza na osi OY) pozwala stwierdzić, że jest to złudzenie, wynikające z różnicy w jednostkach miary obu osi (kilometry vs metry). W rzeczywistości góra tam jest symboliczna o czym można się przekonać robiąc wykres nachyleń. Żeby pozbyć się przypadkowych błędów związanych z niedokładnością pomiaru oryginalne 673 punktowe dane zostały zmienione na 111 punktowe (uśrednienie minimum 1 km) lub 62 punktowe (uśrednienie minimum 2 km).

Przy czym uśrednienie minimum $x$ oznacza obliczenie nachylenia dla najkrótszego odcinka kolejnych $n$ punktów z oryginalnego śladu GPX, który będzie dłuższy niż $x$.

Skrypty R/dane są tutaj. Oryginale ślady GPX/TCX skopiowane ze strony ŻwK są tutaj.

url | Sat, 23/09/2017 17:02 | tagi: , , ,
Żuławy w koło 2016

Żuławy w koło to maraton rowerowy (czyli przejazd rowerem na dłuższym dystansie -- nie mylić z wyścigiem) organizowany od paru lat na Żuławach jak nazwa wskazuje. Sprawdziłem jak ta impreza wyglądała pod kątem prędkości w roku 2016. W tym celu ze strony Wyniki żUŁAWY wKOŁO 2016 ściągnąłem stosowny plik PDF z danymi, który następnie skonwertowałem do pliku w formacie XLS (Excel) wykorzystując konwerter on-line tajemniczej firmy convertio.pl. Tajemniczej w tym sensie, że nie znalazłem informacji kto i po co tą usługę świadczy.

Konwersja (do formatu CSV) -- jak to zwykle konwersja -- nie poszła na 100% poprawnie i wymagała jeszcze circa 30 minutowej ręcznej obróbki. Być może zresztą są lepsze konwertery, ale problem był z gatunku banalnych i wolałem stracić 30 minut na poprawianiu wyników konwersji niż 2 godziny na ustalaniu, który z konwerterów on-line konwertuje ten konkretny plik PDF (w miarę) bezbłędnie.

Po konwersji wypadało by sprawdzić (chociaż zgrubnie) czy wszystko jest OK.

## Czy każdy wiersz zawieraja 9 pól (powinien)
$ awk -F ';' 'NF != 9 {print NR, NF}' wyniki_zulawy_2016S.csv

## Ilu było uczestników na dystansie 140km?
$ awk -F ';' '$7 ==140 {print $0}' wyniki_zulawy_2016S.csv | wc -l
133

## Ilu było wszystkich (winno być 567 + 1 nagłówek)
$ cat wyniki_zulawy_2016S.csv | wc -l
568 # ok!

Przykładowy wykres pudełkowy

Do analizy statystycznej wykorzystano wykres pudełkowy (porównanie wyników na różnych dystansach) oraz histogram (rozkład średnich prędkości na dystansie 140km). BTW gdyby ktoś nie wiedział co to jest wykres pudełkowy to wyjaśnienie jest na rysunku obok. Objaśnienie: Me, $Q_1$, $Q_3$ to odpowiednio mediana i kwartyle. Dolna/górna krawędź prostokąta wyznacza zatem rozstęp kwartylny (IQR). Wąsy ($W_L$/$W_U$) są wyznaczane jako 150% wartości rozstępu kwartylnego. Wartości leżące poza ,,wąsami'' (nietypowe) są oznaczane kółkami.

Ww. wykresy wygenerowano następującym skryptem:

#
co <- "Żuławy wKoło 2016"
#
z <- read.csv("wyniki_zulawy_2016_C.csv", sep = ';',
  header=T, na.string="NA", dec=",");

aggregate (z$meanv, list(Numer = z$dist), fivenum)

boxplot (meanv ~ dist, z, xlab = "Dystans [km]",
    ylab = "Śr.prędkość [kmh]", col = "yellow", main=co )

## tylko dystans 140
z140 <- subset (z, ( dist == 140 ));

## statystyki zbiorcze
s140 <- summary(z140$meanv)
names(s140)

summary_label <- paste (sep='', "Średnia = ", s140[["Mean"]], 
  "\nMediana = ", s140[["Median"]],
  "\nQ1 = ", s140[["1st Qu."]],  "\nQ3 = ", s140[["3rd Qu."]],
  "\n\nMax = ", s140[["Max."]] )
# drukuje wartości kolumny meanv
# z140$meanv
# drukuje wartości statystyk zbiorczych
s140

# wykres słupkowy
h <- hist(z140$meanv, breaks=c(14,18,22,26,30,34,38), freq=TRUE, 
   col="orange", 
   main=paste (co, "[140km]"), # tytuł
   xlab="Prędkość [kmh]",ylab="L.kolarzy", labels=T, xaxt='n' )
# xaxt usuwa domyślną oś 
# axis definiuje lepiej oś OX
axis(side=1, at=c(14,18,22,26,30,34,38))
text(38, 37, summary_label, cex = .8, adj=c(1,1) )

Dane i wyniki są tutaj

url | Mon, 11/09/2017 08:10 | tagi: , , ,
O lepsze liczenie kadencji

Informacja o kadencji jest w pliku .tcx rejestrowana (przez GarminaEdge 500) w następujący sposób:

  <Activities>
    <Activity Sport="Biking">
      <Lap StartTime="2017-08-31T14:51:16Z">
	<Cadence>77</Cadence>
	...
	<Track>
  	  <Trackpoint>
             <Time>2017-08-31T14:52:02Z</Time>
             <Cadence>0</Cadence>
          </Trackpoint>
	  <Trackpoint>
	     <Time>2017-08-31T14:52:06Z</Time>
	     <Cadence>46</Cadence>
	  </Trackpoint>
	  <Trackpoint>
            <Time>2017-08-31T14:52:07Z</Time>
	    <Cadence>53</Cadence>
	  </Trackpoint>

Lap-ów może być wiele. Każdy zawiera element Track, w którym zapisana jest informacja o fragmencie trasy. Pomiędzy LapTrack znajduje się nagłówek zawierający różne obliczone/zbiorcze informacje, m.in. średnią kadencję. Co by oznaczało, że w powyższym przykładzie średnia kadencja wynosiła 77 obrotów/min. Na odcinku od 14:52:02Z do 14:52:06Z (4 sekundy) średnia kadencja wyniosła 46 o/min, zaś na odcinku 14:52:06Z--07Z (1s) 53 o/min.

Można też policzyć kadencję samodzielnie, co pozwoli na uzyskanie dodatkowej informacji. Liczenie kadencji jest proste. Mnożąc średnią kadencję odcinka razy czas w sekundach otrzymamy liczbę obrotów korby na tym odcinku (kadencję należy podzielić przez 60 bo jest podana w minutach). Odcinki o zerowej kadencji pomija się (Garmin też tak oblicza BTW). Dzieląc łączną liczbę obrotów przez czas otrzymamy średnią kadencję. Ja dodałem opcję pomijania odcinków o pewnej minimalnej prędkości (np. 8 kmh) -- takie odcinki to zwykle jakieś nietypowe fragmenty, zaniżające tylko średnią.

#!/usr/bin/perl
# Cadence calculator for GarminEdge tcx files (or converted fits)
# tprzechlewski@gmail.com
use Getopt::Long;

my $prev_Time = -1;
my $parsingTrack ='N';
my $regCadence = 'N';
my $min_speed = -1; # minimum speed
my $trackNo=1;

GetOptions( "s=f"  => \$min_speed, );
$min_speedMS = ($min_speed *1000)/3600.0;

if ($min_speed > 0) {
  print "*** Segments with speed below $min_speed kmh skipped ***\n";
}

while (<>) {
  chomp();

  # Order is importany (first check for <Track>:
  if ( /<Track>/ ) {
    if ( $regCadence eq 'N' ) {
      ## Check if Cadence is registered
      print STDERR "*** No cadence registered! ***\n";
      exit 1;
    } else {
      $parsingTrack = 'Y' ; print STDERR "### Parsing track #$trackNo...\n";
      $trackNo++;
    }
  }

  # Parsing header:
  if ($parsingTrack eq 'N' ) {
    if ( /<TotalTimeSeconds>/) {
      $edge_LapTime = xmlEleValue('TotalTimeSeconds', $_) ; }
    elsif (/<Cadence>/) {
      $edge_LapCadence = xmlEleValue('Cadence', $_) ; $regCadence = 'Y' }
    elsif (/<DistanceMeters>/) {
      $edge_LapDist = xmlEleValue('DistanceMeters', $_) ;  }
    ##print STDERR "## Parsing track info: $_\n";
    next;
  }


  ## start parsing Track now:
  if (/Speed>/)  { $speed = xmlEleValue ('Speed', $_);
  } elsif ($_ =~ /<Time>(.*)T(.*)Z<\/Time>/ ) {
    $time = $2;
    ($h, $m, $s )  = split /:/, $time;
    $current_time = $h * 60 * 60  + $m * 60 + $s ;
    ##print STDERR "$current_time\n";
  } elsif (/<Cadence>/ ) {
    $cadence = xmlEleValue ('Cadence', $_);
  } elsif (/<DistanceMeters>/ ) { 
    $distance = xmlEleValue ('DistanceMeters', $_);
  } elsif ($_ =~ /<\/Trackpoint>/ ) {

    if ( $prevTime > 0 ) {## pomija pierwsze
      $lastTime = $current_time ;
      if ($cadence > 0 && $speed > $min_speedMS ) {
	$timeDiff = $current_time - $prevTime; 

	$total_time_cycled += $timeDiff ;
	$total_cycles += $cadence * $timeDiff / 60;

	$prevTime = $current_time ;
      }
      else {
	$timeDiff = $current_time - $prevTime; 

	$total_time_idle += $timeDiff ;

	$prevTime = $current_time ;
      }

    } else {
     $prevTime = $current_time ;
     $firstTime = $current_time ;
  }

 }

if ( /<\/Track>/ ) {
   $total_Time = $total_time_idle + $total_time_cycled;

   printf "Time = Idle: %d s Spinning: %d s Total: %d s\n", $total_time_idle,
      $total_time_cycled, $total_Time;
   printf "Time = Idle: %.2f%% Spinning: %.2f%% Total: %.2f%%\n",
      $total_time_idle/$total_Time *100,
      $total_time_cycled/$total_Time * 100, $total_Time/$total_Time *100;

   print "Rotations (total) = $total_cycles\n";
   print "Mean cadence (computed) = " . $total_cycles/$total_time_cycled * 60 . "\n";

   $totalTimeTime = $lastTime - $firstTime;

   print "Total time (last - first) = $totalTimeTime s\n";

  print "Registered (header) values: lap time: $edge_LapTime "
    . "cadence: $edge_LapCadence lap distance (m): $edge_LapDist\n";
  
  ## reset values ## ## ## 
  $grand_total_time_idle += $total_time_idle; 
  $grand_total_time_cycled  += $total_time_cycled ;
  $grand_total_cycles += $total_cycles ;
  $grand_total_Dist +=  $edge_LapDist;

  $total_time_idle = $total_time_cycled = $total_cycles = 0 ;
  $prev_Time = -1; 
  $parsingTrack ='N';
  $regCadence = 'N';
}

} ##/while

## Grand Totals:
$trackNo--;
$grand_total_Time = $grand_total_time_idle + $grand_total_time_cycled;

print "====== Totals/means for $trackNo tracks =====\n";
printf "Time = Idle: %d s Spinning: %d s Total: %d s\n", $grand_total_time_idle,
      $grand_total_time_cycled, $grand_total_Time;
   printf "Time = Idle: %.2f%% Spinning: %.2f%% Total: %.2f%%\n",
      $grand_total_time_idle/$grand_total_Time *100,
      $grand_total_time_cycled/$grand_total_Time * 100, 
      $grand_total_Time/$grand_total_Time *100;
print "Rotations (total) = $grand_total_cycles\n";
print "Mean cadence (computed) = " . $grand_total_cycles/$grand_total_time_cycled * 60 .  "\n";
print "Total distance (registered): $grand_total_Dist (m)\n";

## ### ### ### ### ###

sub xmlEleValue {
  my $en = shift; # element name
  my $el = shift; # line

  $el =~ /<$en>(.*)<\/$en>/;

  return "$1";

}

Przykładowy wydruk dla pliku fit/tcx zawierającego trzy segmenty:

$ cadencecalc.pl 2017-08-31.tcx
### Parsing track #1...
Time = Idle: 552 s Spinning: 2082 s Total: 2634 s
Time = Idle: 20.96% Spinning: 79.04% Total: 100.00%
Rotations (total) = 2684.95
Mean cadence (computed) = 77.3760806916427
Total time (last - first) = 2634 s
Registered (header) values: lap time: 2438.06 cadence: 77 lap distance (m): 16339.2
### Parsing track #2...
Time = Idle: 80 s Spinning: 652 s Total: 732 s
Time = Idle: 10.93% Spinning: 89.07% Total: 100.00%
Rotations (total) = 860.716666666666
Mean cadence (computed) = 79.2070552147239
Total time (last - first) = 3366 s
Registered (header) values: lap time: 731.05 cadence: 79 lap distance (m): 4994.82
### Parsing track #3...
Time = Idle: 29 s Spinning: 105 s Total: 134 s
Time = Idle: 21.64% Spinning: 78.36% Total: 100.00%
Rotations (total) = 120.716666666667
Mean cadence (computed) = 68.9809523809524
Total time (last - first) = 3500 s
Registered (header) values: lap time: 134.378 cadence: 69 lap distance (m): 761.78
====== Totals/means for 3 tracks =====
Time = Idle: 661 s Spinning: 2839 s Total: 3500 s
Time = Idle: 18.89% Spinning: 81.11% Total: 100.00%
Rotations (total) = 3666.38333333333
Mean cadence (computed) = 77.4860866502289
Total distance (registered): 22095.8 (m)

Podając jako minimalną prędkość 9 km/h otrzymamy:

$ cadencecalc.pl -s 9 2017-08-31.tcx
*** Segments with speed below 9 kmh skipped ***
### Parsing track #1...
Time = Idle: 654 s Spinning: 1980 s Total: 2634 s
Time = Idle: 24.83% Spinning: 75.17% Total: 100.00%
Rotations (total) = 2582.11666666667
Mean cadence (computed) = 78.2459595959596
Total time (last - first) = 2634 s
Registered (header) values: lap time: 2438.06 cadence: 77 lap distance (m): 16339.2
### Parsing track #2...
Time = Idle: 80 s Spinning: 652 s Total: 732 s
Time = Idle: 10.93% Spinning: 89.07% Total: 100.00%
Rotations (total) = 860.716666666666
Mean cadence (computed) = 79.2070552147239
Total time (last - first) = 3366 s
Registered (header) values: lap time: 731.05 cadence: 79 lap distance (m): 4994.82
### Parsing track #3...
Time = Idle: 29 s Spinning: 105 s Total: 134 s
Time = Idle: 21.64% Spinning: 78.36% Total: 100.00%
Rotations (total) = 120.716666666667
Mean cadence (computed) = 68.9809523809524
Total time (last - first) = 3500 s
Registered (header) values: lap time: 134.378 cadence: 69 lap distance (m): 761.78
====== Totals/means for 3 tracks =====
Time = Idle: 763 s Spinning: 2737 s Total: 3500 s
Time = Idle: 21.80% Spinning: 78.20% Total: 100.00%
Rotations (total) = 3563.55
Mean cadence (computed) = 78.1194738765071
Total distance (registered): 22095.8 (m)

Idle oznacza czas w którym nie kręcimy i/lub jedziemy poniżej prędkości minimalnej (podawany jest czas w sekundach i udział w całości). Rotations to liczba obrotów. Obliczone wartości wyglądają na prawidłowe na co wskazywałoby, że są bliskie wartościom liczonym przez Garmina.

url | Wed, 06/09/2017 11:09 | tagi:
Podsumowania rowerowe 200 tys/7 tys

Jeszcze się nie skończył czerwiec a ja już nabiłem rekordowe 7 tysięcy kilometrów przejechanego rocznego dystansu (4 czerwca dokładnie to się stało). Do tej pory mój rekord to było 6 tys na koniec czerwca, teraz wygląd, że będzie z łatwością osiem.

Nawiasem mówiąc 24 maja osiągnąłem 200 tys na liczniku życiowego dystansu (może da się dociągnąć do 250 tys?).

Z tej okazji podsumowałem mój życiowy dystans (bez lat 1992--1991, dla których nie mam detalicznych danych) z podziałem na pierwsze/drugie półrocze. Wyniki są następujące:

----------------------------------------------------
kwartał km    %%      |  kwartał km    %%     razem%
----------------------------------------------------
1993_1  2330  44.13   |  1993_2  2950  55.87  100.00
1994_1  2805  62.06   |  1994_2  1715  37.94  100.00
1995_1  1710  47.90   |  1995_2  1860  52.10  100.00
1996_1  1546  33.90   |  1996_2  3014  66.10  100.00
1997_1  2055  40.73   |  1997_2  2990  59.27  100.00
1998_1  2530  38.13   |  1998_2  4105  61.87  100.00
1999_1  3065  47.63   |  1999_2  3370  52.37  100.00
2000_1  4910  43.82   |  2000_2  6295  56.18  100.00
2001_1  5255  48.86   |  2001_2  5500  51.14  100.00
2002_1  6240  59.68   |  2002_2  4215  40.32  100.00
2003_1  5130  48.72   |  2003_2  5400  51.28  100.00
2004_1  3575  41.16   |  2004_2  5110  58.84  100.00
2005_1  4415  49.33   |  2005_2  4535  50.67  100.00
2006_1  0000   0.00   |  2006_2  2880 100.00  100.00
2007_1  1855  46.73   |  2007_2  2115  53.27  100.00
2008_1  2380  36.12   |  2008_2  4210  63.88  100.00
2009_1  2535  45.97   |  2009_2  2980  54.03  100.00
2010_1  3060  47.81   |  2010_2  3340  52.19  100.00
2011_1  3535  43.45   |  2011_2  4600  56.55  100.00
2012_1  3285  45.44   |  2012_2  3945  54.56  100.00
2013_1  3710  45.13   |  2013_2  4510  54.87  100.00
2014_1  4020  54.55   |  2014_2  3350  45.45  100.00
2015_1  4100  46.80   |  2015_2  4660  53.20  100.00
2016_1  5365  47.80   |  2016_2  5860  52.20  100.00
2017_1  7155 100.00   |  2017_2  0000   0.00  100.00
----------------------------------------------------
Średnio: kw1 = 46.63 kw2 = 53.37 razem% = 100.00 (25 lat)
Razem: 200835.00

Zawsze mi się wydawało, że w drugim półroczu przejeżdżam mniej a tu proszę--faktycznie jest dokładnie odwrotnie.

url | Thu, 08/06/2017 03:40 | tagi: ,
Montaż błotników SKS Bluemels


Ponieważ zamierzam ostro jeździć w zimie (bo zimy ostatnio się zrobiły dość łagodne) zmodyfikowałem swój rower MTB (koła 26 cali) pod kątem zabezpieczenia przed wodą. Do tej pory używałem błotników szybko montowanych: tylny -- SKS X-Tra Dry zakładany na sztycę plus jakiś tam tani przedni nasadzany na szynę przymocowaną do plastikowego korka wbitego w dziurę w rurze widelca. Patent na przedni widelec jest fajny, ale błotniki -- ponieważ jednak znajdują się w znacznej odległości od opony -- nie zabezpieczają przed wodą jak błotniki zamontowane porządnie.

Zdecydowałem się zatem na takie porządne i wybrałem SKS Bluemels. Do nabycia w CentrumRowerowym.pl za circa 95 PLN (z dostawą). Przed zakupem w CR sprawdziłem czy aby ktoś nie sprzedaje takowych na OLX. I faktycznie sprzedawał, praktycznie nowe, za 70 PLN (z dostawą). Bonusem zakupu na OLX było też to, że pierwszy właściciel poprzykręcał te wszystkie druty, nakładki i śrubki, oszczędzając mi pewnie ze dwie godziny albo i więcej.

Montaż tylnego nie stanowił problemu: mój zmodyfikowany Author Traction ma dziury na błotniki w tylnym widelcu. Z przednim było gorzej -- widelec nie ma dziur montażowych. Kupiłem zatem na Allegro, w sklepie z częściami samochodowymi, cztery aluminiowe opaski/obejmy w osłonie gumowej-- z tego co mi się wydaje te obejmy normalnie używane są do tuningu motocykli czy coś w tym stylu. Z dostawą za obejmy zapłaciłem 40 PLN, czyli więcej niż 50% tego co za błotniki. Trochę dużo ale niech tam, bez dziadowania ma być...

Plan był taki, że dwie obejmy przykręcone na dole goleni widelca posłużą do przymocowania drutów, a do dwóch przymocowanych na górze dokręcę poprzeczną blaszkę, do której z kolei przyśrubuję błotnik (za uchwyt z dziurą, który normalnie pasuje do dziury w widelcu). Na razie szukam estetycznej blaszki i prowizorycznie unieruchomiłem błotnik opaskami zaciskowymi, ale już wiem że plan był dobry i błotnik dało się elegancko wpasować tak że nie lata, nie hałasuje i da się dość szybko zdemontować/zamontować z powrotem (trzeba było w tym celu trochę skrócić druty). No dałem radę tym razem...

url | Wed, 21/12/2016 05:55 | tagi: , , ,
Garmin Virb Edit

Według producenta program: łączy nagrania wideo z kamery sportowej VIRB z danymi GPS i innymi informacjami pochodzącymi ze zgodnych urządzeń firmy Garmin. Faktycznie łączy dane zapisane w formacie FIT/GPX z dowolnym plikiem wideo zapisanym w formacie MP4.

VIRB Edit można ściągnąć za darmo ze strony Garmina (dostępne są wersje dla systemów MS Windows/Mac).

Moja niegarminowska kamera zapisuje obraz w formacie MOV (Dane GPS są faktycznie z urządzenia firmy Garmin, ale równie dobrze mogłyby być ze smartfonu albo chińskiego loggera.) Zamieniam plik MOV do formatu MP4 za pomocą aplikacji HandBrakeCLI. Poniższe polecenie wykonuje konwersję, a wynikowy plik.mp4 będzie około 50% mniejszy niż plik MOV:

time HandBrakeCLI -i PLIK.MOV -o PLIK.mp4 -w 1280 -l 720 --preset="Normal"

Trzydziestominutowy plik MOV, zamieniany jest przez około pół godziny (Linux IntelNuc/i5/8Gb pamięci).

Uparłem się zainstalować HandBrakeCLI w systemie Fedora21, a ponieważ nie ma stosownych pakietów .rpm musiałem go skompilować:

yum install yasm zlib-devel bzip2-devel libogg-devel libtheora-devel \
libvorbis-devel libsamplerate-devel libxml2-devel fribidi-devel \
freetype-devel fontconfig-devel libass-devel dbus-glib-devel \
libgudev1-devel webkitgtk-devel libnotify-devel \
gstreamer-devel gstreamer-plugins-base-devel

sudo yum groupinstall "Development Tools" "Development Libraries" \
"X Software Development" "GNOME Software Development"

yum install lame-libs lame-devel x264-devel intltool

tar -xvzf HandBrake-0.10.3.tar.bz2
cd HandBrake-0.10.3
./configure
cd build
make
make install

W sumie mogłem sobie darować powyższe, bo i tak w końcu muszę używać MS Windows, no ale może ten HandBrake przyda się do czegoś innego.

Na mojej stronie na youtube można obejrzeć wygenerowane za pomocą VIRB filmiki z dodanymi danymi GPS.

url | Thu, 12/05/2016 06:53 | tagi: , , ,
Wycieczka z Damnicy do Lęborka

W sobotę pojechałem SKMką do Damnicy (15 PLN) a stąd już rowerem przez Dębnicę Kaszubską i Czarną Dąbrówkę do Lęborka. Głównym celem (oprócz rowerowania) było odwiedzenie poniemieckich cmentarzy w Damnicy, Lubuniu, Dobieszewie, Dobrej, Gogolewie i Gogolewku.

Usiłując dostać się do Lubunia od strony Dębnicy ugrzęzłem beznadziejnie na piaszczystych drogach i zmarnowałem tutaj sporo czasu. Wracając z Lubunia -- w akcie desperacji -- usiłowałem poszukać innej drogi -- co nie było dobrym pomysłem i nie tylko skończyło się nadłożeniem kilku kilometrów ale nawet forsowaniem strumienia. Z Lubunia do Dębnicy chyba nie ma możliwości dojechania droga utwardzoną -- a jeżeli, to strasznie naokoło!

Cmentarzy w Dobrej i Gogolewku nie odszukałem, bo i tak wycieczka się przeciągnęła i obawiałem się czy zdążę na powrotny pociąg w Lęborku.

Na koniec został powrót SKMką w wagonie dla rowerów w nieprzyjemnym towarzystwie palących, pijących piwo, słuchających głośnej muzyki typu disco polo i przeklinających prostaków. Przypomiał mi się Al Sieber, Chief of Scouts (grany przez Roberta Duvalla) z filmu Geronimo: Amerykanska legenda: ,,Must be Texans... the lowest form of white man there is''1. Tylko zamiast Texans (Teksańczycy) podstawiłem Kaszub.

Ślad jest poniżej:


Pokaż Damnica-Lębort(trk) na większej mapie

1To muszą być Teksańczycy...najniższa forma białego człowieka

url | Mon, 21/05/2012 14:49 | tagi: ,