1

PHP, Gemini, HTTP 400 i jeden debil

PHP, Gemini, HTTP 400 i jeden debil — ja.

Nowy Zwykolak: Executive Director of Strategic Mobility & Occupancy Intelligence. Witamy w drużynie!

Pojebany tydzień za mną.

Chociaż jest dopiero czwartek rano.

Trzy dni. Jakieś 45 godzin pracy. Kilka pojebanych fuck-upów.

Korki w głowie wyjebane. Izolacja społeczna i krzyczenie na ludzi — bardzo.

Long na głodniaka o szóstej rano, gdzieś za miasto. Nawet śmieciarka by mnie nie znalazła, gdybym padł po drodze 😯

Trzeba odpocząć. Zredukować stres. Zająć się czymś przyjemnym.

Gdybym miał żonę, pewnie poszlibyśmy do parku i karmili kaczki w ciszy.

Ale kandydatka wyjątkowo jest normalnym człowiekiem. Pozdrawiam ciepło i szczerze przepraszam Panią Milenę za ciszę na łączach. Nie warto jej przecież zniechęcać do siebie już na starcie, prezentując najgorszą wersję własnej osoby 😀

No to kodowanie.

Na szczęście akurat pojawiła się okazja.

Park Południowy. Ławka obok fontanny. Laptop.

Tak odpoczywają ninja.

 

Jak postawić elektrownię atomową do  zasilenia lodówki

Problem był banalny. Potrzebowaliśmy wiedzieć, ile samochodów w różnych dniach i godzinach stoi na parkingach dużego obiektu rekreacyjnego. Planujemy rozbudowę, a ponad ileś tam (XD) miejsc parkingowych powinno wystarczyć również po jej zakończeniu.

Powinno. Więc wypadałoby to sprawdzić.

Mamy monitoring. Trzy kamery obejmujące główne parkingi. Archiwum nagrań.

Normalny człowiek zrobiłby screenshoty, policzył samochody, wpisał wyniki do Excela i poszedł do domu.

Tylko że powtarzanie tego przez kolejne tygodnie oznacza dług operacyjny. Ktoś musi to robić, poświęcać czas, popełniać błędy i generować koszty.

A ja, jak wiadomo, mam alergię na pracę, którą można zautomatyzować.

Więc zacząłem od YOLO, Pythona, OpenCV, trackingu, RTSP i automatycznej detekcji zajętości miejsc parkingowych.

Dla niewtajemniczonych: YOLO to rodzina modeli do wykrywania obiektów na obrazach.

Jeśli pomyślałeś o czymś innym, to… nawet nie będę komentował.

Jeszcze chwila i stawialibyśmy Kubernetesa do liczenia zaparkowanych Golfów.

A potem przyszła refleksja.

Po chuj nam to wszystko?

Nie potrzebujemy monitorowania parkingów w czasie rzeczywistym. Wystarczą zdjęcia z konkretnych godzin.

Trzy parkingi. Trzy fotografie. Jedno zapytanie do LLM-a.

„A może od razu podpiąć Gemini?”

Jedno z najbardziej niebezpiecznych zdań w historii programowania.

Zaraz po: „To tylko mała poprawka”.

 

Proszę państwa, oto dyrektor

Ponieważ od jakiegoś czasu tworzę własne uniwersum cyfrowych degeneratów, zwanych Zwykolakami, nowy projekt musiał dostać odpowiednią oprawę.

Powołaliśmy więc stanowisko:

Executive Director of Strategic Mobility & Occupancy Intelligence.

Po LinkedInowemu, kurwa. XD

Człowiek z takim tytułem powinien zarabiać minimum 35 tysięcy, mieć gabinet na ostatnim piętrze i trzy spotkania tygodniowo dotyczące synergii.

A jego zadanie?

Patrzeć na zdjęcia i liczyć samochody.

Pensja: zero.

Budżet API: 25 zł.

