Teškoća s Linuxom i X11 (display serverom) leži u nedostatku dovoljne dostupne online dokumentacije. Kada razmišljamo o Linuxu, prvo što padne na pamet laicima je terminal. No, Linux je mnogo više od terminala. Ono što osobno cijenim kod Linuxa je mogućnost “headless instalacije”. To znači da možemo imati operativni sustav bez desktop sučelja. Tako OS pokrećemo isključivo u terminalnom načinu rada, a udesktop ulazimo naredbom “startx”. S X11 dolaze određeni sigurnosni izazovi, ali možemo jednostavno napustiti X11 i vratiti se u terminal. Na primjer, kada želimo ažurirati operativni sustav, napuštamo X11 ili ga ponovno pokrećemo te obavljamo ažuriranje putem terminala.
AI asistent umjesto dokumentacije
Na sreću, danas imamo obilje novih tehnologija koje nam mogu pružiti podršku. Još bolje, terminal predstavlja tekstualno input/output sučelje, slično sučeljima modernih AI asistenata. To znači da možemo postavljati AI-u pitanja vezana uz bash naredbe, a ako nešto nije ispravno, brzo možemo kopirati/lijepiti rezultate u AI asistenta. Nakon toga dobivamo objašnjenje ili ispravljenu naredbu.
Često razmišljam o tome kako bi bilo da se stvori Linux računalo koje bi bilo izravno povezano s AI asistentom, omogućujući mu čitanje logova, istraživanje raspona IP adresa te doslovno življenje unutar mreže. U stvarnom vremenu bi pratio IP adrese koje se povezuju, prilagođavao firewall i obavljao slične zadatke.
AI kao pomagalo pri učenju C jezika
Nakon instalacije Linuxa, želite isprobati programiranje u C jeziku. Ranije, morali ste trošiti sate tražeći informacije i gledajući videe, često bez značajnog napretka. C jezik se izvrsno kombinira s AIasistentom zbog KISS principa, odnosno “keep it small and simple” (sve malo i jednostavno). To znači da možemo postupno raditi, korak po korak, uz podršku AI asistenta, olakšavajući proces učenja funkcija po funkcija.
Prvo instaliramo osnovne pakete:
sudo apt update sudo apt install build-essential
Zatim, u besplatnom ChatGPT v3.5:
I'm using Ubuntu how do I compile C hello world program?
Dobijemo da napravimo hello.c datoteku sa sadržajem:
#include <stdio.h> int main() { printf("Hello, World!\n"); return 0; }
i da nakon toga u terminalu upišemo:
🚀 gcc -o hello hello.c
I imamo exec datoteku hello:
🚀 ./hello Hello, World!
![](https://jezgra.online/wp-content/uploads/2024/01/Screenshot-from-2024-01-19-20-18-49.png)
Ok, ‘aj malo naprednije, napravi mi jednostavni uređivač teksta:
"can you make me simple text writing app in linux terminal using c"
Kao odgovor sam dobio C kod koji kompajliramo isto kao i prošli:
include <stdio.h> #include <stdlib.h> int main() { char filename[100], text[1000]; printf("Enter a filename to save your text: "); scanf("%s", filename); FILE *file = fopen(filename, "w"); if (file == NULL) { printf("Error opening file!\n"); exit(1); } printf("Write your text (press CTRL+D to save and exit):\n"); while (fgets(text, sizeof(text), stdin) != NULL) { fputs(text, file); } fclose(file); return 0; }
![](https://jezgra.online/wp-content/uploads/2024/01/Screenshot-from-2024-01-19-20-48-25.png)
Osobno kao test AI sposobnosti koristim prompt: “Create me simple X11 paint app and show me how to compile it”. ChatGPT v3.5 nije uspio ali sam zato u v4 dobio kod koji radi:
/* COMPILE: sudo apt-get install libx11-dev #if missing gcc -o paint_app app.c -lX11 ./paint_app */ #include <X11/Xlib.h> int main() { Display *dpy; Window root, win; GC gc; XEvent ev; int x_prev = 0, y_prev = 0; int x_cur, y_cur; dpy = XOpenDisplay(NULL); root = DefaultRootWindow(dpy); win = XCreateSimpleWindow(dpy, root, 0, 0, 640, 480, 0, 0, WhitePixel(dpy, 0)); XSelectInput(dpy, win, ExposureMask | ButtonPressMask | ButtonReleaseMask | PointerMotionMask); XMapWindow(dpy, win); gc = XCreateGC(dpy, win, 0, NULL); while (1) { XNextEvent(dpy, &ev); switch (ev.type) { case Expose: XSetForeground(dpy, gc, WhitePixel(dpy, 0)); XFillRectangle(dpy, win, gc, 0, 0, 640, 480); XSetForeground(dpy, gc, BlackPixel(dpy, 0)); break; case ButtonPress: x_prev = ev.xbutton.x; y_prev = ev.xbutton.y; break; case MotionNotify: x_cur = ev.xmotion.x; y_cur = ev.xmotion.y; if (ev.xmotion.state & Button1Mask) { XDrawLine(dpy, win, gc, x_prev, y_prev, x_cur, y_cur); } x_prev = x_cur; y_prev = y_cur; break; } } XFreeGC(dpy, gc); XDestroyWindow(dpy, win); XCloseDisplay(dpy); return 0; }
![](https://jezgra.online/wp-content/uploads/2024/01/Screenshot-from-2024-01-19-21-17-19.png)
Bash mi to treba
Prompt: if i have multiple c files can you show me example on how to compile that in single bash script
Ovo je Bash skripta koja obavlja kompilaciju nekoliko C datoteka. Ova skripta pojednostavljuje proces kompilacije više C datoteka, prateći svaku izvornu datoteku i stvarajući odgovarajuću izvršnu datoteku bez “.c” ekstenzije.
#!/bin/bash # List of C source files files=("file1.c" "file2.c") # Compile each C file for file in "${files[@]}"; do output_name="${file%.c}" # Remove the '.c' extension gcc -o "$output_name" "$file" done
Prompt: can you write me bash script that will rename all files in current dir and add current date at end of each file
Ovo je Bash skripta koja mijenja imena svih datoteka u trenutačnom direktoriju dodajući trenutačni datum na kraj svakog imena datoteke.
#!/bin/bash # Get the current date in the format YYYYMMDD current_date=$(date +"%Y%m%d") # Iterate through each file in the current directory for file in *; do # Check if it's a regular file if [ -f "$file" ]; then # Extract the file extension (if any) extension="${file##*.}" # Remove the extension from the original filename filename_no_ext="${file%.*}" # Append the current date and the original extension (if any) new_filename="${filename_no_ext}_${current_date}.${extension}" # Rename the file mv "$file" "$new_filename" echo "Renamed: $file to $new_filename" fi done
Funkcije
Sada imamo sposobnost kreiranja funkcija postupno za naš projekt. Na primjer, za početak možemo definirati funkciju koja omogućava učitavanje teksta iz dokumenta:
#include <stdio.h> #include <stdlib.h> char *loadFileToString(const char *filePath) { FILE *file = fopen(filePath, "r"); if (file == NULL) { fprintf(stderr, "Error opening file: %s\n", filePath); return NULL; } // Determine the size of the file fseek(file, 0, SEEK_END); long fileSize = ftell(file); fseek(file, 0, SEEK_SET); // Allocate memory for the file content char *fileContent = (char *)malloc(fileSize + 1); // +1 for null-terminator if (fileContent == NULL) { fclose(file); fprintf(stderr, "Memory allocation failed.\n"); return NULL; } // Read the file content into the allocated memory size_t bytesRead = fread(fileContent, 1, fileSize, file); fileContent[bytesRead] = '\0'; // Null-terminate the string fclose(file); return fileContent; } int main() { const char *filePath = "./demo.txt"; // Replace with your file path char *fileContent = loadFileToString(filePath); if (fileContent != NULL) { // Print the loaded content printf("%s", fileContent); // Remember to free the allocated memory when done free(fileContent); } return 0; }
Sve što nam nije jasno pitamo AI, zamolimo ga da nam napiše funkcije i kako da organiziramo cijeli projekt.