czwartek, grudnia 02, 2021

Czy to jeszcze dynamic programming? ;-)

Takie coś przed chwilą popełniłem w ramach ćwiczenia dynamic programming ;-)

public static final int TYPE = 0;
public static final int PASTE = 1;
public static final int COPY = 2;
public static final int SELECT = 3;
Function<Integer,Integer> ADD_1 = k -> k+1;
Function<Integer,Integer> ADD_0 = k -> k+0;
Function<Integer,Integer> MUL_2 = k -> k*2;

private Function<Integer,Integer> max(Function<Integer,Integer> a, Function<Integer, Integer> b) {
if (a.apply(Integer.valueOf(2))>b.apply(Integer.valueOf(2))) return a;
return b;
}

public int howMany(int keystrokes) {
var dp = new Function[keystrokes][4];
dp[keystrokes-1][TYPE]=ADD_1;
dp[keystrokes-1][PASTE]=MUL_2;
dp[keystrokes-1][COPY]=ADD_0;
dp[keystrokes-1][SELECT]=ADD_0;
for (var i=keystrokes-2; i>=0; i--) {
dp[i][TYPE]=max(dp[i+1][TYPE].compose(ADD_1),dp[i+1][SELECT].compose(ADD_1));
dp[i][PASTE]=max(dp[i+1][TYPE].compose(ADD_1),dp[i+1][SELECT]);
dp[i][COPY]=dp[i+1][PASTE];
dp[i][SELECT]=dp[i+1][COPY];

}
return (Integer)dp[0][0].apply(Integer.valueOf(1))-1;
}

I nie wiem czy się jeszcze to liczy jako Dynamic Programming, czy już nie ;-)

Tu to samo jako obrazek ;-)

Ogólna idea jest taka, że składamy funkcje z innych funkcji i w razie czego liczymy "max" funkcji ;-)

Spełnia wg mnie wymagania dynamic programming, ale jest dziwne ;-)

Jakby co ma błąd, ale na razie mi bardziej zależało na sprawdzeniu koncepcji niż znalezieniu rozwiązania ;p




Podobne postybeta
Struktury danych vs algorytmy
Ile to jest 1+1 w Java'ie?
Java i liczby pierwsze, odsłona druga
Człowiek się uczy całe życie - źle rozumiałem cache'owanie Integerów :-)
Zdradliwa Java i 8 królowych ;-)

piątek, listopada 26, 2021

No i mam Pixel 6 ;-)

No i mam Pixel 6 i jeszcze nie wiem co o nim sądzę.
Tak naprawdę na razie nie widzę jakichś znaczących różnic względem Pixel 4 XL :-)
To pewnie przez to, że na razie nie miałem zbyt wielu okazji robić zdjęć, a bądźmy szczerzy to jest chyba najważniejszy ficzer dla mnie w telefonie.
Rozmiarami Pixel 6 jest niemal dokladnie tych samych rozmiarów co Pixel 4 XL. Jest za to wyraźnie cięższy.
Nadal mam mieszane uczucia.
Nie żeby w Pixel 6 było coś złego, po prostu nie czuje aż takiego zachwytu jak między Pixel 3 XL, a Pixel 4 XL.
Chociaż może chodzi o to, że w przypadku 4 XL kupowałem po recenzjach mowiwcych, że jest taki sobie i spodziewałem się chyba czegoś gorszego od 3 XL, a było super.
W końcu znany jest wzór:
Wrażenia = oczekiwania - rzeczywistość

posted from Bloggeroid




Podobne postybeta
Android 10 już jest :-)
Pixel 4 XL czy iPhone 11 Pro
Moto 360 v2 - to jest to :-)
Pixel XL jest genialny
Z Nexusów do Pixeli

wtorek, listopada 09, 2021

Czego brakuje koderom ;-)

Duże firmy z FAANG* (czy teraz MANGA** ;-)) podobno bardzo lubią przyjmować "upadłych" twórców startupów (takich nieupadłych też ;-), ale tych jest po prostu mniej ;-)).

Jak rozumiem to dlatego, że oni zwykle mają ten dar którego brakuje większości developerów, PMów i ogólnie ludzi tworzących software.