Prestiż: nieograniczony.

Technicznie postawiliśmy na prostotę: PHP 8, JavaScript, CSS, SQLite przez PDO i Gemini REST API przez cURL. Stack nudny jak instrukcja pralki. I właśnie dlatego idealny 😀

Zdjęcia lecą do modelu, wraca JSON, PHP waliduje odpowiedź i zapisuje wyniki. Do tego historia, korekty, statystyki i CSV.

A w drugim rzucie, kiedy sam silnik już działa, dojdzie jeszcze automatyzacja robienia screenshotów.

Bez frameworków. Bez kontenerów. Bez technologii, które brzmią mądrze na LinkedInie, a później nikt nie wie, po co właściwie tam są.

Ale przecież aplikacja musi wyglądać.

CSS. Responsywność. Animacje.

Taki uczciwy, przyzwoity frontend. Bo jednak jesteśmy ludźmi cywilizowanymi.

Do tego nasze Zwykolaki w PNG.

Tragarz przy uploadzie. Silky podczas liczenia. Mędrzec przy wynikach. Chronomata od dat. Wkurwisław od błędów.

Ten ostatni, jak się później okazało, miał wyjątkowo pracowity dzień.

Nawet jednorazowy instalator dostał własny, dopracowany interfejs i komunikat:

„Przekaż klucze dyrektorowi”.

Czy było to potrzebne? Zapewne nie.

Czy było warto? ABSOLUTNIE.

Bo po co robić brzydkie, skoro można ładne?

Wiem. Backendowiec dobrowolnie bawiący się frontendem.

Upokorzenie kompletne.

 

HTTP 400, czyli cyfrowe „ssij”

Całość zajęła około 9 godzin. W tym godzina myślenia, 3 kodowania, 2 deploymentu i solidna porcja debugowania własnej głupoty.

 

Aplikacja stoi. SQLite działa. Frontend wygląda elegancko.

Klikamy:

POLICZ.

HTTP 400.

Wkurwisław wyskakuje na ekranie:

„KURWA. API postanowiło dzisiaj nie współpracować”.

No pięknie.

Sprawdzamy klucz. Billing. Limity. Model. JSON Schema. Endpoint.

Na koncie 25 zł, a dyrektor nadal odmawia pracy.

Piszemy dodatkową diagnostykę. 

Potem dodatkową lepszą diagnostykę.

Jeszcze chwila i będzie drugie środowisko XD

Zmieniamy nawet sposób wywołania Gemini  z Interactions na generateContent.

Dalej HTTP 400.

INVALID_ARGUMENT

API_KEY_INVALID

W pewnym momencie naprawdę chciałem jebnąć to wszystko i jechać do Portugalii zbierać mandarynki.

Mandarynka nie wali czterysetą.

Mandarynka jest uczciwa.

W końcu wracamy do podstaw.

PowerShell. Dwa kluczowe testy.

Pierwszy: czy klucz pozwala pobrać listę modeli? Tak.

Drugi: czy bezpośrednie wywołanie generateContent działa? Tak.

Model odpowiada: OK.

Czyli API działa. Model działa. Klucz działa.

A produkcja nadal leży.

Sprawdzamy priorytety zmiennych środowiskowych, parser .env, odciski SHA-256.

Odciski kluczy się nie zgadzają.

I wtedy robię coś, co powinienem zrobić kilka godzin wcześniej.

Otwieram własny plik konfiguracyjny i go czytam.

Jeden fragment PHP. Kilka godzin. Debil.

W konfiguracji zamiast:

GEMINI_API_KEY=…

wkleiłem:

GEMINI_API_KEY=$geminiKey = …

Tak. Razem z kawałkiem deklaracji zmiennej PHP.

Przecież skopiowałem z pierwszego Zwykolaka XDDD

PHP prawidłowo odczytywał wartość.

cURL prawidłowo ją wysyłał.

Google prawidłowo odrzucał.

