poniedziałek, października 19, 2020

Nieoczywiste oczywistości ;-) podstępny autoboxing ;-)

Java jest prostym językiem, ale dodawanie kolejnych ficzerów powoduje, że staje się coraz bardziej skomplikowana.

Jakoś tak milion lat temu w Java 5 dodano autoboxing i auto unboxing. I to bardzo ułatwia życie, tak naprawdę mało kto teraz pamięta w trakcie kodowanie, że int i Integer to dwie różne rzeczy i zwykle po prostu ludzie pamiętają, że Integer to taki "specjalny" int który można trzymać w kolekcjach.

I stąd są problemy....

Bo co się stanie w sytuacji gdy z mapy albo listy pobieramy Integer'y i porównujemy je z czymś przy pomocy ==?

To zależy czy to z czym porównujemy to int czy Integer ;-)
Jeśli int to kompilator w trakcie kompilacji zrobi nam auto unboxing naszego pobranego Integer'a.
Jeśli Integer to zależy.... gdy to jest Integer w zakresie -128..127 to zwykle powinno działać == tak jakby zadziałało equals.... przy założeniu, że oba te Integer'y zostały poprawnie "stworzone", czyli nie przez new Integer(int).
Jeśli coś wyższego niż 127, albo niższego niż -128 to raczej nie zadziała == jak equals.

Niby to wszystko to żaden problem, ale.....

Idźmy dalej, a co jak mamy takie 2 z overloadowane metody:

boolean test() {
return isEven(10);
}

boolean isEven(int x) {
return x%2==0;
}

boolean isEven(Integer x) {
return x%2==0;
}

To która zostanie zawołana gdy wykona się metoda test? ;-)

Wiadomo, że isEven(int), ale jeśli usuniemy metodę isEven(int) to kod nadal się będzie kompilował i nadal będzie działał ;-)

Tu niby problem nie jest z autoboxingiem i unboxingime chociaż trochę jest ;-) bo jak kompilator decyduje którą metodę zawołać? No szuka metody najbardziej "szczegółowej". 

Czyli tutaj w metodzie test ma 10, a 10 to int, więc wie, że ma zawołać isEven(int), ale jeśli nie będzie metody isEven(int) to popatrzy i znajdzie metodę isEven(Integer) więc dokona auto boxingu tego 10 do Integer.valueOf(10) i wrzuci je do tej metody...
Jakby nie było tej metody, ale byłaby metoda isEven(Object) to ona by została zawołana....

To niby są wszystko oczywistości, ale takie nie do końca oczywiste ;-)

A patrząc jak ludzie chętnie dodają do API nowe metody to takie problemy się po prostu muszą zdarzać ;-)






Podobne postybeta
Człowiek się uczy całe życie - źle rozumiałem cache'owanie Integerów :-)
Ile to jest 1+1 w Java'ie?
Magia w Java'ie ;-)
finalize() - do czego służy, a do czego nie i z czym to się je.
Sztuczki tropiciela błędów - breakpoint na sterydach ;-)

sobota, października 17, 2020

Kiedy następny on-call?

 OK, już się skarżyłem, że mam znów on-call'a ;-)

To napisałem sobie dziś narzędzie, które pokazuje mi ile mi jeszcze zostało czasu do końca on-call'a:


A jak nie mam on-call'a to ile mam do kolejnego:


To sobie siedzi w zasobniku macOS'a i pokazuje ile jeszcze czasu ;-)

Jak kropka jest czerwona, znaczy że jesteśmy w trakcie, jak zielona to czekamy ;-)


Skąd programik wie kiedy mam on-call'a?

A bo możemy go skonfigurować wybierając Configure:


Które otworzy "przepiękne" okienko gdzie można wkleić link do kalendarza z on-call'em.

PagerDuty coś takiego ma.

Teoretycznie może to być dowolny kalendarz, ale lepiej żeby miał tylko proste event'y ;-) bo z innymi sobie mój kod nie radzi ;-)

Jak ktoś zainteresowany do zapraszam do repo ;-) [jest tam też DMG]

https://github.com/przemelek/next-on-call



Podobne postybeta
Electron + Airly = wskaźnik jakości powietrza w pasku ;-) - part 2, źródła ;-)
On-call....
A może by tak nosić drugi telefon specjalnie do on-call'a?
9 miesięcy bez on-call'a - to jest super :-)
Alfred + Todoist i wysyłanie tasków do projektu, a nie tylko do Inbox'a ;-)

Feature Request do OSów ;-)

 Mój główny komputer, czyli mój Macbook Pro z 2018 roku nabawił się spuchniętej baterii...

Wygląda to nie najlepiej:


Tak, to na dole/z tyłu to tył Macbooka który się wziął i wygiął, a laptop się nie da zamknąć ;p

