poniedziałek, września 26, 2022

GeoJSON jest fajny ;-)

Pracuję teraz dużo z danymi o położeniu geograficznym (co ciekawe w mojej pierwszej pracy też to robiłem ;-)) i czasem chciałbym móc coś pokazać na mapie... albo zobaczyć, bo np. fajnie jest zobaczyć czy wyniki dotyczące lokalizacji jakiejś rzeczy się poprawiły czy nie, a często mapa jest najlepszym rozwiązaniem.

Tak się rozglądałem za różnymi rozwiązaniami, ale jakoś wszystkie były skomplikowane.... i wtedy zobaczyłem GeoJSON'a i stronę https://geojson.io/ :-)

Chwila czytania dokumentacji i okazało się, że można do niej przesłać treść GeoJSONa... więc wtedy już tylko pozostaje stworzenie GeoJSON'a i można się bawić ;-)

GeoJSONa można stworzyć najprościej po prostu budując go przez zserializowanie map do JSONa ;-)

Tzn. nie jest to per se najprostsza metoda, ale w moim przypadku działa dobrze ;-)

Ponieważ większość moich skryptów w pracy to Python to wystarczy napisać w Python'ie kilka metod ;-)
Kod poniżej wygeneruje URL do strony, na której pojawi się obrazek z poprzedniego wpisu.


import json
import urllib.parse

def point(lat, lon, color):
return {"type":"Feature","properties":{"marker-color": color},"geometry":{"type":"Point","coordinates":[lat,lon]}}


def line(lat, lon, lat2, lon2, color):
return {"type":"Feature","properties":{"marker-color": color},"geometry":{"type":"LineString","coordinates":[[lat,lon],[lat2,lon2]]}}

def collection(features):
return {"type": "FeatureCollection", "features": features}

def geojsone(features):
return json.dumps(collection(features))

def url(features):
encoded=urllib.parse.quote(geojsone(features))
return f"http://geojson.io/#data=data:application/json,{encoded}"

point1=point(18.707034587860107,54.68036917970927,"#f00")
point2=point(18.54937434196472,54.52091959175506,"#0f0")
line=line(18.54937434196472,54.52091959175506,18.707034587860107,54.68036917970927,"red")

print(url([point1,point2,line]))

Uruchomienie go wygeneruje link http://geojson.io/#data=data:application/json,%7B%22type%22%3A%20%22FeatureCollection%22%2C%20%22features%22%3A%20%5B%7B%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%22marker-color%22%3A%20%22%23f00%22%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Point%22%2C%20%22coordinates%22%3A%20%5B18.707034587860107%2C%2054.68036917970927%5D%7D%7D%2C%20%7B%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%22marker-color%22%3A%20%22%230f0%22%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Point%22%2C%20%22coordinates%22%3A%20%5B18.54937434196472%2C%2054.52091959175506%5D%7D%7D%2C%20%7B%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%22marker-color%22%3A%20%22red%22%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22LineString%22%2C%20%22coordinates%22%3A%20%5B%5B18.54937434196472%2C%2054.52091959175506%5D%2C%20%5B18.707034587860107%2C%2054.68036917970927%5D%5D%7D%7D%5D%7D
Specjalnie go całego wklejam ;-) bo po prostu cały tekst GeoJSONa jest tutaj zakodowany jako parametr w URLu ;-)
Oryginalny GeoJSNO wygląda mniej więcej tak:

{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"properties": {
"marker-color": "#f00"
},
"geometry": {
"type": "Point",
"coordinates": [
18.707034587860107,
54.68036917970927
]
}
},
{
"type": "Feature",
"properties": {
"marker-color": "#0f0"
},
"geometry": {
"type": "Point",
"coordinates": [
18.54937434196472,
54.52091959175506
]
}
},
{
"type": "Feature",
"properties": {
"marker-color": "red"
},
"geometry": {
"type": "LineString",
"coordinates": [
[
18.54937434196472,
54.52091959175506
],
[
18.707034587860107,
54.68036917970927
]
]
}
}
]
}
Ogólnie cały ten GeoJSNO mocno się przydaje, szczególnie to, że łatwo go generować z kodu ;p


