wtorek, marca 27, 2018

Jak wykryć, że ktoś nam zmienia klasy w JVM?

Ostatnio poprawiłem w DCEVM problem polegający na tym, że DCEVM nie updatował dla przeładowywanych klas pola classRedefindedCount...

Okazuje się, że Twórcy Java'y wpadli na pomysł tego by klasa dostarczała informacji o tym jak często jej zawartość była updatowana ;-)
Gdzie updatowanie oznacza zamianę kodu, albo pól (to w razie używania DCEVMa ;-)).

Żeby odczytać liczbę razy ile nasza klasa została zmieniona wystarczy użyć tej metody (za DCEVMem):

public static int getClassRedefinedCount(Class type) {
try {
Field field = Class.class.getDeclaredField("classRedefinedCount");
boolean accessibility = field.isAccessible();
field.setAccessible(true);
int classRedefinedCount = (Integer) field.get(type);
field.setAccessible(accessibility);
return classRedefinedCount;
} catch (Exception e) {
throw new RuntimeException(e);
}
}

Dzięki zawołaniu tej metody z naszym typem poznamy liczbę redefinicji naszej klasy ;-)

Metoda jak łatwo zobaczyć poprzez refleksje dociera do pola classRedefinedCount w Class i odczytuje jego wartość z instancji, którą jest nasz typ ;-) [rzadko się używa Class jako instancji ;-)]

Po co to komu?
Można by np. dodać kawałek do aplikacji, który skanuje wszystkie klasy i stwierdza czy np. ktoś apki nie debuguje i nie zmienia w locie ;-)

I jak na razie to jedyne zastosowanie na jakie wpadłem :-)

Ale mój pierwszy coś zrobiony w C++ już istnieje :-)


Podobne postybeta
Dodawanie i usuwanie metod i pól z klas Java w locie ;-)
PROPFIND, czyli jak przechytrzyć HttpURLConnection
Niecne wykorzystanie refleksji... czyli jak poszukać tekstu w drzewie obiektów? ;-)
Sztuczki tropiciela błędów, part 4
Ile to jest 1+1 w Java'ie?

niedziela, marca 25, 2018

Trick komórkowy ;-) przestaw sobie aplikacje

Ciekawy pomysł z książki Tima Ferrissa Tribe of Mentors, chyba od Aarianna Huffington.
Co jakiś czas przesuwać sobie aplikacje na telefonie, tak by jak się nam nudzi nie iść do nich na autopilocie.
Nie trzeba wszystkich przenosić, tylko te które są przez nas najczęściej odpalane, a nie są niezbędne.

posted from Bloggeroid




Podobne postybeta
Książkowo
A może by tak odstawić newsy?
Czytelnictwo ;-)
Out of książka ;-)
Router - poprawiacz humoru ;-)

poniedziałek, marca 19, 2018

Zaczynam woleć Map<Key,int[]> nad Map<Key,Integer> ;-)

Wstyd przyznać, ale ostatnio zaczęło mi się podobać używanie 1 elementowej tablicy int'ów zamiast Integera jako wartości w Map...
To takie odświeżające móc napisać:
map.computeIfAbsent(c, key -> new int[1]);
map.get(c)[0]++;

zamiast:
map.put(c, map.getOrDefault(c,0)+1)

jak się np. liczy litery w String'u....

A później np:
if (--map.get(c)[0]==0) map.remove(c);

zamiast:
map.put(c, map.get(c)-1);
if (map.get(c)==0) map.remove(c);

A mimo wszystko nie jest to dużo mniej czytelny zapis, wydaje mi się nawet, że jedynie to -- w predecrementacji może być nieczytelne.

Kandydat mi pokazał ;-) tzn. wcześniej wiedziałem, że tak można, ale jakoś nigdy tego nie używałem.


Podobne postybeta
Java 32 bit vs. Java 64 bit
Spectre powinno działać nawet w Java'ie ;-)
Praca z komputerem na stojąco...
Surowe dane genetyczne i niebezpieczeństwa ich udostępniania
Sztuczki tropiciela błędów ;-)

