piątek, marca 03, 2023

Szukanie czemu mi nie działa program na Java 17, a czemu działa na Java 8 ;-)

Niby programuję w Java'ie już około miliona lat ;-) [tak od września 2004 roku] widziałem już wiele, a to wersję JDK która nie miała jakichś metod w JDBC ;-), a to różne zachowanie tego samego GC na różnych maszynach.
Ale z biegiem czasu było tego coraz mniej.

A wczoraj zobaczyłem coś nowego :-)

Mam programik, który generuje "podobne posty" na blogu (to co widać na dole większości postów).
Działa on sobie tak, że odpala się co 15 minut na moim Raspberry Pi, pobiera posty z bloga, liczy podobne posty i jak jest na blogu inaczej niż wg niego powinno być to publikuje update postu.

Programik jest skompilowany dla JVM w wersji 8, bo taką kiedyś zainstalowałem Java'ę na Raspberry Pi.

Wczoraj przyszły do mnie 2 nowe ZimaBoard, z 8 GB RAM, i 4 rdzeniowymi Celeronami.
Zainstalowałem tam OpenJDK w wersji 17, skopiowałem JARa z RPi... uruchomiłem i się wywaliło na połączeniu sieciowym....

Dokładniej z:
java.net.ConnectException: Connection refused

To zacząłem sprawdzać ;-)

Najpierw, że coś jest nie tak z siecią na ZimaBoard.
Hipoteza: ZimaBoard ma źle skonfigurowany firewall

Sprawdziłem na moim macOS z tym samym JAR'em i zadziałało na Java 8, ale nie na 19 i nie na 17.
Ale jak z IJ w wersji 19 to działało ;-) [bo też klasy kompilowało].

OK, coś jest nie tak z JARem
Hipoteza: Format tego akurat pliku JAR działa dla 8, ale nie dla 17...

Zrobiłem JARa z wersją 8 z kodu, który mam w IntelliJ i działa... ale rozmiary są różne

Hipoteza: coś się zmieniło w bibliotece do połączeń sieciowych.

(nie twierdzę, że te hipotezy wynikają jedna z drugiej, tutaj wyraźnie zignorowałem to info o rozmiarze, chcąc sprawdzić coś innego)

Doszedłem już do czytania kodu JDK do PlainSocketImpl.c ;-) 
Ale uznałem, że to jednak nie jest dobry pomysł i porzuciłem na rzecz nowej hipotezy.

Hipoteza: pewnie coś się zmieniło w Java'ie i może jakieś security albo coś

(hipoteza z doświadczenia i tego, że na stack trace pojawiło się java.base/java.security.AccessController.doPrivileged)

Poszukałem (z ChatGPT ;-)) przełączników i nic, żaden nic nie zmienił.

Hipoteza: różna wersja biblioteki której używam do łączenia do Bloggera

(wracamy do tej obserwacji, że różni się rozmiar JARa)

Podmieniłem pliki z JARa (dokładniej rozpakowałem działającego i niedziałającego JARa i zacząłem podmieniać pakiety)

Dalsze zabawy pokazują, że jednak różnica może być w moim programie... (bawię się klasami i biorę zawartość działającego JARa, rozpakowuję i zmieniam pakiety by znaleźć kto się różni, i nawet wcześniej kdiff3 sprawdzałem i widziałem różnicę... czyli albo znaleźć trzeba źródła, albo spojrzeć na zdekompilowane wersje :-)).

OK, po dekomplilacji już wiem w czym problem :-) banalny jest :-)
Chociaż nie (ja to piszę jako strumień świadomości niemal ;-))

Bo widać, że jest różnica. Wersja, która działa na Java 8 i 17 ma https w adresach, a ta która działa tylko na Java 8 ma http....

Hipoteza: po pójściu na adres http, serwer wysyła 302 i Java 8 robi follow, a wyższe nie robią follow....

W kodzie mam teraz https://www.blogger.com/feeds/default/blogs, ale w starym jest http://www.blogger.com/feeds/default/blogs.