Podobne postybeta
ChatGPT "potrafi" rysować mapy
Moja własna akcja w Google Home ;-)
VRML
Mistral czeka na książkę
Go dla Java'owca ;-) odcinek 1 "klasy"

niedziela, września 25, 2022

Chyba wiem czemu widzę Gdynie z Juraty ;-)

Będąc w Juracie widuję Gdynię i stojący tam Sea Towers.
No i jest problem ;-) 
Horyzont powinien być jakieś 4.7-8* km ode mnie, a Sea Towers w Gdyni jest 20.35 km od czubka mola w Juracie (wg Google Maps). 

Czerwone to czubek mola w Juracie, zielone to Sea Towers w Gdyni, a niebieskie to tak koło 20 km odległości ;-)

Jak więc mogę widzieć Gdynię?
Gdy tam byłem w latach 80 to nie zawsze było widać Gdynię i ogólnie mówiono, że to jest Fata Morgana.
No i teoretycznie mogłaby być, bo morze jest chłodniejsze zwykle od powietrza (w lato przynajmniej) i chłodzi powietrze nad sobą i wtedy światło zakrzywia się tak, że "sięga za horyzont". 
Ale tam czasem nawet widać Gdańsk i żurawie portu północnego, a to już ponad 30 km....

I tak się zastanawiałem i chyba wiem ;-)

Skoro ja z 1.84 m wzrostu widzę na jakieś 4.7 km, to znaczy, że jeśli coś jest 9.4 km ode mnie w linii prostej i oddziela nas jedynie horyzont to jak to coś jest wyższe niż ja to mogę to widzieć.... przynajmniej tą część która wystaje ;-)

Skoro Sea Towers jest 20.35 km ode mnie to tak pi razy oko widzieć powinienem najmniej wszystko z niej powyżej jakichś 18.5 jej wysokości ;-)
A, że tak naprawdę mój punkt obserwacji to tak naprawdę z 5 metrów (molo jest wyżej niż brzeg nad zatoką o jakieś 1.5 metra, a sam poziom wody jest też z jakieś 1.5-1.7 niżej) to powinienem widzieć wszytko wyższe niż jakieś 11.5 metra w Gdyni ;-) a że sam budynek tak lekko licząc jest jakieś 6-10 metrów nad poziomem wody... to całe 142 metry wysokości powinienem widzieć ;-)

To samo z portem północnym... chociaż tu by musiały mieć żurawie ponad 37 metrów by widzieć ich czubki, a widać duży ich kawałek... i nie zawsze je widać, stąd tutaj dodałbym jednak jeszcze Fata Morganę ;-)

Ale teraz mi się powoli fizyka zaczyna zgadzać :-)

* - Horyzont jest w odległości liczonej wg wzoru:
hDist = Math.sqrt((h+R)^2-R^2), gdzie R = 6378.137 km
Czyli przy moim wzroście powinienem widzieć mniej więcej na 4.7 km, podobnie wyjdzie z wzoru przybliżonego:
hDist = sqrt(13*h)
gdzie h jest w metrach, a hDist w km, wtedy mamy ~4.8 km, skąd mi wyszło 8 km? Z tego, że jednak molo ma swoją wysokość nad poziomem morza, dałem mu kila metrów "wysokości"


Podobne postybeta
Duża daleka góra
Tam gdzieś jest foka...
Jak się profesjonalnie kłamie
Książkowy listopad
Takie tam przemyślenia i refleksje ;-)

O używaniu 3rd party API

Spotkałem ostatnio ciekawy problem i się zacząłem zastanawiać....

Jeśli tworzysz aplikację i używasz 3rd party API to czy powinno się go używać bezpośrednio z tej aplikacji czy powinno się mieć swoją warstwę między apką a API?