Mają wbudowane optymalizatory RIO i drive do dowiezienia funkcjonalności, a do tego rozumieją, że software to coś żywego i jego los nie kończy się w momencie końca testów, to jest dopiero ten mniej ważny kawałek zakończony.
Umieją stwierdzić czy ficzer a jest ważniejszy od ficzera b nie na podstawie mglistego "bo za 2 lata", ale tego, że zwrot z inwestycji będzie większy. Rozumieją też, że jak coś dowozimy to lepiej dowieźć to wcześniej i w razie czego trochę poprawić czy zmienić, zamiast przekonać się po roku, że właściwie to nie jest to czego potrzebują userzy.
Wiedzą, że migracja danych to nie jest coś "co się zrobi później".
No i nigdy nie zgadzają się na prace nad czymś czego nikt później nie używa....

Zaczynam rozumieć czemu to takie ważne ;-)


* - FAANG - Facebook, Apple, Amazon, Netflix, Google***
** - MANGA - Meta (bo to teraz nazwa Facebooka), Apple, Netflix, Google, Amazon***
*** - wszystkie skróty Google nazywają Google, a nie Alphabetem...




Podobne postybeta
Jak apokalipsa to nie w Warszawie ;-)
Urodzeni koderzy
Brak weny
Dinozaur w domu ;-)
Moja teoria firm IT

wtorek, października 26, 2021

var bywa niebezpieczne :-)

Robię sobie zadania na LeetCode i odkrywam, że choć var mi bardzo życie ułatwia to też i utrudnia ;-)

Głównie gdy operuję kolekcjami i trzymam w nich rzeczy ws tylu Integer'ów ;-)

Często i gęsto mam w kodzie coś takiego:

        void remove() {
var val = q.pollFirst();
if (maxes.peek()==val) maxes.pollFirst();
}
(co jest fragmentem impelmetnacji kolejki z max)

I niby wszystko jest fajnie... ale przez to var i == są problemy.
Gdyby kod był:
        void remove() {
int val = q.pollFirst();
if (maxes.peek()==val) maxes.pollFirst();
}
To w linii z q.pollFirst() doszłoby do autounboxing'u i w kolejnej linii porównywałbym int'y, a tak jak jest var to do val wędruje Integer i w kolejnej linii == porównuje instancje obiektów...

Co najgorsze, przez to, że to Integer to to będzie działać dla wielu przypadków ;-) (w większości JVMek dla -128 do 127 ;-)) 

Już się drugi raz tak zrobiłem w ciągu ostatnich 2 dni....



Podobne postybeta
Nieoczywiste oczywistości ;-) podstępny autoboxing ;-)
Potworność ;-) czyli mnożenie w 90 liniach ;-)
Człowiek się uczy całe życie - źle rozumiałem cache'owanie Integerów :-)
Bug w debugu ;-)
Ile to jest 1+1 w Java'ie?

sobota, października 23, 2021

On-call i sąsiedzi którzy robią remont się nie łączą zbyt dobrze :-)

Wczoraj poszedłem spać tak koło 4 w nocy uznając, że i tak mam on-calla to nie ma co iść wcześniej spać.
No i z drugiej strony trochę później wstanę i będzie Ok.
I do 8:15 było, ale wtedy jakiś szaleniec zaczął wiercić dziury...
Normalnie bym zaklął i założył AirPods Pro albo i Max... i pospał dzięki magii noise cancelling.... Ale jakbym to zrobił to w razie czego nie usłyszałbym wycia on-calla...

posted from Bloggeroid




Podobne postybeta
AirPods Pro rządzą
1 plus braku tramwaju ;-)
"Dziennikarze"
AirPods Pro po 5 miesiącach
Jeden kawałek za mną ostatnio łazi ;-)

czwartek, października 14, 2021

A może by tak potrząsnąć drzewem zależności? ;-)

Jest tak, mam microservice który został zbudowany w oparciu o coś co trzeba by było updatować, ale to coś przepisuje masę kodu, który też jest ręcznie zmieniany więc z tym się nie da żyć, więc tego nie updatuję.

Poprawki bezpieczeństwa w postaci updatów bibliotek załatwiam "obok", co zabawne większość bibliotek które musiałem updatować (bo jeden albo drugi skaner stwierdziły, że dana wersja jest be) to rzeczy, których nie używam...