Jak sprawdziłem przy pomocy cURL'a jeśli udamy się do tego adresu z http to Google robi 302:
Location: https://www.blogger.com/feeds/default/blogs

No i wychodzi na to, że Java 8 robi follow, a Java 17 (10, 19... czyli pewnie wszystko powyżej Java 8) nie robi follow :-)

Wnioski:

To miał być taki zabawny post, że o coś się w Java'ie dziwnego dzieje ;-) a wyszła prezentacja mojego stylu rozwiązywania problemów ;-)
Co ciekawe byłem wcześniej w dobrej okolicy jak zacząłem się przyglądać temu PlainSocketImpl.c, ale uznałem, że nie warto i poszedłem dalej by wrócić do tego samego miejsca ;p

Lekcja na dziś - Java 8 robiła follow, a nowsze Java'y nie robią ;-)

Przydatne polecenia na dziś ;-)
java -p $(find . -name "*.class") - zrobi dekompilację wszystkich klas w katalogu aktualnym i wypisze na ekran... jak się przekieruje do pliku to mamy w pliku ;-)
curl -v - tryb verbose cURLa, dzięki temu widzimy 302 :-)
curl -L - tryb w którym cURL robi follow za 302 :-) (przy okazji gupi Postman robi zawsze follow i nie wiem jak zrobić by nie robił... spytałem ChatGPT i mi powiedział jak wyłączyć w Postman'ie "Automatically follow redirects") (przy okazji 2 ;-) curl -L -v robił follow ale też o tym pisze :-))

Tak przy okazji żeby się szybko przełączać między wersjami Java'y mam takie 2 polecenia w command line ;-)

list_java() {
/usr/libexec/java_home -V
}

setJava() {
export JAVA_HOME=`/usr/libexec/java_home -v $1`
}


Pierwsze, czyli list_java wypisuje mi wszystkie Java'y które mam zainstalowane na moim macOS, drugie wybiera tą która ma najbardziej podobną nazwę do tego co wpiszę ;-)

Czyli jak chcę Java'ę 8 to piszę setJava 1.8, jak chcę 17 to pisze setJava 17, jak wpisze setJava 1 to mi ustawia 19 ;-)

Przy okazji, list_java wypisuje mi takie ;-)
19.0.1 (x86_64) "Oracle Corporation" - "OpenJDK 19.0.1"
18.0.1 (x86_64) "Amazon.com Inc." - "Amazon Corretto 18"
18.0.1 (x86_64) "Azul Systems, Inc." - "Zulu 18.30.11"
17.0.6 (x86_64) "Amazon.com Inc." - "Amazon Corretto 17"
11.0.11.1 (x86_64) "Amazon.com Inc." - "Amazon Corretto 11"
11 (x86_64) "Oracle Corporation" - "Java SE 11"
10.0.2 (x86_64) "Oracle Corporation" - "Java SE 10.0.2"
1.8.0_292 (x86_64) "Amazon" - "Amazon Corretto 8"
1.8.0_202 (x86_64) "Oracle Corporation" - "Java SE 8"
1.8.0_181 (x86_64) "Oracle Corporation" - "Java SE 8"
1.8.0_92 (x86_64) "Oracle Corporation" - "Java SE 8"

Może warto by conieco było skasować ;-)




Podobne postybeta
Daj się zastąpić automatom... przynajmniej tam gdzie się to opłaci ;-)
W końcu dane z M1, które w Java'ie mówią, że to jest ARM :-)
Dla Java'y Apple Silicon M1 to jednak nadal x86 ;-)
Kto mi podmienia certyfikat do GMAILa? ;-) A bardziej - jak? ;-)
Sprzęt WiFi w procentach

czwartek, marca 02, 2023

ChatGPT - do czego i do czego nie ;-)