piątek, marca 16, 2018

Wybór laptopa w firmie

Coraz więcej firm stosuje politykę wg której gdy przychodzisz do pracy jako programista czy tester to możesz wybrać laptopa.
Zwykle jest do wyboru Macbook i coś z Windowsem (zwykle ma mocniejsze liczby w bebechach*), często Windowsa można przegnać i wziąć Linuksa.
Zwykle też jest tak, że Windows ma pełne wsparcie, MacOS/OSX częściowe (coraz częściej pełne), a Linux jest na zasadzie "w razie coś pójdzie nie tak to Twój problem".

No i ludzie wybierają różnie.
Niektórzy biorą Windowsa bo go znają, inni Macbooka bo fajny i inny.

Nie ma jednak jednej dobrej metody.

Jeśli pracujesz na standardowych narzędziach to bierzesz to gdzie one są, gdzie są najstabilniejsze i gdzie się najmocniej czujesz. W tej kolejności.
Bo na dostępność czy stabilność narzędzi nie masz dużego wpływu, a samemu można się dość szybko nauczyć nowego OSa.

Jeśli pracujesz na mniej standardowych narzędziach to bierze to gdzie one są, i to czego używa najwięcej osób w okolicy.
Bo narzędzi potrzebujesz, a w razie czego o wiele lepiej o wsparcie od ludzi, którzy już przeszli te wszystkie problemy.

Stąd teraz w większości firm najlepiej brać Macbooka ;-)
No chyba, że programuje się wybitnie pod Windows ;-)


* - czy one są lepsze to nie do końca pewne w świetle tego wpisu na Quora (w skrócie, sprzęt od Apple może mieć gorsze numerki, ale najpewniej jest bardziej stabilny bo komponenty w nim są wyższej jakości**).
** - bo np. z CPU jest tak, że producent taki jak Intel robi z tego samego wzoru masę procesorów, i dopiero później są one mierzone i sprawdzane jest jakie wytrzymają częstotliwości i napięcia i tak wybierane jest jako co będą sprzedawane.


Podobne postybeta
Piątkowy potok świadomości ;-)
Moto zakład
Forma nad treścią
Przygotowywanie jajecznicy jako analogia procesu produkcji oprogramowania ;-)
Odzyskać trochę miejsca na dysku... w macOS ;-)

wtorek, marca 13, 2018

3 Home w jednym domu ;-)

Jakieś półtora roku temu, będąc w USA, kupiłem Google Home.
To był taki zakup "nie potrzebne mi to, ale co mi szkodzi"...

Od wtedy używałem Google Home dzień w dzień...

A to jako budzika, a to jako timera, a to głośnika.


Jakoś tak po roku dołączył do Google Home, Google Home Mini, który zamieszkał w łazience:


Służy głównie do tego by go pytać o temperaturę, albo o zanieczyszczenie powietrza, czasem też gra muzykę.

A miesiąc temu pojawił się Google Home Max:


Który przejął rolę Google Home, teraz to on robi za głośnik, budzik i timer. Do tego podaje prognozę pogody, opowiada dowcipy i inne takie ;-)

Oryginalny Google Home trafił do kuchni:


I tak żyję w domu z 3 Google Home :-)
Co zabawne, gdy jestem poza domem na jakimś wyjeździe to brakuje mi Home'ów ;-)

Jeden problem to taki, że czasem kilka z nich mnie słyszy i jest mała loteria, który się odezwie.
Przydałaby się możliwość nadawania im imion ;-)



Podobne postybeta
Cywilizacja migających diod i lampeczek ;-)
A takie tam ;-)
Nexus 6
Moje G1 jest "chore", zamiast 30 godzin, wytrzyma chyba 90 godzin na baterii bez ładowania ;-)
AppInventor - tego się da używać :-)

poniedziałek, marca 05, 2018

Odzyskać trochę miejsca na dysku... w macOS ;-)

Mój pracowy Macbook Pro ma chyba tylko 256 GB SDD.
Niby to całkiem spoko, ale samych źródeł mam na dysku teraz jakieś 40 GB ;-)