I mnie tak kusi by puścić analizę taką, popatrzeć na skompilowany kod i wszystkie klasy które woła, później przejść przez wszystkie JARy które mam na ClassPath (ClassPath długo nie umrze ;-)) i spróbować namierzyć te JARy, których kodu nie używam :-)

To może być ciut zbyt entuzjastyczne przez te głupie pomysły jak to co robi JDBC (akurat nie mam ;-)), czy implementacje SLF4J, bo tam jest ten brzydki sposób z rejestrowaniem się, które momentami odwraca to co kto woła (w SLF4J jest chyba tak, że skanuje w poszukiwaniu implementacji? Nie pomnę, ale problemy robiło)
Do tego jakieś straszne miejsca gdzie są używane refleksje... 

Ale mnie kusi, tylko jeszcze by się przydało mieć z 2-3 dni takiego luzu by się w to pobawić... a o to będzie trudniej ;-) 




Podobne postybeta
Gradle - narzędzie do artystycznego odstrzeliwania sobie stopy ;-)
To Update or not to update? ;-)
Chciałbym Chromebooka
GCJ mnie przerosło ;-)
Mysaifu JVM - Java dla PocketPC

poniedziałek, października 11, 2021

Komputer na korbę ;-)

Widziałem wideo o OLPC (One Laptop Per Child) które niby było wielką wtopą... ale tak naprawdę chyba trochę pokazało firmom, że jest nisza której nie dotykały i teraz tam są telefony, Chromebooki i podobne.

Ale nie o tym tutaj ;-)

OLPC miał korbkę :-) tzn było akcesorium, które pozwalało go "ładować" korbką i próbowałem tak oszacować ile by trzeba było kręcić by np mojego MBP15 z 2018 roku przez godzinę móc używać ;-)

Próbowałem szacować ile mocy jest w takiej korbie, ale jakoś mi nie wychodziło bo moje szacunki były między ~0.7 W, a 10 W. 

Internet mówi, że to jest między 5 a 15 W, czyli nie byłem aż tak daleko :-)

Godzina kręcenia taką korbą to między 5 a 15 Wh ;-) czyli między 0.005-0.015 kWh ;-)

Pojemność baterii w moim MBP15 z 2018 to na dziś 6710 mAh (co by znaczyło, że już nie ma pełnej pojemności ;-)), przeliczenie na Wh wymagałoby znajomości napięcia z baterii ;-)

Na szczęście Internet też zna odpowiedź na pojemność baterii w Wh.... ~84 Wh.

Co by znaczyło, że do "napompowania" baterii na full (załóżmy 100% skuteczność) trzeba by było kręcić korbką od 5:36 do 16:48 ;-) 
Powiedzmy, że laptop działa na baterii 5h (OK, podobno 11 czy jakoś tak, ale ja chyba inaczej używam ;-)).
Czyli by mieć mniej więcej 1h pracy trzeba by było kręcić korbą od ~1:08 do ~3:21 ;-)

Nie jest to jednak interes życia ;-)

A i tak istnieje szansa, że się gdzieś w obliczeniach walnąłem o jeden albo dwa rzędy ;-)




Podobne postybeta
2.6 drzewa na telefon komórkowy ;-)
ISS poraz kolejny :-) tym razem poprzedzona HTV :-)
Chcę MBP15, ale z klawiaturą ;-)
15354.976 ;-)
Głupie użycie twierdzenia Bayesa.....

piątek, października 08, 2021

Struktury danych vs algorytmy

Gdy te 12 lat temu uczyłem się po raz pierwszy algorytmów i struktur danych z Introduction to Algorithms zauważyłem, że jakoś lepiej mi idą struktury danych niż algorytmy.

I tak jest do teraz ;-)

Łatwiej mi jest zaprojektować strukturę danych niż algo.

Może chodzi o to, że często i gęsto to jest po prostu składanie z prostszych klocków? 

A może chodzi też o to, że ze strukturami danych mamy tak naprawdę tylko interfejs i łatwiej jest mapować ten interfejs do skończonej liczby struktur? ;-)

W sensie, że jak się myśli o strukturze danych to można ją wyspecyfikować od strony tego jak będzie zasilana danymi, jak będzie odpytywana i teraz to już tylko zwykle zastanawianie się jakie klocki do tego pasują? 

Z algo jest tak, że też jest zwykle skończona liczba podobnych przypadków do tego, który się robi, ale jakoś łatwiej głupieję, a i tak w końcu się okazuje, że Dynamic Programming było odpowiedzią, a ja i DP jakoś nie jesteśmy w pełni kompatybilni ;-) tzn umiem użyć w wielu momentach, w wielu widzę, że "O! przecież to liczę wiele razy to DP by było jak znalazł" ale często mi brakuje tego "klucza" po którym będę szukał.

No ciekawe. Widać po prostu struktury danych są prostsze :-)




Podobne postybeta
Dziś programista ma być teoretycznym algorytmistą, a praktycznym kleistą ;-)
Przeżycie artystyczne ;-)
Telewizyjne zastanawianie
Ksiązki - nieksiążki ;-)
A gdyby tak....

czwartek, października 07, 2021

Kod jako insight w umysł ;-)

Ponad rok temu zacząłem z kimś robić zadania z książek, głównie z Cracking the Coding Interview i Elements of Programming Interviews in Java.

Były momenty robienia po 3 zadania dziennie i miesiące bez robienia zadań.

I tak czasem sprawdzam po zrobieniu zadania poprzednie rozwiązania swoje i tej osoby i ciekawa sprawa.

Jak często mamy inne rozwiązania, to zwykle nasze rozwiązania z teraz i np. sprzed roku są bardzo podobno lub identyczne... czasem nawet co do nazw zmiennych :-)

I zastanawiam się czy to wynik tego, że przy pierwszym kontakcie z zadaniem się znalazło sposób na rozwiązanie i teraz mniej lub bardziej świadomie się "jedzie z pamięci", czy może za każdym razem to jest oryginalny twór umysły i wynika z okablowania mózgu?

Czy może chodzi o mieszankę?

Wiem, że sam od momentu gdy zacząłem uprawiać blindfold programming dzielę sobie kod w głowie na chunki i możliwe jest, że pamiętam "chunka". Co by pasowało bo ja jestem zwykle bardziej "wierny" w kodzie temu co napisałem rok czy dwa lata temu.

Czasem też pamiętam fizyczną analogię problemu, czy to sam ją wymyśliłem czy ktoś mi opisał.

Mam jednak wrażenie, że patrzenie na czyjś kod (w tym swój ;-)) to taka forma insightu w umysł ;-)




Podobne postybeta
Czas wrócić do blindfold programming
Jakie by tu zadanie zrobić? ;-)
Znowu dyskusja....
Ulotny twór - software ;-)
Czy można śnić 2 lub więcej snów w tym samym momencie? ;-)

niedziela, września 05, 2021

Irracjonalna malpa ;-)

Kiedyś odkryłem, że dobrym sposobem na sprawdzenie co czuje jest rzucenie monetą czy wylosowanie liczby (wcześniej przypisując liczbom odpowiedzi).
Dostaje taką losową odpowiedź i sprawdzając co czuje na myśl, że mam wybrać tą opcję mogę ocenić jaki wynik bym wolał.
Problem w tym, że czasem mnie ponosi i chce tego samego sposobu użyć do rozwiązania wątpliwości wynikającej nie z tego, że nie wiem co ja czuję czy czego chcę, ale takiej gdzie chodzi o uczucia czy opinie innych ludzi, firm czy procesów ;-)
Coś jak kwiatek i "kocha, lubi, szanuje" ;-)
Dlatego trzeba uważać, bo zwykle jak się losuje więcej niż raz bo wyszło coś innego niż się chciało to jest sygnał, że już wiem czego chcę, ale musiałem pytanie sformułować tak, że naprawdę pytam nie o swoją ocenę, a o coś co jest poza mną ;-)
Bycie racjonalnym człowiekiem jest trudne, te miliony lat ewolucji nas strasznie irracjonalnymi zrobiły ;-)

posted from Bloggeroid




Podobne postybeta
Post drugie - bądź na tak ;-)
O wyższości podejmowania decyzji partiami zamiast per sztuka ;-)
Gdzie by się tu przenieść...
Bug or Feature?
Smile Challenge - zapraszam do testów ;-)