I tak, zawsze trzeba mieć warstwę abstrakcji i pytaniem nie jest czy z kodu biznesowego wprost wołać to API, czy jednak mieć klienta, który woła API... bo powinno się mieć to drugie ;-) [w skrócie to ułatwi testy i w razie zmian w tym API nie trzeba będzie zmieniać za dużo kodu, a tylko "klienta"]

Ale czy jak to jest aplikacja na urządzeniu (telefon, tablet, komputer, zegarek, telewizor, samochód, łódź, statek kosmiczny czy kuchenka mikrofalowa ;-)) to czy powinno się wołać cudze API wprost z urządzenia czy wołać swoje API na swoim serwerze i dopiero stamtąd wołać to 3rd party API?

No i wyszło mi, że to jest funkcja tego jak często można zrobić update apki, jak krytyczne jest to API dla działania apki i tego jaka jest stabilność tego API (w sensie tak samego API, czyli czy często się zmienia i w sensie też stabilności czyli tego jak często pada ;-)).

No bo jeśli to jest apka na telefon (czyli miejsce gdzie updaty są praktycznie natychmiastowe (chociaż w Apple nie do końca ;-)), to jest dodatkowa niekrytyczna funkcjonalność apki i samo API jest stabilne (w obu znaczeniach) to można używać wprost.

Ale im gorzej z updatami, gdy użycie API jest coraz bardziej krytyczne, gdy stabilność nie jest najwyższa to wtedy jestem za stawianiem własnego kawałka kodu, który odwala kontakty z API.

Bo zawsze można nadrobić proces updatowania zmieniając tylko bebechy naszego serwisu nie ruszając apek, zawsze łatwiej przykryć tak zmiany w samym API i w razie przerw w działaniu używać cache'a (jeśli ma sens), do tego jeszcze nie trzeba czekać na to jak ktoś zaimplementuje funkcje (coś w stylu, jeśli każde urządzenie będzie musiało zrobić dzień w dzień 100 call'i tylko po to by sobie zebrać jakąś listę bo API nie ma tej listy to dostawca API będzie zły no i to potrwa, ale jak tą listę tworzymy w taki sposób "u siebie" w serwisie i w razie czego dajemy tą listę apce to nikt się nie będzie czepiał).

Czyli swoją warstwę trzeba mieć im bardziej będzie bolał jej brak ;-) 

I co ciekawe jako ktoś kto dostarczał i dostarcza API często widziałem (i widzę ;-)), że "klienci" bardzo często chcą swoje apki doprowadzić do stanu, że to są tylko UI do cudzego API i nie widzą wad tego rozwiązania... do czasu gdy słyszą "nie" na feature request i wtedy jest panika, bo przecież im nie będzie działać.... i jeszcze bardzo często reagują zdziwieniem, a nawet oburzeniem, na propozycję "ej to zaimplementujcie sobie sami to, a jak my za 3 miesiące czy rok dodamy tą funkcjonalność to się na to przepniecie, albo będziecie nadal używać tego swojego kodu". Odpowiedzi są zwykle w stylu "ale to będziemy musieli skasować ten kod", albo "ale to nie pasuje do naszej architektury" i podobnymi, które zwykle sprowadzają się do tego, że zrobili błędne założenia i nie chcą się z nich wycofać.




Podobne postybeta
Branche i Scrum to taki security blanket dla programistów
Rant po toolach w stylu Mavane, Gradle, Bowera i całej tej hałastry
Integracja
Smutno mi się zrobiło...
Spadochronowy atak na Wawel - czyli wolne GWT

sobota, września 17, 2022

Mały pomocny coś macOS'a