Przez to czasem zdarzają się dziwne rzeczy.

W Windowsie jest możliwość skompresowania katalogów, ale jakoś w macOS/OSX nie umiałem znaleźć takiej opcji...

Aż niedawno dowiedziałem się o ditto :-) które po dodaniu opcji --hfsCompression pakuje katalog... ale tak naprawdę kopiuje katalog w nowe miejsc i ten nowy katalog jest już skompresowany...

Czyli trzeba zrobić ditto w nowe miejsce, skasować źródło, zrobić znów ditto z kopi do miejsca gdzie był oryginał i skasować kopię... dla 1 czy 2 folderów można to zrobić ręcznie, ale dla 30+ to już lekko męczące.

Ale po to mamy Pythona ;-)

import os

files=os.listdir(".")

for fi in files:
if os.path.isdir(fi):
print fi
os.popen("ditto --hfsCompression "+fi+" ~/transfer/"+fi)
os.popen("rm -rf "+fi)
os.popen("ditto --hfsCompression ~/transfer/"+fi+" "+fi)
os.popen("rm -rf ~/transfer/"+fi)

Skrypt powyżej robi właśnie to co powinien :-) bierze wszystkie foldery w danym katalogu i je kompresuje ;-)
Używa do tego katalogu "transferowego" ;-)

W taki sposób z 13-14 GB mam teraz 22 GB ;-)


Podobne postybeta
Jak walczyć z gigantycznym kodem w Java'ie, część 1 ;-)
Wybór laptopa w firmie
ePubGenerator v0.0.2
Naprawdę nienawidzę...
Zrób krzywdę swoim danym ;-)

piątek, marca 02, 2018

Tak Maven'ie, zbłądziłem ;-)

Lubię programować, nie lubię za to XMLa.

Przez to gdy usłyszałem pierwszy raz o Gradle'u to wydał mi się o wiele lepszym pomysłem od Mavena.

Gdy chciało się np. zrobić dodawanie czasu kompilacji i numeru commita do kompilatu to wystarczyło napisać krótki kawałek w Groove'ym i wszystko działało, dla Mavena jak nie było wtyczki to trzeba było napisać wtyczkę co było trudne.

Ale z czasem zaczynam stwierdzać, że jednak Maven przez to, że napisanie wtyczki wymaga jednak więcej niż zakodzenie kawałka Groovy, jest lepszy ;-)
Po prostu pozwala zrobić mniej złego.

Programiści lubią pisać. Do tego lubią się bawić.
Jako grupa jesteśmy też strasznie krótkowzroczni.

Przez to jak da się programistom narzędzie, którym można sobie odstrzelić stopę to na 100% to zrobią ;-)

Pytaniem nie będzie "czy?", ale "jak często? ;-)

Do tego Maven ma ten ficzer, że można go bardzo prosto statycznie analizować... w Gradle to takie proste nie jest.
Bo to co chcesz analizować może być tak niestandardowe, że narzędzie do analizy będzie składało się z samych if'ów...

Przez to Maven choć nie jest zbyt seksowny to jest wspierany prawie przez wszystkie możliwe IDE i to tak, że w miarę łatwo się po nim poruszać.
Z Gradle już tak łatwo nie jest. Można sobie klikać tygodniami CTRL-B czy Cmd-B, a jak InteliiJ nie załapie czegoś w którymś z plików Gradle'a, albo po prostu dany kod jest w JARze to nic nie zobaczymy.

Dlatego chciałem przeprosić Mavena.

Tak Mavenie, jesteś mniej wszechstronny od Gradle'a, ale o wiele trudniej sobie Tobą odstrzelić stopę ;-)


Podobne postybeta
O wyższości Mavena nad Gradlem ;-)
Jak zmusić Gradle'a do używania ramdysku (na OS X)
Linkownika mi zaczyna brakować...
Gradle - narzędzie do artystycznego odstrzeliwania sobie stopy ;-)
Radość przedurlopowa - przycinanie ;-)