Na razie widzę, że ChatGPT jest dobry w:

  • pisaniu pierwszej wersji narzędzi, albo nawet całych narzędzi, pisze się czego chcemy, a on to produkuje, przykładem niech będzie narzędzie z poprzedniego postu,
  • pisania pierwszej wersji kodu, niby to samo co poprzednie, ale bardziej do fragmentów większego kodu, sam prosiłem np. o kod w Pythonie do liczenia GeoHasha, o bibliotekę, która czyta z zasobów (czyli z JARa) plik CSV i udostępnia API które potrafi mapować z jednej wartości na inną, serwer który robi coś podobnego (w Pythonie),
  • do tłumaczenia kodu między językami, ale sprawdzałem tylko kilka razy,
  • doradzania w sprawie produktów, pytasz o coś i on Ci potrafi powiedzieć jak to coś się nazywa i nawet dać przykłady urządzeń, spytałem go jak się nazywa urządzenie, które podłącza się do WiFi i udostępnia z drugiej strony gniazdko sieciowe, tak że można podłączyć urządzenie, które nie ma WiFi, a nie mamy takiego długiego kabla - chodzi o funkcję mostu, np.  TP-Link TL-WR802N ma taki tryb pracy,
  • doradzania w sprawach funkcji w programach :-) dzięki ChatGPT wiem, że w ForkLift mogę podłączyć się przez SFTP (to samo co SCP używa) do komputera i widzieć go jako system plików w ForkLift :-)
Radzi tak sobie w:
  • rysowaniu diagramów z kodu programu ;-), sprawdzałem coś takiego, wrzuciłem programiki w Pythonie i poprosiłem o diagram w marmaid i w SVG (zwrócił tekst obu), który pokarze pokaże diagram działania tego programu, tak sobie poradził,
  • doradzaniu trasy spacerów - potrafi umieścić gdzieś budynek który nie istnieje ;-) albo nie zauważa, że kolejne "kroki" wycieczki są oddalone o wiele km,
  • pisaniu maili, to jest hit and miss, czasem z krótkiego opisu potrafi napisać rozsądny mail, czasem nie,
  • pisaniu user stories, dolewa wody, ale umie to tak ładniej sformatować
Nie radzi sobie z:
  • pisaniem wierszyków ;-),
  • doradzaniem w trudnych sprawach, co najwyżej powtórzy komunały
Za każdym razem trzeba do jego wyników podchodzić z dużą dozą wątpliwości, ale rozsądnie używany może pomóc i wydaje się, że im więcej się próbuje tym lepiej to wychodzi.



Podobne postybeta
Przebrzydłe lambdy ;-)
GZIPem w plika z pomocą ChatGPT ;-)
Hmm... znów się bawię ChatGPT i rysujemy obrazek ;-) a później piszemy kod z obrazka ;-)
Feature Request do OSów ;-)
Głupi macOS, głupi WebDAV, głupi ChatGPT ;-)

środa, marca 01, 2023

GZIPem w plika z pomocą ChatGPT ;-)

ChatGPT to takie miss and hit ;-) ale w sprawach związanych z programowaniem bywa bardzo przydatny.

W pracy mam tak, że mam bardzo dużo danych w JSONie, tak przeciętnie koło 7.5 GB na katalog.
W macOS nie ma przezroczystej kompresji folderów więc jest problem z szybkim znikaniem dysku.

Ja te pliki zwykle przetwarzam jakimś Pythonem.... więc wpadłem na pomysł, że jakby były potraktowane GZIPem... 44 tysiące plików ważące 7.5 GB stają się 300-400 MB w 44 tysiącach plików ;-) (z różnych powodów chcę by to były oddzielne pliki, ale po prostu mniejsze).

No i nie chciało mi się tego ręcznie zrobić, więc dałem ChatGPT prompta, napisz w Pythonie program, który przeleci przez podfoldery aktualnego folderu i jeśli w podfolderze jest więcej niż 500 plików to skompresuje każdy z tych plików GZIPem, nie kompresuj już skompresowanych plików ;-)

