
Przedstawię tu cztery praktyczne sytuacje w których ChatGPT rzeczywiście pomogło mi w programowaniu. Sytuacje będą obejmować różne języki i tematyki, będzie C i wyświetlacz 7-segmentowy, będzie Javascript, trochę HTML, a również Winsock i wysyłanie żądania HTTP. Nie zapomnę też o prostej aplikacji okienkowej WinForms i C#. Ocenię tu jak nowe AI radzi sobie w praktyce. Na koniec dam również kilka ciekawostek i sytuację, gdzie udało mi się zagiąć AI.
Co mam na myśli poprzez "rzeczywiście pomogło"? Mam na myśli sytuację, gdzie ChatGPT przyśpieszyło mi pracę, gdzie jego użycie było szybszym sposobem na otrzymanie rezultatu niż normalne programowanie bądź szukanie w Google.
Pierwsza sytuacja - uzupełnienie cyferek dla wyświetlacza 7 segmentowego
Pisałem sobie sterownik wyświetlacza 7-segmentowego na PIC18F2550 (choć to teraz nie jest ważne), miałem już wpisane w kod cyfry, oczywiście bazując na osobnych definicjach bitów segmentów.
Taki kod:
Code: c
Ten kod tworzy kolejne symbole na wyświetlacz, wedle tego:

(Źródło obrazka: Wikipedia, licencja CC0)

(Źródło obrazka: Wikipedia, licencja CC0)
Chciałem go uzupełnić o symbole od A do F (czyli by móc wyświetlać szesnastkowo). Poprosiłem o to AI, oto rozmowa:
Leniwy Programista wrote:
Those are #define for C code with 7 segment display. Please add missing defines for SYMBOLS A, B, C, D, E and F.
#define SYMBOL_0 SEGMENT_A | SEGMENT_B | SEGMENT_C | SEGMENT_D | SEGMENT_E | SEGMENT_F
#define SYMBOL_1 SEGMENT_B | SEGMENT_C
#define SYMBOL_2 SEGMENT_A | SEGMENT_B | SEGMENT_D | SEGMENT_E | SEGMENT_G
#define SYMBOL_3 SEGMENT_A | SEGMENT_B | SEGMENT_C | SEGMENT_D | SEGMENT_G
#define SYMBOL_4 SEGMENT_B | SEGMENT_C | SEGMENT_F | SEGMENT_G
#define SYMBOL_5 SEGMENT_A | SEGMENT_C | SEGMENT_D | SEGMENT_F | SEGMENT_G
#define SYMBOL_6 SEGMENT_A | SEGMENT_C | SEGMENT_D | SEGMENT_E | SEGMENT_F | SEGMENT_G
#define SYMBOL_7 SEGMENT_A | SEGMENT_B | SEGMENT_C
#define SYMBOL_8 SEGMENT_A | SEGMENT_B | SEGMENT_C | SEGMENT_D | SEGMENT_E | SEGMENT_F | SEGMENT_G
#define SYMBOL_9 SEGMENT_A | SEGMENT_B | SEGMENT_C | SEGMENT_D | SEGMENT_F | SEGMENT_G
ChatGPT wrote:
#define SYMBOL_A SEGMENT_A | SEGMENT_B | SEGMENT_C | SEGMENT_E | SEGMENT_F | SEGMENT_G
#define SYMBOL_B SEGMENT_C | SEGMENT_D | SEGMENT_E | SEGMENT_F | SEGMENT_G
#define SYMBOL_C SEGMENT_A | SEGMENT_D | SEGMENT_E | SEGMENT_F
#define SYMBOL_D SEGMENT_B | SEGMENT_C | SEGMENT_D | SEGMENT_E | SEGMENT_G
#define SYMBOL_E SEGMENT_A | SEGMENT_D | SEGMENT_E | SEGMENT_F | SEGMENT_G
#define SYMBOL_F SEGMENT_A | SEGMENT_E | SEGMENT_F | SEGMENT_G
Leniwy Programista wrote:
Add missing entries to this array:
int g_symbols[] = { SYMBOL_0, SYMBOL_1, SYMBOL_2, SYMBOL_3, SYMBOL_4,
SYMBOL_5, SYMBOL_6, SYMBOL_7, SYMBOL_8, SYMBOL_9
};
ChatGPT wrote:
int g_symbols[] = { SYMBOL_0, SYMBOL_1, SYMBOL_2, SYMBOL_3, SYMBOL_4,
SYMBOL_5, SYMBOL_6, SYMBOL_7, SYMBOL_8, SYMBOL_9,
SYMBOL_A, SYMBOL_B, SYMBOL_C, SYMBOL_D, SYMBOL_E, SYMBOL_F
};
Wpisałem to do swojego kodu na PIC18F2550, dodałem na sztywno tablicę do wyświetlania:
Code: c
i otrzymałem:

