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
Akcja bezpośrednia
Pociąg pociągowi nierówny ;-)
Jak się profesjonalnie kłamie
Chumbawamba "Charlie" - wypijmy za Darwina :-)
Trygonometria trudna

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
Względność ceny - czemu bezdomni w USA miewają iPhone'y?
Pixel XL jest genialny
Pixel 4 XL czy iPhone 11 Pro
Pixel 6 po ~2 miesiącach.... prawie nieodróżnialny od Pixela 4 XL ;-)

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 :-)
Rammstein :-)
Kolejne książki :-)
Kiedy polecimy na Marsa?