Po jakimś czasie poprosiłem jeszcze by zrobił to na wielu wątkach.

No i stworzył mi coś takiego:

import os
import gzip
import concurrent.futures

def compress_file(file_path):
if not file_path.endswith('.gz'):
print(f"Compressing file {file_path}...")
with open(file_path, 'rb') as f_in:
with gzip.open(f"{file_path}.gz", 'wb') as f_out:
f_out.write(f_in.read())
os.remove(file_path)
else:
print(f"File {file_path} is already compressed in GZIP format and will not be compressed again.")

def compress_files_in_folder(path):
file_count = len([f for f in os.listdir(path) if os.path.isfile(os.path.join(path, f))])
if file_count > 500:
print(f"Compressing files in directory {path}...")
with concurrent.futures.ThreadPoolExecutor() as executor:
for filename in os.listdir(path):
file_path = os.path.join(path, filename)
executor.submit(compress_file, file_path)
else:
print(f"The number of files in directory {path} is less than 500.")

def process_folders():
root_path = os.getcwd()
with concurrent.futures.ThreadPoolExecutor() as executor:
for dirpath, dirnames, filenames in os.walk(root_path):
executor.submit(compress_files_in_folder, dirpath)

process_folders()


Działa to całkiem rozsądnie :-) z 70 GB wolnego miejsca mam znów na dysku firmowego Macbooka 230 GB :-)
Mam też drugi programik, który robi odwrotną robotę:
import os
import gzip

def decompress_file(file_path):
if file_path.endswith('.gz'):
print(f"Decompressing file {file_path}...")
with gzip.open(file_path, 'rb') as f_in:
with open(file_path[:-3], 'wb') as f_out:
f_out.write(f_in.read())
os.remove(file_path)
else:
print(f"File {file_path} is not in GZIP format and will not be decompressed.")

def decompress_files_in_folder(path):
print(f"Decompressing files in directory {path}...")
for filename in os.listdir(path):
file_path = os.path.join(path, filename)
decompress_file(file_path)

def process_folders():
root_path = os.getcwd()
for dirpath, dirnames, filenames in os.walk(root_path):
decompress_files_in_folder(dirpath)

process_folders()


Ale też poprosiłem o napisanie mi kawałka kodu, który pozwoli moim narzędziom ładować te JSONy do pamięci niezależnie czy to jest GZIP czy nie ;-)
I takie coś zaproponował:
import json
import gzip

def load(file_path):
if file_path.endswith('.gz'):
with gzip.open(file_path, 'rb') as f:
file_content = f.read()
else:
with open(file_path, 'r') as f:
file_content = f.read()
return json.loads(file_content)


Niby to nie jest rocket science, ale zamiast to pisać samemu, zrobił to za mnie ;-)

Chocaż przyznaję, że nie sprawdziłem jeszcze tego do dekompresji ;-)



Podobne postybeta
GZIP mi oddał 119 GB dysku ;-)
Odzyskać trochę miejsca na dysku... w macOS ;-)
Mistral czeka na książkę
Żenienie Todoist z Obsidian przy pomocy Pythona ;-)
Jak walczyć z gigantycznym kodem w Java'ie, część 1 ;-)

Marzec :-)

Podobno Rzymianie mieli 10 miesięcy, które zaczynały się w marcu.
Ostatnim miesiącem - dziesiątym - był December, czyli grudzień.
Później mieli tałatajstwo.

Przyszedł jakiś władca i zmienił, że mieli już 12 miesięcy, ale ten ostatni - dwunasty - czyli luty był taki gorszy, to był czas śmierci i smutku.

Ja też tak odbieram luty, chociaż nie czuję się Rzymianinem ;-)
Luty i listopad (podejrzanie oba na l ;-)) to miesiące, które najmniej lubię i oba spędzam na nadzieji na następny miesiąc ;-)

I w końcu mamy następny miesiąc, czyli marzec :-)

Od razu +10 do samopoczucia i morale :-)