Wszystko działało dokładnie tak, jak zostało napisane.

Tylko ja, kurwa, byłem debilem XD

Usunąłem zbędny fragment.

Klik.

Parking przedni: 125 pojazdów.

Boczny A: 19.

Boczny B: 8.

Pierwszy pomiar automatyczny. Zweryfikowałem wynik ręcznie. Na testowanych zdjęciach różnica mieściła się w ±1 samochodzie. Do analizy zajętości parkingu — więcej niż wystarczająco. 

DZIAŁA.

NAJLEPSZA OPTYMALIZACJA: NIE BUDOWAĆ TEGO, CZEGO NIE POTRZEBUJESZ

Najwięcej czasu w tym projekcie nie zaoszczędził PHP.
Nie Gemini.
Nie SQLite.

Zaoszczędziło go jedno pytanie:

„Czy my naprawdę potrzebujemy tego w czasie rzeczywistym?”

Nie.

I nagle YOLO, tracking, RTSP, infrastruktura i pół małej elektrowni przestały być potrzebne. To przyda się w kolejnym projekcie – liczeniu footfall’u.

Trzy zdjęcia.
Multimodalny model.

JSON.
Baza.

Problem solved.

Czasami najlepsza decyzja architektoniczna polega na skasowaniu 80% architektury. XD

 

A teraz o ekspertach AI z LinkedIna

I właśnie przy takich projektach coraz bardziej bawią mnie wszystkie te piękne stanowiska:

AI Automation Manager.

AI Transformation Director.

Chief AI Officer.

Head of Artificial Intelligence Strategy.

Sam zatrudniłem Executive Directora, więc do nazw stanowisk absolutnie nie zamierzam się przypierdalać.

Ale czasami mam z nimi interakcję więc pytam:

Jakiego stacku używacie?

REST czy SDK?

Gdzie zapisujecie dane?

Jak walidujecie JSON?

Jak kontrolujecie koszty tokenów?

Jak rozwiązujecie błędy autoryzacji?

Co robicie, kiedy aplikacja działa lokalnie, a produkcja wywala się na ryj?

Jak sprawdzacie, czy LLM rzeczywiście poprawnie interpretuje dane?

Odpowiedź jest zawsze klasyczna: yyyyyy co?

I ja wiem, że menedżer AI nie musi być seniorem backendowcem.

Ale powinien rozumieć technologię, którą zarządza.

Bo automatyzacja to nie wpisanie promptu do ChatGPT i narysowanie sześciu prostokątów w prezentacji.

To integracje, architektura, dane, bezpieczeństwo, testowanie i utrzymanie.

I całe to upierdliwe gówno, którego nie widać na pięknych demonstracjach.

Tego nie nauczysz się na webinarze „Zostań ekspertem AI w siedem dni”.

Trzeba coś zbudować. Potem coś zepsuć. Potem naprawić.

A czasami przyznać, że kilka godzin debugowałeś własną konfigurację, bo wkleiłeś kawałek PHP do .env. Tak, do .env. Poza repozytorium i poza webrootem, bo bezpieczeństwo aplikacji webowych to podstawa. Szkoda tylko, że czytanie własnego .env najwyraźniej już nie XD

Wiedza jest prawie za darmo. Droga jest egzekucja.

A nasz dyrektor?

Zatrudnienie: bezterminowe.

Wynagrodzenie: zero.

Wydajność: obiecująca.

Frontend: zdecydowanie lepszy, niż wymaga tego zakres obowiązków.

Przełożony: debil od konfiguracji.

Miałem odpocząć po 45 godzinach pracy.

Więc spędziłem kolejne 9 przy kodzie.

Wypoczęty? Dyskusyjne.

Zadowolony? Jak świnia w błocie.

I na wieczór klasycznie – jedno kraftowe, jako podziękowanie dla Boga Piwa.

In CORE We Trust.



Zostaw komentarz

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *