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!

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;
}

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;
}


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.