Podobne postybeta
Dziwna sprawa
Tesco hack ;-)
Muzyka i czytanie ;-)
Be human for engineers: Instrukcja obsługi człowieka - marzy mi się coś takiego ;-)
Wszystko tkwi w głowie

Kiedy skończyć pracę...

Nie znoszę pracy zdalnej ;-)

Dlatego kiedyś przyjąłem, że ponieważ w biurze chodzi się do kuchni, idzie się na obiad i takie tam to czas w pracy w biurze i w domu liczą się inaczej.

Mój sposób był taki:

  • każda godzina spotkania remote liczy się tak jak 125%, czyli 75 minut,
  • każda godzina pracy remote liczy się jak 105%, czyli 63 minuty,
  • minimalną jednostką "spotkaniową" jest 30 minut.
No i chciałem zawsze mieć tak by komputer mi przypominał kiedy powinienem skończyć ;-)

Dziś napisałem sobie w końcu skrypt, który to liczy beze mnie.

I oczywiście problemem jest jak wynik ze skryptu w Pythonie zamienić na event w kalendarzu ;-)

Ale krótki czat z ChatGPT ;-) pozwolił znaleźć rozwiązanie ;-)
Nawet na to jak wyeksportować mój skrót ;-)

Jutro będę testował ;-)
Chociaż i tak wiem, że zignoruję ten event i będę siedział do 8h...

Sam skrypt wygląda tak ;-)

import urllib.request
import icalendar
import math
import datetime
import dateutil

url = "<linkToiCalCalendar>"

# Open the URL and read the iCalendar file
response = urllib.request.urlopen(url)
ical_str = response.read().decode('utf-8')

# Parse the iCalendar file
cal = icalendar.Calendar.from_ical(ical_str)

now = datetime.datetime.now(datetime.timezone.utc)

today_9am = now.replace(hour=8, minute=0, second=0, microsecond=0) + datetime.timedelta(days=0)
endOfToday = now.replace(hour=0,minute=0,second=0,microsecond=0) + datetime.timedelta(days=1)

events = []
for component in cal.walk():
if component.name == "VEVENT":
dt = component["DTSTART"].dt
t = dt if isinstance(dt, datetime.datetime) else datetime.datetime.combine(dt,datetime.time(0,0),tzinfo=datetime.timezone.utc)
# Check if the event is recurring
if "RRULE" in component:
# Parse the RRULE property
rrule = dateutil.rrule.rrulestr(component["RRULE"].to_ical().decode(), dtstart=t)
# Generate a list of occurrences of the event within the desired time range
until=component["RRULE"]["UNTIL"][0] if component["RRULE"]["UNTIL"] else None
for occurrence in rrule.between(today_9am, endOfToday, inc=True):
if occurrence>until:
continue
et = component["DTEND"].dt
length=et-dt
events.append({"title": component["SUMMARY"], "start": occurrence,"len": length})
else:
# Add the event to the list if it's not recurring
dt = component["DTSTART"].dt
et = component["DTEND"].dt
t = dt if isinstance(dt, datetime.datetime) else datetime.datetime.combine(dt,datetime.time(0,0),tzinfo=datetime.timezone.utc)
if t > today_9am and t < endOfToday:
length=et-dt
events.append({"title": component["SUMMARY"], "start": t, "len": length})


events.sort(key=lambda x:x["start"])

# meetings which are safe to ignore
safeMeetings = set(["Blocked","Coding","Fuzzy Bug Triage"])

total_meeting_minutes=0

for event in events:
if event["title"] in safeMeetings:
continue
total_seconds = event["len"].total_seconds()
total_minutes = total_seconds // 60
total_meeting_minutes+=math.ceil(total_minutes/30)*30