Jestem nadal w Juracie, byłem tu pierwszy raz (od 30 lat ;p) w tamtym roku, wtedy podano mi hasło do WiFi.
Wpisałem je do telefonu, prywatnego laptopa, firmowego laptopa i tableta.....
Byłem tu ponownie w marcu, wtedy miałem inny telefon już, ale hasła nie musiałem podawać.
Kolejny raz w czerwcu, teraz miałem innego laptopa firmowego (choć z tej samej firmy) i hasła nie musiałem podawać, to samo z drugim tabletem.
Teraz we wrześniu mam znów innego laptopa firmowego (z innej firmy ;-)) i znów hasła nie musiałem podawać ;-)
Bo w telefonie załatwiła to synchronizacja haseł z Androida, a na laptopach i tabletach iCloud.

Nie wiem czy coś takiego jest teraz w Windows, za moich czasów tam nie było ;-)
Na Linuksie też tego nie miałem i nie mam (bo raz na jakiś czas jednak użyję Ubuntu).

Stąd wdzięczny jestem za synchronizację haseł do WiFi między urządzeniami od Apple ;-)



Podobne postybeta
Symlink zamiast zmiany nazwy usera ;-)
Workation ;-)
Utrata keystore szansą na odwyk od Facebook? ;-) - chyba jednak nie ;-)
Epigenetyczne filtrowanie rekruterów pt 2 ;-)
DisplayPort.... za jakie grzechy?

sobota, września 10, 2022

Przechodzę na iPhone'a...

Od "zawsze" (czyli od 2009 roku ;-)) wybierałem Androida.

Miałem oryginalne G1, Nexus S, Nexusa 4, Nexusa 5, Nexus 10, Nexus 7 (obie edycje ;-)), Nexus 6, Pixela C, Pixela XL, Pixela 2 XL, Pixela 3 XL, Pixela 4 XL, Pixela 6 i teraz mam Pixela 6 Pro....

Ale ponieważ dla Google Polska to III świat, to zawsze kupowanie tych urządzeń było trudne. Zwykle były z nieoficjalnego importu i przez to nigdy to nie był sprzęt dla Polski... np. mój Pixel 6 Pro 5G miał tylko gdy byłem w tym roku w Kalifornii ;-)

Stąd uznałem, że spróbuję z Apple... dokonałem zamówienia koło 14:45 w piątek, a sprzedaż była od 14....

I trochę mnie terminy przerażają ;-)

W kolejności są to ;-)




Rozpiętość od 16 września do 4 listopada ;-)
50 dni... 

Sam nie wiem czy mi się zamiana spodoba, jeden plus, Apple Watch bije na razie wszystko co jest po "mojej" obecnej stronie barykady...



Podobne postybeta
Z Nexusów do Pixeli
Dla mnie Apple Watch to jedyny powód by używać iPhone'a ;-)
Pixel XL jest genialny
Pixel 4 XL czy iPhone 11 Pro
Względność ceny - czemu bezdomni w USA miewają iPhone'y?

czwartek, września 08, 2022

W 2023 będę na Rammstein 2.... wróć 3 razy ;-)

Po koncercie w Wawie zapragnąłem mieć jakieś koszulki i czapeczki z logo Rammstein, poszedłem do ich sklepu i była też możliwość kupienia rocznego członkostwa w LIFAD.... a że mi po głowie chodziło, że pewnie jeszcze jakiś koncert będzie w 2023, bo skoro mają nową płytę... 

I miałem rację, Rammstein ogłosił nową trasę i tym razem mam zamiar 2 3 razy pójść :-)

17/07/2023 do Berlina i 30/07/2023 do Chorzowa :-) i jeszcze raz w Chorzowie 31/07/2023, ale tym razem w feuerzone :-)

W Berlinie nigdy nie byłem, a jakoś tak z Run Lola, Run i Kleo mi się podobał to chcę zobaczyć na żywo, a znów Chorzów lubię bo przecież tam przez jakieś 11 lat mieszkałem dzieckiem będąc ;-)

Stąd w 2023 2x 3x Rammstein! ;-)



Podobne postybeta
Pociąg vs samolot - cena
Rammstein :-)
Kolejne książki :-)
Kiedy polecimy na Marsa?
Ostatni Rammstein... przynajmniej w 2024 ;-)