Działa!
AI było w stanie zrozumieć co mam na myśli i samodzielnie uzupełnić sensownie tablicę o kody znaków, których mu sam nie podawałem.
Druga sytuacja - cenzurowanie zrzutów ekranu do artykułów o IoT
Od jakiegoś czasu prowadzę na dużą skalę projekt OpenBeken oraz listę wnętrz urządzeń IoT, co wiąże się też zrobieniem zrzutów ekranu z mojego telefonu. Czasem w rogu ekranu mam czułe dane, np. logo sieci komórkowej, które chciałbym usunąć przed publikowaniem obrazów.
Uznałem, że poproszę AI o napisanie mi kodu do programu WinForms z możliwością zrobienia "drag and drop" pliku PNG na niego tak, by mi ocenzurował sam róg obrazka. Czy AI da radę?
Leniwy Programista wrote:
Write a simple C# forms application that allows drag and drop of image file, and when the image is dropped, it censors the top left corner of the image with black rect and saves it to the same image file.
ChatGPT wrote:
Certainly! Here is an example of a simple C# Windows Forms application that allows you to drag and drop an image file onto the form, censors the top left corner of the image with a black rectangle, and then saves the modified image to the same file:Code: csharp
This code assumes that you have a form with the default name Form1, and that you have imported the System.Drawing and System.Windows.Forms namespaces.
To use this code, simply compile and run the application, and then drag and drop an image file onto the form. The top left corner of the image will be censored with a black rectangle, and the modified image will be saved to the same file.
Tu był mały problem. Nie działał zapis, bo nie można zapisać do pliku który ma się otwarty. Czy AI będzie w stanie to naprawić?
Leniwy Programista wrote:
Can you modify the Form1_DragDrop to save image to another file, named like the source file but with "_cropped" suffix and correct image extension?
ChatGPT wrote:
Sure! Here's the updated Form1_DragDrop method that saves the censored image to a new file with the same name as the source file, but with a "_cropped" suffix and the correct image extension:Code: csharp
This code uses the Path class to construct the path of the new file by changing the extension of the source file to a null string, appending "_cropped", and then adding the original extension back to the file name. The modified image is then saved to this new file using the image.Save method.
AI ogarnęło nawet, że musi najpierw uciąć stare rozszerzenie, potem dodać "cropped" sufiks, a potem dołożyć rozszerzenie. Nieźle!
Dla weryfikacji - tak wygląda screen po zrobieniu "drag and drop" na skompilowany kod (z dodaną domyślną formą WinForms w Visualu), jeszcze poprawiłem wymiary cenzurowanego rożka:

Jeszcze brakuje jednego.. możliwości drag and drop wielu plików na raz.
Leniwy Programista wrote:
Please change code to handle dropping multiple images together.
ChatGPT wrote:
Here's an updated version of the Form1_DragDrop method that handles dropping multiple images together:Code: csharp
This code uses a foreach loop to iterate through each file in the filePaths array, and censors and saves each image file separately.
Działa. Nawet nie musiałem pisać konkretnie co ma zrobić (nie pisałem nic w stylu "iterate all entries from filePaths"...)
Trzecia sytuacja - Winsock, HTTP i komendy Tasmoty
Otwarte firmware dla urządzeń IoT, Tasmota (jak i OpenBeken), pozwala na sterowanie przekaźnikiem poprzez żądanie HTTP GET, takie jak w przeglądarce. Wymaga to podania komendy POWER TOGGLE (lub ON, lub OFF) w parametrze GET o nazwie cmnd, adres zasobu na serwerze to cm. Czy AI o tym wie?
Potrzebowałem programu który by wysyłał takie 'przełączenie przekaźnika' do mojego 'smart' włącznika co około 2 sekundy, by potestować jego działanie
Leniwy Programista wrote:
Write a C winsock code that sends a POWER TOGGLE command to Tasmota device with address 192.168.0.159 every 2.5 seconds.
ChatGPT wrote:
Here is a basic C code that uses Winsock to send the "POWER TOGGLE" command to a Tasmota device at IP address 192.168.0.159 every 2.5 seconds:Code: c
Czy kod działa?
Skompilowało się za pierwszym razem...
Wybaczcie starą wersję Visuala, lubię ją, bardzo jest lekka i przyjemna i przypomina mi dzieciństwo.

Działa raz a potem wyłącza się z błędem 0x01.
Czy wiecie czemu?
Odpowiedź w spoilerze.
Spoiler:
Tasmota zamyka socket po żądaniu a AI wzięło w pętle tylko wysyłanie, bez connect... więc drugie send się nie powodzi.
Tasmota zamyka socket po żądaniu a AI wzięło w pętle tylko wysyłanie, bez connect... więc drugie send się nie powodzi.
Nie chciałem bawić się w podchody, więc poprosiłem wprost:
Leniwy Programista wrote:
Please include the whole connection code into the loop.
ChatGPT wrote:
Here is an updated version of the code, with the entire connection code included in the loop to send the "POWER TOGGLE" command every 2.5 seconds:Code: c
Note: This code has not been tested and is for illustration purposes only. You may need to modify it to meet your specific requirements.
No tak, ale teraz zbędnie inicjuje i czyści Winsocka wiele razy... jednakże starczy, kod działa, bądźmy łagodni.
AI samo nawet wie, że chodzi o "cmnd" i nie musiałem tego podawać!
Czwarta sytuacja - JSON, Javascript i statystyka
Jak już wspominałem, od jakiegoś czasu tworzę listę wnętrz urządzeń IoT, którą można zobaczyć tutaj:
https://openbekeniot.github.io/webapp/devicesList.html
Lista ta pobiera się z pliku JSON, dostępnego tutaj:
https://openbekeniot.github.io/webapp/devices.json
Urządzenia IoT mają różne moduły WiFi, np WB2S, TYWE3S... chciałem utworzyć z tego statystykę, jaki moduł jak często występuje.
Leniwy Programista wrote:
Write a simple HTML document with javascript code that fetches JSON file https://openbekeniot.github.io/webapp/devices.json and then iterates all entries from "devices" table and creates statistic how frequently each value of "board" field appears.
ChatGPT wrote:
Here's a simple HTML document with JavaScript code that fetches a JSON file and creates a statistic of how frequently each value of the "board" field appears:Code: html
AI jest w stanie nawet rozumieć słowo pisane i przełożyć je na struktury danych w kodzie.
Czy to zadziała? Zapisałem jako HTML i...

Działa! Ale brakuje sortowania. To trzeba poprawić. Też brakuje tabelki...
Leniwy Programista wrote:
Please sort the statistics before showing in a descending manner.
ChatGPT wrote:
Sure! Here's an updated version of the code that sorts the statistics in descending order before displaying:Code: html
To działa!