scaled_total_meeting_minutes=math.ceil(total_meeting_minutes*1.25)
toUse=8*60-scaled_total_meeting_minutes
nonMeeting=math.floor(toUse/1.05)
toWork=total_meeting_minutes+nonMeeting
endWork=now.replace(hour=10+toWork//60,minute=toWork%60,second=0)
if endWork.weekday()<5:
print(endWork.strftime("%Y-%m-%d %H:%M:%S"))



Podobne postybeta
Jak nie zapomnieć kupić biletu miesięcznego ;-)
Jak nie zapomnieć kupić biletu miesięcznego - revised ;-)
Mistral czeka na książkę
SleepAdvisor - komórka pomaga w wyspaniu się ;-)
Jak się dowiedziałem o tym, że w Polsce rusza Google Play Movies ;-)

wtorek, lutego 28, 2023

Próby panowania nad chaosem

Zauważyłem, że gdy muszę robić wiele rzeczy naraz to zaczynam się gubić ;-)
Nie pamiętam wszystkiego, ale pamiętam, że coś tam jest.

Stąd teraz to co pomaga na takie sytuacje ;-)
* granie w Dooma - dziwne, ale człowiek po prostu umie więcej śledzić ;-)
* spisanie sobie tego co mamy na głowie - wychodzi na to, że jak człowiek spisze co ma na głowie to głowa uznaje, że nie musi ciągle pamiętać o tym, że coś na niej jest i łatwiej jest myśleć o jednej rzeczy
* Pomodoro - 25 minut na 1 rzecz, nieważne, że np. skrypt potrzebuje 5 czy 10 minut żeby się wykonać, nie należy się przełączać na nic innego, tylko czekać jak skończy,
* zrzucenie na innych części roboty - tutaj FAQ pomaga, ale to zależy od ludzi,
* automaty - wiele rzeczy wymaga tylko kilku klknięć, ale zawsze prościej jest jak nie wymaga żadnego ;-) (OK, tu nie jestem ;-)),
* medytacja - jak jest na nią czas ;-)

Nadal to jednak tylko półśrodki ;-) i najlepiej nie mieć wielu rzeczy na głowie po prostu ;-)



Podobne postybeta
Steam Deck OLED po 24h :-)
Potok świadomości - Machine Learning może tagować posty ;-), iPhone ssie, fajne książki, spać.....
0 prawo programowania - Shit hits all fans in the same time
Zmierzch Webu?
Moja triada spokoju to jednak nie triada a tetrada spokoju ;-)

poniedziałek, lutego 27, 2023

PPK mnie ściga ;-) (Pokemonowe Programy Kapitałowe ;-))

Patrząc na liczby PPK powinno być dobrym pomysłem, niby zabierają Ci ekstra 2% pensji, ale pracodawca musi dorzucić jeszcze 1.5%, czyli z Twoich 2% robi się 3.5% Twojej pensji które jest odkładane.
Do tego dorzucają Ci jeszcze 240 PLN rocznie (nie żeby to robiło dużą różnicę przy wyższych zarobkach ;-)).
Do tego nie płacisz od tego podatku, dopiero w przyszłości.

Ja jednak się uparłem, że do momentu jak rządzi PiS nie przystąpię do PPK.
Skąd pewność, że jak trafisz przez firmę do funduszu zarządzanego przez bank, który jest państwowy lub podlega państwu to tamtejsi managerowie funduszu nie będą kupowali wskazanych akcji państwowych koncernów by podbić im notowania?

Ale państwo usilnie próbuje mnie przekonać do przystąpienia, najnowszy pomysł, wszystkie rezygnacje z przynależności do PPK przestają działać z końcem lutego.
Trzeba złożyć nowe.

Ale, tu trzeba uważać, wszystkie rezygnacje złożone przed 1 marca 2023 unieważniają się na początku marca... czyli jeśli nie chcesz się w marcu załapać do PPK musisz złożyć wniosek po 1 marca, ale że wiele firm np. do 15 zamyka przygotowania do pensji to może się okazać, że najlepiej złożyć papier przed np. 10 marca ;-)

Się czuję jak Pokemon i PPK jest łowcą Pokemonów i chce nasz wszystkich złapać ;-)



Podobne postybeta
Kryzysowy, pokręcony algorytm? ;-)
Linki, czemu nikt nie używa linków?
Leń
Hackowanie organizacyjno-projektowe ;-)
Funeral TV

poniedziałek, stycznia 23, 2023

ChatGPT jest potężne...

Bawiłem się ChatGPT i uznawałem, że fajne, ale nie rozumiałem tego czemu np. Google jest tak przerażone.

Teraz rozumiem ;-)

Najpierw pomęczyłem ChatGPT pytaniami o pewien program, tutaj nasza rozmowa:



Fakt, przy pierwszym podejściu w miejscu gdzie teraz mówi o nieskończoności poszedł w krzaki i próbował wypisać wyniki pośrednie i się zawiesił... o czym zapomniał, ale wiedza mu została i już drugi raz tego nie zrobił.

OK, to uznałem, że poproszę go o rozwiązanie zadania które dawaliśmy na Phone Screen kandydatom w poprzedniej firmie....

Drań to zrobił w mniej niż 30 sekund ;-)

Nie podam przykładu bo za bardzo podobne do tego co kandydaci pisali ;-)

Fakt, zapomniał o hashCode i equals, ale jak mu zwróciłem uwagę to dodał te metody.

To kolejny test zrobiłem....

Poprosiłem go o to by mi napisał kod, który napisałem w pracy w piątek i poniedziałek, a w weekend jeszcze sprawdzałem jak czytać dane z pliku w JARze...

Mam plik CSV z danymi w postaci:

klucz, dana1, dana2

Chcę na wyjściu coś co po zawołaniu metody get z kluczem zwróci mi obiekt z tymi dana1 i dana2.

Zaproponował rozwiązanie, zwróciłem uwagę, że jednak nie czyta tego z pliku... i nie tworzy tego obiektu z pliku, więc napisał mi ten kod.

Zwróciłem uwagę, że chcę ten plik mieć w JARze i że plik się nazywa mapped.csv... drań zaproponował kod, który to rozwiązał.

Czyżby rola programistów w przyszłości miała polegać na dyskutowaniu z ChatGPT i jego następcami/konkurentami w celu wygenerowania kodu? ;-)

Trochę to przerażające ;-)

Zawsze myślałem, że w programowaniu ważna jest świadomość, że umiemy programować bo jesteśmy świadomi, więc umiemy zrozumieć problem i znaleźć jego rozwiązanie.

Okazuje się, że to wcale nie jest takie pewne...



Podobne postybeta
AI nie zabierze nam pracy - przynajmniej teraz ;-)
Tak Maven'ie, zbłądziłem ;-)
Tak tworzy się przyszłość
Chorować to trzeba umieć ;-)
Terminatorowa refleksja ;-)

niedziela, stycznia 15, 2023

Dla mnie Apple Watch to jedyny powód by używać iPhone'a ;-)

Mam iPhone'a od początku października 2022, czyli leci już 4 miesiąc.

Nadal noszę w kieszeni nie tylko iPhone'a 14 Pro Max, ale też starszego Pixela 6 Pro ;-)


Niby iPhone jest już moim daily driverem i używam go do wielu rzeczy to nadal nie używam go tak chętnie jak Pixela.
Plus z tego taki, że po prostu mniej telefonu używam ;-)

Android jakoś lepiej umie wykorzystać przestrzeń, co dziwne te aplikacje których używam są chyba lepiej napisane na Androida ;-)

Jak używam Chrome na iPhone'ie to jest to dziwne (Safari jest jeszcze dziwniejsze ;-)), a na Androidzie działa spoko :-)

Głównie mnie w używaniu hamuje klawiatura, nie wiem, ale jakoś na iPhone'ie pisanie idzie mi dużo gorzej niż na Androidzie, a bądźmy szczerzy na Androidzie w porównaniu do klawiatury fizycznej idzie mi fatalnie ;-)

A ostrzegała mnie kiedyś pewna osoba, która przeszła na iPhone'a Mini, trzeba było słuchać ;-)

To czemu używam iPhone'a? Bo Apple umi w zegarki ;-) i sorry, na razie z tego co próbowałem nic nie pobije Apple Watch Ultra :-) 
Chociaż Apple Watch Ultra (i wszystkie Apple Watch) ma bardzo mały wybór tarczy to i tak bije wszystko czego wcześniej używałem. 

Ok, jeden dodatkowy plus Apple, Apple Pay jakoś tak jakby lepiej działa od Android Pay. Np. dostałem pod koniec roku bon sodexo, który bez kłopotu dodałem jako kartę do Apple Pay i Apple Wallet, a w Google/Android Pay mi się to nie udało i dostaję tylko jakieś tajemnicze numerki błędów ;-)

(taki wpis o niczym ;-))



Podobne postybeta
Podróże ;-)
Szaleństwo zakupów w Android Market ;-)
Android jednak rządzi w klawiatury
iOS ma z definicji popsutą klawiaturę ;-) i nie lubi przecinków
Pixel vs iPhone ;-)

wtorek, stycznia 03, 2023

Dowód andegdotyczny, ale jednak dowód, że rząd PiS jest zły

Ostatni raz partie na które głosowałem rządziły od 2001 roku do powiedzmy 2004 (w końcu rządził Marek Belka, który do końca nie był wprost z żadnej z tych partii).

Później zawsze wygrywały partie na które nie głosowałem.

Nie przepadałem za tymi partiami, na moim blogu jest wiele wpisów o tym ;-)

Nie lubiłem tych partii, ale choć mogłem się nie zgadzać z większością sejmową to jakoś to się kręciło i ufałem państwu i jego instytucjom jako takim.

Do 2015 wierzyłem w system emerytalny, bo choć może nie idealny to jakoś działał i idea zwiększenia wieku emerytalnego miała sens (w skrócie system emerytalny to taka wirtualna "rura" do której wkładamy pieniądze i z której je później wyjmujemy... ile i kiedy zależy od szerokości tej rury na wejściu i wyjściu i długości rury jako takiej i wydłużenie wieku emerytalnego miało pomóc zachować szerokość rury "na wyjściu" bez poszerzania jej na wejściu, przez jej wydłużenie). 
Przyszedł PiS i rozwalili system emerytalny. Teraz nie liczę na żadną emeryturę. Chociaż od wielu lat płacę maksymalną stawkę.

Od dawna płacę też abonament za TV, chociaż jej już nie oglądam od wielu lat. Przed 2015 rokiem nie miałem nic przeciwko TVP, co prawda denerwowało mnie to, że jest np. program Pospieszalskiego, ale w końcu to telewizja publiczna więc powinna puszczać też to z czym się nie zgadzam.... teraz puszcza tylko to ;-) tamta puszczała jeszcze coś z czym się zgadzałem ;-)

W ogóle, jaki jest teraz najważniejszy problem w Polsce? Wojna w Ukrainie? Inflacja która się wyrwała spod kontroli?

Nie, to że jakiś przebrzmiały zespół na "Sylwestrze Marzeń" w TVP miał tęczowe opaski.... i wypowiadają się w tej sprawie ministrowie.... 

Do bani z taką władzą, chyba nas kurde stać na coś lepszego, nie?

A to wszystko piszę bo znów płaciłem abonament za RTV i czuję się dymany... a i w tym roku zapłacę ponad 20k na emeryturę której nie dostanę bo "za chwilę" ZUS po prostu zbankrutuje (tzn. robi to tak co kilka lat i budżet mu pożycza i umarza pożyczki, ale po prostu teraz to będzie kwota tak wysoka, że już nie będzie skąd pożyczyć...)



Podobne postybeta
A jakby tak zaskarżyć abonament RTV? ;-)
Czemu obecny Sejm i rząd są wyjątkowe?
Wybory
Dziwne finanse, dziwna gospodarka......
To i ja planowałem zamach stanu?