Stąd od razu jak to zauważyłem (drań stoi sobie zawsze podpięty do monitora więc go nie oglądam za często, tym razem po prostu przestała działać mysza i klawiatura i trzeba było odłączyć hub od MBP i wtedy to zauważyłem) został zgłoszony do Apple, które wskazało mi serwis, który jest w odległości 200 metrów od mojego mieszkania ;-)

Więc teraz używam mojego Macbooka Air jako komputera, który jest podpięty do monitora.

Jest to więc też moja maszyna do kodowania ;-)

No i są problemy, bo co chwile się okazuje, że nie mam a to wget'a, a to Midnight Commandera, a to ForkLift jest inaczej skonfigurowany.

A co gorsza okazuje się, że nie wszystkie moje źródła mam na repach ;p więc teraz jak piszę sobie narzędzie do pokazywania mi kiedy mam następnego on-call'a (albo kiedy mi się skończy ;-)) nie mam skąd kopiować kodu ;p

Przydałoby się mieć coś w stylu "shared profile" które można by było dzielić między komputerami, idealnie by dało się to podzielić na installed apps, files stored on drive i profiles in apps ;-)
A i by można było mieć też na 1 komputerze kilka profili.




Podobne postybeta
Mój pomysł na sprzedaż tabletów ;-)
Zły provider, albo głupi ja ;-)
Macbook PRO Retina i OS X po 2* tygodniach
Google+
A może by tak Macbooka Air?

On-call....

Od 1:00 do 13:00 mam on-call'a, nic się niby nie powinno zdarzyć, ale już mi odbija. 

Mam słuchawki na uszach to przyniosłem sobie telefon z PagerDuty na biurko, żeby w razie czego zobaczyć jak będzie wyło i błyskało....

Coś czuję, że jak będę szedł pod prysznic to też będę brał.

Fuck..... chciałbym umieć ciut bardziej olewać.




Podobne postybeta
Chyba zabiłem mojego Pocket PC....
Kiedy następny on-call?
A może by tak nosić drugi telefon specjalnie do on-call'a?
Miejsca gdzie nie używałeś jeszcze komputera [ewentualnie miejsca, gdzie nie dopadły nas jeszcze komputery ;-)]
Żyje :-)

sobota, września 26, 2020

Człowiek się uczy całe życie - źle rozumiałem cache'owanie Integerów :-)

Tak się bawię nowym IntelliJ i jak używa się var to próbuje podpowiedzieć jaki będzie wywnioskowany typ.

Działa to różnie:


Ogólnie zasada chyba jest taka, że parser Java'y w IJ potrafi wywnioskować typ na podstawie zwracanego typu (to ma przy metodach) i czasem jak przypisanie jest z prostej deklaracji z typem.
Nie jest więc tak wszechstronny jak kompilator Java'y, ale kompilator wie więcej.

Ale ja nie o tym tutaj ;-)

Bawiąc się tym zauważyłem, że konstruktor dla Integer jest deprecated, sprawdziłem i to prawda od wersji 9.
I tak się zacząłem tym bawić i okazuje się, że przez ostatnie ~16 lat żyłem w błędnym przekonaniu....

Zawsze pamiętałem, że JVM ma optymalizację by nie przeginać z ilością Integer'ów, i że np. dla 1 jest dokładnie 1 obiekt w pamięci, a wszystkie zmienne które trzymają Integer'a o wartości 1 mają referencję do tego jednego jedynego.... i że JVM od Oracle'a ma to dla liczb od -128 do 127 (choć teraz jak to widzę to jest konfigurowane).

I zawsze tu zakładałem, że JVM ogarnia jakoś wołanie new Integer(x), czy może bardziej kompilator jak się zastanowić...

No i byłem przekonany, że:

wypisze true...

A tu "dupa", nie, wypisze false, bo new stworzy dwa całkiem nowe obiekty. Żeby cache zadziałał trzeba użyć Integer.valueOf....

Fakt, sam używam "od zawsze" Integer.valueOf(int), ale przyznam, że coś mi się porobiło w głowie jak do mnie dotarło jak błądziłem.

Choć niech mnie tłumaczy, że jak mi się zdarza pracować z Integer to właśnie przez Integer.valueOf, albo przez autoboxing, a:
Zadziała tak, że wypisze true.

Jak na to spojrzeć to to ma pełen sens, bo skąd biedna JVM ma wiedzieć, że nowo tworzony obiekt Integer wskazuje na już istniejący? Albo kompilator by musiał generować tu specjalny kod do obsługi tego dla new, albo sama JVM w momencie "zobaczenia wołania" w stylu:

musiałaby nie wołać konstruktora, ale zaglądać do cache.... i jak sprawdziłem nawet Java 8 nie robiła takich cudów :-)




Podobne postybeta
Nieoczywiste oczywistości ;-) podstępny autoboxing ;-)
Ile to jest 1+1 w Java'ie?
Magia w Java'ie ;-)
Chorowanie jest do bani, czyli wspomnienia z L4... które trwa ;-)
Zmienne Go ;-)

środa, września 23, 2020

Magia w Java'ie ;-)

Jaki jest maksymalny rozmiar tablicy w Java'ie? ;-)

Niby wydaje się, że ma to coś z int wspólnego, ale nie będzie to pełny zakres int, bo w Java'ie int jest signed, więc Integer.MAX_VALUE wydaje się być rozsądnym kandydatem...

Ale jak wrzucimy kod w stylu:

var array = new int[Integer.MAX_VALUE];

To poleci nam:

Exception in thread "main" java.lang.OutOfMemoryError: Requested array size exceeds VM limit

nawet gdy uruchomimy JVM z odpowiednim zapasem RAM (8GB, a testowałem z 24GB dla pewności ;-)).

Podobnie:

var array = new int[Integer.MAX_VALUE-1];

wyrzuci taki sam wyjątek.

Ale już:

var array = new int[Integer.MAX_VALUE-2];

zadziała :-)

Przyznam, że próbowałem kiedyś dotrzeć w źródłach JVM do miejsca gdzie to jest zakodowane, a dokładniej gdzie widać skąd to magiczne 2.... ale sam limit chyba znalazłem, ale nie pamiętam powodu.

No chyba, że po prostu te 8 bajtów jest na długość albo opis obiektu? 

Chyba mam coś do poszukania :-)




Podobne postybeta
Android - nawet platofrma potrafi przeciwko Tobie knuć ;-)
Nieoczywiste oczywistości ;-) podstępny autoboxing ;-)
Distinct (albo unique) w JavaScript
Człowiek się uczy całe życie - źle rozumiałem cache'owanie Integerów :-)
Distinct w JavaScript #2

Zabawy z Zoomem - ikonki ;-)

 Możliwe, że jestem dziwny, ale gdy biorę udział w jakimś spotkaniu przez Zooma (które mi zabierają zwykle ponad 50-60% czasu pracy w ciągu dnia....) i ktoś dzieli się swoim ekranem to ślepie w poszukiwaniu ikonek aplikacji których nie znam ;-)

Albo w pasku, albo w Docku, choć dość dużo osób podobnie jak ja ukrywa Docka (ale fakt, większość nadal ma Docka na dole, a nie po lewej ;-)).

Co dziwne to choć patrzę i szukam to nie znalazłem jeszcze w taki sposób żadnej ciekawej apki.... ale mam ciągle nadzieję ;-)






Podobne postybeta
Motorola Mileston 2 fajna jest ;-)
Jowisz na zdjęciu :-)
Uber - jaka za tym musi stać fajna matematyka
14975 dni
Rok Darwina czas zacząć :-)

wtorek, września 15, 2020

API ssie w świecie walled gardens

Przez ostatnie kilkanaście lat napisałem (prywatnie} trochę softu, który ułatwiał mnie i innym życie.
Napisałem w tym czasie:
Gadacza - wtyczkę do PowerGG która czytała przez syntezator mowy to co ktoś do nas pisał (a jak chcieliśmy to też co my pisaliśmy do kogoś) na Gadu-Gadu,
OOo2GD, czyli OpenOffice.org2GoogleDocs - które było wtyczką do OpenOffice pozwalająca na wysyłanie i pobieranie dokumentów do i z Google Docs (oraz Zoho I serwerów WebDAV),
Bloggeroid - apka do Androida, która pozwalała na podanie postów na blogu prowadzonym na Bloggerze i umieszczenie w nich obrazków które były wysyłane do Picassa,
Chrome2Chrome - wtyczka do Chrome, która pozwalała przesyłać strony między różnymi instytucjami przeglądarki.

Było też parę innych, ale te były dość popularne i co ważne wszystkie robiły za klej miedzy różnymi aplikacjami. I gadały z różnego rodzaju API...
No i jak właściciele usług z których korzystałem zmieniali swoje modele biznesowe to i moje projekty przestawały działać albo były ograniczane w swym działaniu.

To pokazuje, że nie do końca warto podpinać się pod istniejące cudze usługi.
Bo ten ktoś może nam zrobić numer i po prostu usługę wyłączyć, albo ograniczyć.
Do tego wydaje się, że cały biznes idzie w kierunku walled gardens.
Kiedyś gdy Android zaczął być popularny i spopularyzował idee intentów pojawił się pomysł na WebIntents. Strony www mogłyby emitować lub rejestrować się na odbieranie różnych intentów przez co komunikacja między nimi byłaby prostsza. Łącznikiem miała być przeglądarka.
Specyfikacja się zaczęła pisać, Google było jednym ze sponsorów... I dość szybko projekt upadł bo za bardzo by to wszystko było interoperacyjne.
Jeszcze nie daj boże ktoś by używał strony A do tworzenia intentów obsługiwanych przez stronę B... I jaki interes w tym miałby ktoś ze strony A?

To samo w sieciach społecznościowych, na początku wszyscy poza Google Plus mieli otwarte API do prostowania i pobierania postów, były więc repostery. Publikowało się na jednej sieci, a inne dostawały kopię...
Też już tego nie ma.

Apple wprowadza Apple Silica i plotka głosi że na tych nowych Macach będzie można mieć tylko apki z AppStore....

W serwisach streamingowych też mamy wszystko osobno.
Już nawet plotki są, że podcasty zaczną być zamykane....
Niefajnie to.

posted from Bloggeroid




Podobne postybeta
Disconnect, Facebook, PayPal i wykop, czyli 1 plus i 3 minusy ;-)
Niehackerski dzień ;-)
Czy się stoi czy się siedzi.... kamerka w laptopie jako detektor tego czy biurko jest w trybie stand czy sit ;-)
Plug-in master ;-)
Web 2.0, czyżby opowieść o tym jak oddaliśmy Internet idiotom?

Głupi COVID-19

Wredny koronawirus i to, że pracuje już ponad pół roku z domu rozwalił mi totalnie zegar.
Zdecydowanie nie jestem typem który lubi pracować z domu. Brakuje mi rytmu który wyznaczało chodzenie i wracanie z pracy.
Do tego mam wrażenie, że cały czas jestem w pracy, bo choć na początku tego wymuszonego work from home wydzielilem sobie miejsce do pracy to nadal znajduje się ono w tym samym pomieszczeniu co reszta mojej działalności (taki ficzer studia ;-)).
Nawet już na konsoli nie grywam bo nie mam czasu...
Brakuje mi też ludzi i męczą mnie spotkania, których jest zbyt dużo.
W biurze można ustalić masę rzeczy ad hoc podchodząc do kogoś, a teraz tylko Zoom albo Slack.
Co znaczy że albo spotkania rozwalają dzień, albo człowiekiem ciągle przerywają, a jak sam chce coś spytać to akurat wtedy rozmówcy nie ma...
A najbardziej przerażające w tym jest to, że coraz częściej myślę, że to się nie skończy z początkiem 2021... A raczej 2022.
Głupi COVID-19.

posted from Bloggeroid




Podobne postybeta
Amd64, Intel64, EMT64, WTF64? ;-)
Android Nokia syndrome ;-)
15354.976 ;-)
Koronawirus - jak na mnie wpływa
Zapiski z 29 piętra....

wtorek, sierpnia 25, 2020

Noszenie maski od strony teorii gier ;-)

Uważam, że powinniśmy wprowadzić nakaz zakrywania ust i nosa przez najbliższy rok w celu ograniczenia rozprzestrzeniania COVID-19.

I powinniśmy go egzekwować i prawnie przez policję i podobne i prywatnie przez zwracanie uwagi ludziom w około.

Na razie wiemy z innych chorób, że jak nosiciel ma zakryte usta i nos to szansa zarażenia innych przez takiego kogoś mocno spada. Jak do tego się doda mycie dłoni i utrzymywanie odpowiednich dystansów to szansa zarażenia jeszcze mocniej spada.

Czemu wg mnie warto?

Z teorii gier ;-)

Niech będzie, że noszenie maski kosztuje nas 1 PLN dziennie.
Czyli w ciągu roku stracimy tak 365 PLN.

Koszt lockdownu to powiedzmy średnio 5000 PLN (raczej więcej, ale niech będzie 5k PLN).

Mamy macierz kosztów:

będzie lockdownnie będzie lockdownu
nosimy mask-5365-365
nie nosimy masek-50000

Która pokazuje kwoty strat w danym układzie, a teraz macierz która pokazuje prawdopodobieństwa:
będzie lockdownnie będzie lockdownu
nosimy mask10%90%
nie nosimy masek50%50%

Wydaje mi się, że w drugiej raczej powinno być 90% na będzie lockdown bez masek i 10% na nie będzie bez masek, ale niech będzie po 50%....

Jakie są nasze wartości oczekiwane?

Dla noszenia masek mamy stratę w wysokości 865 PLN, a dla nie noszenia masek 2500 PLN straty... 

Już nawet gdy szansa, że będzie lockdown bez noszenia masek wynosie 18%, a z noszeniem masek wynosi 10% to nosząc maski tracimy już o 35 PLN mniej ;-)

IMHO noszenie masek się po prostu opłaca.



Podobne postybeta
Zakryj gębę....
"Analiza" zysków i strat dla 500+... nie wygląda to różowo
A może by tak nosić drugi telefon specjalnie do on-call'a?
Głupie użycie twierdzenia Bayesa.....
Szlak mnie trafia jak emocje sprzedają się lepiej od rozumu.