Skomplikujmy sprawę. Załóżmy, że chcę tabelkę z zielonymi brzegami.
Leniwy Programista wrote:
Please display results in a table that has a thick green border.
ChatGPT wrote:
Here's an updated version of the code that displays the results in a table with a thick green border:Code: html
Nie o to mi chodziło, ale to moja wina...

"table border" jest w css, a oczekujemy też border dla th i td... dajmy drugą szansę AI.
Leniwy Programista wrote:
Please change border to be thin and yellow and make sure to include border for each table header and cell.
ChatGPT wrote:
Here's an updated version of the code that changes the border to be thin and yellow and includes a border for each table header and cell:Code: html
Jest o wiele lepiej, tylko ja źle dobrałem kolor i ledwo co widać:

Pora wejść na wyższy poziom. Czy AI zna Bootstrapa?
Leniwy Programista wrote:
Please remove current style from the table and just use default bootstrap style to make that table nice and readable.
ChatGPT wrote:
Here's an updated version of the code that removes the custom styles from the table and uses the default Bootstrap styles to make the table nice and readable:Code: html
Średni efekt:

To może mu napiszę co poprawić...
Leniwy Programista wrote:
Please make every second row background different.
ChatGPT wrote:
Here's an updated version of the code that makes every second row's background different using Bootstrap classes:Code: html
Jest lepiej.

A czy AI wie czym jest SPA (Single Page Application)?
Leniwy Programista wrote:
Change this page to SPA and add a simple button that allows you to refresh the table (redownload whole json)
ChatGPT wrote:
Here's an updated version of the code that changes the page to a single-page application (SPA) and adds a button that allows you to refresh the table by redownloading the JSON:Code: html
Nieźle.

Odświeżanie przyciskiem rzeczywiście działa. AI nawet pamiętało, by wcześniej raz samodzielnie odświeżyć tabelkę (pierwsze jej załadowanie po otwarciu strony).
AI zna nawet koncept Single Page Application i potrafi go zastosować w praktyce.
Przykład gdzie AI mi pomieszało, ale jednak miało rację?
Innym razem pisałem przetwarzanie logu z GPS, gdzie dane nawigacji były w standardzie NMEA. Tam jest ten dziwny zapis szerokości i długości geograficznej, którego z pamięci na pewno nie ogarnę, a mój stary kod był akurat na niedostępnym dla mnie serwerze. Postanowiłem zapytać AI o gotowca.
Leniwy Programista wrote:
Write a code that converts NMEA coordinate string to lat and long in double format
ChatGPT wrote:
Sure! Here is some sample code that converts a NMEA coordinate string to latitude and longitude in double format:Code: python
To use this function, pass it a NMEA coordinate string as an argument. The function will return a tuple containing the latitude and longitude in double format.
For example:Code: python
No tak, ale nie chciałem tego w Pythonie... czy można prosić o C#?
Leniwy Programista wrote:
Can you write this code in C#?
ChatGPT wrote:
Sure! Here is the same code written in C#:Code: csharp
Niestety u mnie ten kod się nie sprawdził. Pliki GPS które ja dostałem nie mają zapisu longitude z trzema cyframi na początku, tylko z dwoma.
Szerokości geograficzne mogą być od 0 do 90, a długości od 0 do 180, więc niby oczywiste, że longitude powinno mieć maksymalnie trzy cyfry z przodu (albo zawsze trzy cyfry, jeśli dodajemy zera jako padding).
Niby w specyfikacji też widzę, że są trzy cyfry:

Ale u mnie wygląda to tak:
$GPGGA,113622.098,5348.8058,N,1515.5893,E,1,0,,,M,,M,,*4E"
Tutaj w latString mamy:
5348.8058
W lonString mamy:
1515.5893
A chcemy uzyskać koordynat 53.81343 15.259821666666667 (Płoty).
Kod z Substring(3) nie zadziała.
Myślałem, że może moje dane mają niepoprawny format? Ale narzędzia z sieci i GPS Viewer je obsługują:

Podejrzewam, że wspierany jest i taki i taki zapis (albo trzeba policzyć ilość cyfr przed kropką) a AI sobie radośnie założyło, że u mnie Substring(3,0) zadziała, ale jednak nie!
Ostatecznie użyłem:
Code: csharp
I do mojego mini zastosowania to się sprawdziło, ale na produkcję bym tego nie dał. Powyższe podejście jest niezgodne ze standardem NMEA i beztrosko zakłada, że długość geograficzna ma 2 cyfry, wycinając sporą część świata. Na szczęście miałem przetworzyć tylko ślady GPS z Polski, z jednego konkretnego urządzenia i to wystarczyło.
Tylko czy można tu winić AI? Może tu raczej zadziałała sytuacja GIGO, czyli Garbage In, Garbage Out. Wina niestandardowego formatu danych, którego ja dostałem? Źródła twierdzą zdecydowanie, że wersja z trzema cyframi longitude jest poprawna.
Najlepszym rozwiązaniem byłoby po prostu sprawdzanie gdzie jest kropka i wyłuskanie ze stringu minut/stopni na tej podstawie. Wtedy wszystkie sytuacje byłoby obsłużone. AI tego nie zrobiło.
Chwila, moment... przecież mogę o to poprosić wprost AI!
Leniwy Programista wrote:
Can you alter the code to also handle case where longitude has two major digits?
ChatGPT wrote:
Sure, here's the updated code that can handle longitude strings with either three or two major digits:Code: csharp
Nie jest źle, chociaż rozwiązanie z bazowaniem na pozycji kropki byłoby bardziej uniwersalne.
Przykład z życia wzięty, gdzie udało mi się zagiąć AI
Te AI jest bardzo zdolnym programistą, ale czy radzi sobie w sprawach życia codziennego? Sprawdźmy!
Zapytałem najpierw o datę urodzenia danej osoby (1949), a potem dwukrotnie o jej potencjalny wiek, najpierw w roku 2049, a potem 2249. Czy AI potrafi odjąć 1949 od 2249?

Czyli AI umie zrobić 2049 - 1949 ale już 2249 - 1949 nie?
Nie do końca....
To AI uczyło się po prostu na tekście, ono nie "liczy" i nie "rozumie" treści, po prostu składa do siebie słowa na bazie lokalnego "dopasowania" ich, bezwiednie, tak jak puzzle, dlatego nie umie podać potencjalnego wieku osoby po 200 latach bo takich przykładów nie było w literaturze...
Ta odpowiedź AI tutaj jest taka piękna, polityczna i bardzo ładnie ukazuje to, że ChatGPT jest po prostu głupiomądry.
Podsumowanie
Chyba pora zwalniać asystentkę, albo oddelegować ją w pełni do sklejania filmów dla Elektroda.com. Te AI pisze proste programy na dość dobrym poziomie. Znam wiele osób, które chciałoby tak programować. ChatGPT moim zdaniem nadaje się na asystenta programisty. Rzeczywiście jest w stanie pomóc i oszczędzić czas, choć trzeba go używać z głową.
Teraz pojawia się tylko pytanie, czy to dobrze?
Ocenę tego już pozostawię Wam - choć ja jestem dość krytyczny. Większość krytyki zostawię dla siebie, ale naprawdę trudno jest mi powstrzymać m. in. wizję tych setek ukrytych błędów i niezgodności w kodach na skutek programistów bezwiednie posługujących się AI i tworzących kody bez ich rzeczywistego rozumienia...
Czy podoba się Wam taka forma prezentacji dzieła OpenAI? Dajcie znać, który fragment kodu napisanego przez AI zrobił na Was największe wrażenie.
Cool? Ranking DIY