[ pover @ 28.02.2026. 09:22 ] @
Program je nastao iz čisto artističkih pobuda, pa rekoh da ne postoji bolje mesto za njegovo objavljivanje od "Art of programming".

Citat:
Kako aplikacija radi?

Program na svakih 10 minuta proverava da li se Vaše objave nalaze na sajtu. Ukoliko se ne nalaze program ih objavljuje. Da bi funkcionisao potrebno je da napravite nekoliko jednostavnih podešavanja.
...



Program je pisan na jeziku go, a kompletan kod je dostupan na Githabu:

https://github.com/borasonar/es
[ MajorFatal @ 28.02.2026. 19:20 ] @
Ne bih to nazvao Program za objavljivanje poruka na emz, na emz se poruke objavljuju kao i na drugim delovima foruma, kroz engine samog foruma.

Možda Program za ponovljeno objavljivanje poruka?
[ pover @ 28.02.2026. 19:48 ] @
Ako za postID parametar uneseš znak pitanja onda program šalje "endžinu foruma" novu poruku. Nakon što forum prikaže poruku, program čita postID i upisuje u konfiguracioni fajl. Objavljivanje se automatski ponavlja samo u slučaju da se poruka nekim slučajem izgubi. Dešavalo se više puta da "endžin" pogreši, pa je zato tu program da ispravi grešku.
[ MajorFatal @ 28.02.2026. 20:44 ] @
Oće endžin da pogreši jednom, al neće sto puta ...

A na koji način se sprečavaju zloupotrebe?
Na forumu je strogo zabranjeno psovanje, vređanje sagovornika, verske i političke teme. Šta ako neko napiše ku*rac, pi*čka, go*vno, si*sa, bog, liberali, demokrate ... moderator ima sva prava da izbriše takvu poruku.
I onda neko ko ima tvoj program može da ponavlja takvu poruku više puta, ako utvrdi da je izbrisana?
[ pover @ 28.02.2026. 21:03 ] @
Moderator je ovde u ogromnoj prednosti. Ako ne ume da se odbrani i to na forumu koji se zove Elite Security, onda treba razmisliti o promeni moderatora ili promeni imena foruma, a imam ja i verziju programa za moderatore :) Program je sličan kao program za objavljivanje poruka na EMZ, samo što umesto da objavi poruku, on je briše. Predložio sam Gojku da zameni moderatore sa AI, pa ćemo videti šta će biti sa tim.
[ MajorFatal @ 28.02.2026. 21:12 ] @
Hm .. pa i to već ima što bi rekli .. ja sam primere ružnih reči koje bi mogle da se tumače kao psovke ispisao sa zvezdicama između nekih slova, jer endžin ne bi dozvolio da ih ispišem u poruci, tad stigne poruka: Upotrebili ste ružnu reč "tu i tu" koja nije dozvoljena na forumu, morate da izmenite ili odustanete od slanja poruke .. šta će tvoj program da briše, ako ne to?
[ pover @ 28.02.2026. 21:24 ] @
Brisao bi to što je ponavljano više puta, kompletne poruke. Ono što bi korisnička verzija programa pisala, moderatorska verzija bi brisala.
Sam si napisao da program može da ponavlja "takvu poruku" više puta.

Citat:
I onda neko ko ima tvoj program može da ponavlja takvu poruku više puta, ako utvrdi da je izbrisana?


Ako misliš da bi moj program mogao da objavi tekst koji sadrži reči koje se filtriraju, ne bi mogao. Program komunicira na isti način sa veb serverom kao i brauzer koji ti sada koristiš za pristup forumu.

[ MajorFatal @ 28.02.2026. 21:55 ] @
E tako već bolje ..
[ svojnasvome @ 01.03.2026. 01:02 ] @
Citat:
pover

Ako misliš da bi moj program mogao da objavi tekst

Zašto kažeš "moj program" kad si na github kao autore naveo 4 jahača apokalipse:
Citat:
Everovic, Zurg, Buzzlightyear i ja (Bora Sonar)

Pored toga na github si, pardon ste napisali "potforum" a kao vrstan poznavaoc jezika znaš da to treba napisati kako treba.

Mene interesuje kako da taj program pokrenemo mi kojima se gadi sve što je veštačko makar to bila i inteligencija.
U programiranje se razumem koliko i kokoška u kljucanje.

Pa da li bi mogao da objasniš malo detaljnije, šta, kako itsl.
Da li se taj program pokreće gledanjem u njega ili treba podviknuti? Da li je potrebna instalacija i šta instalirati? Koja verzija windows/linux/android? Koliko kilotona memorije, koliko jezgara procesora...


To jedno a drugo.
Ko nam garantuje da ti nisi stavio neku bubu špijunku u tu tvoju inteligentnu limariju?
Možda hoćeš da nam pokupiš NFT-ove?
U brauzeru blokiram JavaScript i malo sutra ćeš da rudariš Bitcoin.
Jel može i taj tvoj, pardon, vaš program da se spreči rudarenje? A ako ne može koliku taksu zaračunavate? 5%, 10%?

[ pover @ 01.03.2026. 09:16 ] @
Pokušaću da odgovorim na tehnička pitanja, ostalo možemo na EMZ ili meljom ([email protected]). Trudim se da pišem ozbiljno u ES delu foruma.

Program se pokreće kao većina drugih programa, dvostrukim klikom mišem iz grafičkog interfejsa ili kucanjem imena programa iz konzole. Program nema veze sa AI tehnologijom. Mogao bi da se nadogradi tako da umesto ponavljanja obrisanih poruka širi AI slop po forumu, ali mislim da to ne bi bilo lepo.

Najbolja garancija da nema "bube špijunke" je izvorni kod. Bilo ko može da pročita kod i sam se uveri da ne sadrži ništa maliciozno. Objavio sam i izvršne fajlove za Linux i Windows sisteme (https://github.com/borasonar/es/releases/tag/es-0.1), ali tu bi morao da mi veruješ na reč da je to stvarno program dobijen kompajliranjem objavljenog izvornog koda. (Ako isprobavaš program povedi računa da ne objaviš primere poruka)

S obzirom da je program pisan na golangu, kompajliranje je izuzetno jednostavno. Jedan od ciljeva originalnog tima koji je razvio go je bila jednostavna kompilacija. Uputstvo za instalaciju je dostupno na adresi https://go.dev/doc/install. Treba samo da otpakuješ zip fajl i podesiš PATH varijablu i spreman si za go (na *nix sistemima), a za Windows postoji instalacioni msi fajl. Da bi kompajirao program treba da uđeš u direktorijum sa izvornim kodom i ukucaš go build i nakon par trenutaka dobijaš statički linkovan izvršni fajl.

Program je intezivno testiran na Linuxu, a trebalo bi da radi i na većini sistema koje podržava go kompajler. Go je dobar jezik, ali ono što me oduševljava su alati i jednostavnost celog sistema. Na primer za kros kompajliranje nije potrebna nikakva dodatna instalacija, dovoljno je navesti GOOS i GOARCH parametre i dobijate izvršni program sa ugrađenim svim zavisnostima za traženi operativni sistem i hardversku arhitekturu.

Program ne izvršava java skript i nema nikakve veze sa rudarenjem (što se može proveriti u izvornom kodu).

[ mjanjic @ 01.03.2026. 13:24 ] @
Citat:
pover:
Moderator je ovde u ogromnoj prednosti. Ako ne ume da se odbrani i to na forumu koji se zove Elite Security, onda treba razmisliti o promeni moderatora ili promeni imena foruma, a imam ja i verziju programa za moderatore :) Program je sličan kao program za objavljivanje poruka na EMZ, samo što umesto da objavi poruku, on je briše. Predložio sam Gojku da zameni moderatore sa AI, pa ćemo videti šta će biti sa tim.

A što predlažeš Gojku da uvede AI moderaciju, napravi svoj forum i pozovi javnost na "izazov" da pokuša da prevari tvog AI moderatora. Mnogi kojima to pođe za rukom će se radovati, eto "prevarili smo tog "pametnog AI moderatora", a u stvari taj proces koristiš za dodatno treniranje AI moderatora. Onda to privuče investitore, pa ulože novac i... jednog dana taj tvoj AI moderator bude dominantan na tržištu ;)
[ pover @ 01.03.2026. 13:33 ] @
Ok pitanje, ali za temu https://www.elitesecurity.org/...i-kompletno-AI-moderisan-forum.

Mask je platio milijarde za sajt, koji je par ljudi moglo da napravi za mnogo manje novca. Nije on platio za softver, intelektualnu svojinu ili tim, već je kupio korisnike. Tako je i ovde, gde bih ja našao korisnike i moderatore? ES ih već ima i ima višedecenijsku tradiciju i veliku količinu sadržaja. Ako Gojko ne bude bio zainteresovan, možda bismo mogli ti i ja da krenemo u realizaciju foruma od nule? Veliki je to posao samo za jednog čoveka.
[ svojnasvome @ 02.03.2026. 04:40 ] @
Šta se dogadja u situacijama kad poruka nije obrisana ali je izmenjena?

Na primer originalna poruka je "2+2=4" a moderator je prepravi na "2+2=5".

Poruka koja se izmeni u roku 10 minuta od objave nema upozorenje da je menjana a broj znakova je isti.

Ako se poruka izmeni nakon 10 minuta ima upozorenje ali ako je izmeni onaj ko je poruku objavio kako aplikacija reaguje na takve situacije?

[ pover @ 02.03.2026. 08:40 ] @
Funkcija isPostOk određuje da li treba ponoviti poruku.

Ukratko, ako poruka sadrži tekst "Ovu poruku je menjao <user>" i ako se <user> razlikuje od autora poruke, onda se poruka ponavlja.
Ako originalni autor promeni poruku u roku od 10 minuta, poruka neće biti ponovljena, što je dobro.
Ne znam šta se dešava ako moderator promeni poruku u roku od 10 minuta. Pretpostavljam da bi to bio problem za program, jer ako nije dodat tekst "Ovu poruku je menjao...", onda promena neće biti detektovana i poruka neće biti ponovljena.
Ovo bi moglo da se reši upoređivanjem izvorne poruke i poruke na sajtu, s tim da bi trebalo i sa sajta učitati originalnu poruku (koja umesto html tagova sadrži bb kodove) ili pre poređenja stripovati sve tagove...

Detaljnije:

Code:

func isPostOk(c *http.Client, postId string, allowedUser string) (bool, error) {
    post, err := getPost(c, postId)
    if err != nil {
        return false, err
    }
    if post == nil {
        return false, nil
    }
    //proveri da li je post menjao neko drugi
    for _, node := range htmlquery.Find(post, "./sub/b/text()") {
        sub := htmlquery.InnerText(node)
        r := regexp.MustCompile("^Ovu poruku je menjao (?P<user>.+) dana")
        m := r.FindStringSubmatch(sub)
        if m != nil {
            i := r.SubexpIndex("user")
            changedBy := m[i]
            if changedBy != allowedUser {
                return false, nil
            }
        }
    }
    return true, nil
}


Prvo pozivom getPost se pokušava učitavanje poruke. Ako getPost vrati nil, to znači da je poruka izbrisana i funkcija vraća false, što znači da će poruka biti ponovljena.

Code:
post, err := getPost(c, postId)


Ako je poruka učitana, onda se koristi XPath kako bi se napravio niz elemenata sa tekstom obuhvaćenim <sub><b>...</sub></b>

Code:
for _, node := range htmlquery.Find(post, "./sub/b/text()") {


Za svaki nađeni tekst pokreće se regularni izraz koji izvlači korisnika koji je promenio tekst.

Code:
r := regexp.MustCompile("^Ovu poruku je menjao (?P<user>.+) dana")


Ako se dobijeni korisnik razlikuje od originalnog autora, to znači da post nije ok i da ga treba ponoviti

Code:
if changedBy != allowedUser ...

[ svojnasvome @ 06.03.2026. 22:20 ] @
Evo još pitanja:

Pretpostavimo da sva četvorica koristieći tu aplikaciju upišete isti postID u konfiguracion fajl. To je realan scenario jer je za očekivati da vi medjusobno štitite vaše poruke. A može se desiti da se nekom članu vaše poruke dopadnu i da taj počne da štiti vaše poruke. Ili vi da štitite poruke nekog drugog člana.

U jednom momentu moderator izbriše poruku.

Različite instance aplikacije (vaše ili drugih članova) uoče da poruke nema i pokrenu postupak ponovnog objavljivanja poruke.
Svaka od te 4 nove objave će dobiti drugi postID.
Na forumu postoje 4 identične poruke a aplikacija ih ne prepoznaje kao istovetne jer imaju različite postID.

Pored toga, ako se primena aplikacije omasovi i više članova aktivira aplikaciju tada je realno za očekivati da broj istih poruka raste u beskonačnost.

Još gore, ako N članova obnavlja poruke onda sa svakom generacijom obrisanih poruka potencijalno dolazi NxN novih poruka sa istim sadržajem.

Naravno, vama je cilj da se primena aplikacije omasovi ali to vodi u potencijalnu opasnost overflova foruma i bićete optuženi za sajber kriminal, a možda i osudjeni.

Šta u takvim situacijama?

[ pover @ 07.03.2026. 07:07 ] @
Nisam siguran na koju četvoricu misliš, ali ako misliš na naloge Everovic, Zurg, Buzzlightyear i Bora Sonar, oni su već osuđeni na doživotnu deaktivaciju. Na osnovu presedana u slučaju Darko Nedeljković/pctel ustanovljeno je da svaki nalog predstavlja posebnu ličnost, tako da sam smatrao da bi bilo fer da navedem ove svoje naloge kao autore programa.

Mislim da bi objavljivanjem tuđih poruka pod imenom svog naloga povredio autorska prava članova koji su te poruke napisali. Ja nisam pravnik, ali moj savet ti je da to ne radiš ili da pre toga potražiš pravni savet.

S obzirom da nisam planirao da se program koristi za nelegalne aktivnosti, skrivanje identiteta korisnika se ne može odraditi iz konfiguracionog fajla. Moguće je napraviti malu izmenu u izvornom kodu i pristupati EMZ sajtu preko proksi servera.

Fajl helper.go:

U funkciji getTransport treba promeniti adresu http://localhost:8080 na adresu proksi servera preko kojeg se pristupa sajtu EMZ

Code:

func getTransport(proxy bool) http.RoundTripper {
    transport := http.Transport{}
    if proxy {
        url_i := url.URL{}
        url_proxy, _ := url_i.Parse("http://localhost:8080")
        transport.Proxy = http.ProxyURL(url_proxy)
        transport.TLSClientConfig = &tls.Config{InsecureSkipVerify: true}
    }

    return &CustomTransport{
        Base: &transport,
    }
}



U funkciji newClient, treba promeniti promenljivu proxy i dodeliti joj vrednost true

Code:

func newClient() *http.Client {
    jar, _ := cookiejar.New(nil)
    proxy := false
    parsedBaseUrl, err := url.Parse(BASE_URL)
    if err != nil {
        panic(err)
    }
    return &http.Client{
        Timeout:   time.Duration(3000) * time.Second,
        Jar:       jar,
        Transport: getTransport(proxy),
        CheckRedirect: func(req *http.Request, via []*http.Request) error {
            if req.URL.Host != parsedBaseUrl.Host {
                return http.ErrUseLastResponse //errors.New("pokusaj redirekcije na domen " + req.URL.Host)
            }
            return nil //http.ErrUseLastResponse
        },
    }
}


Nakon toga EMZ neće videti pravu adresu korisnika, već adresu proksi servera. Ja sam ovo koristio pri razvoju programa, ali može da se koristi i za skrivanje IP adrese.

U svakom slučaju, kao što sam već naveo u okviru README.md fajla:

Citat:
Tehnički, legalni ili bilo koji drugi aspekti koji proizilaze iz korišćenja programa su isključivo odgovornost korisnika koji pokreće program ili koristi program na bilo koji način. Jedino zadržavam autorsko pravo. Autor programa je vlasnik imejl naloga [email protected].

[ svojnasvome @ 07.03.2026. 10:47 ] @
Citat:
Nisam siguran na koju četvoricu misliš

Da, upravo sam mislio na naloge Everovic, Zurg, Buzzlightyear i Bora Sonar.

Citat:
Mislim da bi objavljivanjem tuđih poruka pod imenom svog naloga povredio autorska prava članova

Ako sam dobro razumeo pravilnik to je regulisano pravilnikom. Pojednostavljeno može se reći: sve poruke su vlasništvo foruma.
Ako bi autor bio 100% vlasnik poruke onda bi mogao pravno da sruši forum. Ali pristankom na pravilnik autor se odrekao prava vlasništva na sopstvene poruke.

Citat:
S obzirom da nisam planirao da se program koristi za nelegalne aktivnosti

Pa ti već koristiš tu aplikaciju za nelegalne aktivnosti u smislu pravilnika na koji si pristao.
Ako zli moderator obriše tvoju poruku podrazumeva se da kršiš pravilnik ako ponovo objaviš istu poruku jer je već ocenjena kao protivna pravilniku.
U toj situaciji moraš koristiti forumsku instituciju "žalbe".

Citat:
Na osnovu presedana u slučaju Darko Nedeljković/pctel ustanovljeno je da svaki nalog predstavlja posebnu ličnost

Može link na taj 'presedan'?

[ pover @ 07.03.2026. 19:22 ] @
Ostalo je nešto zabeleženo u vezi sa slučajem Darko/pctel u okviru teme "Pravda za Darka Nedeljkovića".

Pravilnik foruma u vezi sa autorskim pravima nisi razumeo i pravilnik ti ni na koji način ne omogućava da prisvojiš tuđi tekst tako što bi ga objavio pod svojim imenom. Kada bi ti pravilnik tvrdio da ti to omogućava, a ne tvrdi, onda bi pravilnik bio u suprotnosti sa zakonom.

Citat:


Član 14

Autor ima isključivo pravo da mu se prizna autorstvo na njegovom delu.

Član 15

Autor ima isključivo pravo da njegovo ime, pseudonim ili znak budu naznačeni na svakom primerku dela, odnosno navedeni prilikom svakog javnog saopštavanja dela, izuzev ako je to, s obzirom na konkretni oblik javnog saopštavanja dela, tehnički nemoguće ili necelishodno.

https://www.paragraf.rs/propis...torskom_i_srodnim_pravima.html



Citat:
Pa ti već koristiš tu aplikaciju za nelegalne aktivnosti u smislu pravilnika na koji si pristao.


1. Da bi nešto bilo nelegalno, morao bi da postoji definisan zakon u Krivičnom zakoniku. Ako tvrdiš da je nešto nelegalno, onda napiši koji je zakon prekršen.
2. Na osnovu čega tvrdiš da ja koristim aplikaciju?
3. Kakve veze ima pravilnik foruma sa Krivičnim zakonom?
4. Ako bi ti koristio aplikaciju i na taj način uradio bilo šta nelegalno, zašto misliš da je to moja odgovornost? Ti kontrolišeš aplikaciju kroz konfiguracioni fajl. Ukoliko ne edituješ konfiguracioni fajl aplikacija ne može ništa da objavi. Ako uneseš korisničko ime i lozinku u konfiguracioni fajl, to znači da si znao šta radiš i da si ti odgovoran.

Citat:
Ako zli moderator obriše tvoju poruku podrazumeva se da kršiš pravilnik ako ponovo objaviš istu poruku jer je već ocenjena kao protivna pravilniku


Gde tačno piše da ne sme da se ponovi ista poruka? U svakom slučaju ako ne želiš da ponavljaš izbrisanu poruku možeš da koristiš program samo za objavljivanje novih poruka ili uopšte ne koristiš program. Tvoj je izbor.

Što se mene tiče zadovoljan sam što program radi i što je ovde objavljen link do izvornog koda. Možda se vremenom pojavi neko ko je zainteresovaniji za kod programa nego za pravne aspekte koji proističu iz njegovog korišćenja. Nije da nije zanimljivo, ali ne smatram sebe za pravnog eksperta i ovo je forum Art of Programming. Rekao bih da je pisanje o pravu ovde teža povreda pravilnika od pisanja golang programa za objavljivanje poruka na EMZ.
[ svojnasvome @ 07.03.2026. 21:21 ] @
U prvom pasusu pravilnika stoji "Korišćenje naših servisa je PRIVILEGIJA, a ne PRAVO" tako da se uzalud pozivaš na Zakon o autorskim pravima.
Ako ipak taj zakon važi onda pročitaj
Citat:
Član 48
Dozvoljeno je bez dozvole autora i bez plaćanja autorske naknade privremeno umnožavanje autorskog dela, pod sledećim uslovima:

3) svrha umnožavanja je da omogući prenos podataka u računarskoj mreži između dva ili više lica preko posrednika, ili da omogući zakonito korišćenje autorskog dela i
4) umnožavanje nema zaseban ekonomski značaj.

Zakonom je takodje dozvoljeno umnožavanje onoga što je objavljeno ili ako se navede autor.

Prema tome ako ja objavim tvoju poruku neću napisati da sam ja autor poruke nego ću jednostavno tebe navesti kao autora.

Ti si u funkciji
Code:
func (user *userT) run()

proveravao da li user ima bilo kakva ogranjičenja. Ako postoji neko ograničenje odustaješ od ponovnog objavljivanja poruke.
Vrlo je verovatno da će ti nalog biti blokiran ako ponavljaš poruke koje je moderator izmenio/obrisao.
Onda, koja svrha celog projekta ako sa novog naloga, novi username ne obnoviš obrisanu/izmenjenu poruku?

Radi toga ja bih dopunio funkciju run() tako da objavljuje obrisanu poruku koristeći neki aktivan nalog.
Za te namene može da se dogradi fajl koji si opisao u odeljku Dodajte opis objave u fajl objave.json
Code:
{
      "naslov": "Moja prva poruka",
      "postId": "?",
      "temaId": "510739",
      "autor": "Pera Peric",
      "fajl": "tekst/srbija/srbija-prvi-test.txt"
  }

Doda se još jedno polje na primer "origAuthor" kome se dodeli vrednost username korisnika koji je objavio original poruke:
Code:
{
      "naslov": "Obnovljena poruka",
      "postId": postId,
      "temaId": "510739",
      "autor": "Pera2 Peric",
      "origAuthor": "Pera Peric",
      "fajl": "tekst/srbija/srbija-prvi-test.txt"
  }

Kad se ponovo objavi poruka ista će imati zaglavlje sa originalnim username autora, na primer:

AUTOR: Pera Peric


Tim putem se ne krše "autorska" prava.

[ pover @ 07.03.2026. 23:04 ] @
Sadržaj pravilnika ne može da suspenduje važenje zakona, tako da je nebitno to što piše u vezi sa privilegijama. U pravu si da ako navedeš originalnog autora onda nema problema. Kada navedeš originalnog autora ti u suštini šalješ novu poruku koja sadrži citat i ja tu ne vidim ništa sporno. Za slanje poruka sa citatima dovoljno je da imaš brauzer, a uveren sam da do sada niko nije zbog toga optužio kreatore brauzera. Ako ti planiraš da preplaviš forum porukama koje sadrže citate drugih korisnika, slobodno, ali nemoj da kriviš kreatora programa za svoje postupke. Ja lično ne vidim da bi ti na taj način prekršio neki zakon, ali kao što sam već rekao ja nisam pravnik, tako da nisam dovoljno stručan da bih mogao da dam valjan pravni savet.

Citat:
Ti si u funkciji

func (user *userT) run()

proveravao da li user ima bilo kakva ogranjičenja. Ako postoji neko ograničenje odustaješ od ponovnog objavljivanja poruke. Vrlo je verovatno da će ti nalog biti blokiran ako ponavljaš poruke koje je moderator izmenio/obrisao. Onda, koja svrha celog projekta ako sa novog naloga, novi username ne obnoviš obrisanu/izmenjenu poruku?


Obnavljam je jer odustajem samo privremeno. Ograničeni nalog se deaktivira tako što se atribut Active postavlja na false. U sledećem prolazu sve poruke koje nemaju aktivnog korisnika dodeljuju se prvom aktivnom i objavljuju se sa njegovog naloga. Prednost pri izboru novog naloga pod kojim će se poruka objaviti imaju korisnici sa bar jednom dodeljenom porukom (ako postoje).

U funkciji main možeš da nađeš liniju

Code:
        
posts := addPostMeta(activeUsersMap)


Funkcija addPostMeta pridružuje poruke korisnicima i ona vodi računa o tome da poruke po potrebi dobiju novog korisnika.

Code:


func addPostMeta(users map[string]*userT) []*postMetaT {
    var posts []*postMetaT
    file := openFile("objave.json")
    defer file.Close()
    d := json.NewDecoder(file)
    if err := d.Decode(&posts); err != nil {
        panic(err.Error())
    }
    for _, post := range posts {
        var user *userT
        var ok bool
        //ako autor ne postoji u mapi aktivnih dodeli mu prvog iz mape
        if user, ok = users[post.AuthorId]; !ok {
            var prvi *userT = nil
            for _, val := range users {
                if prvi == nil {
                    prvi = val
                    user = prvi
                }
                if len(val.posts) > 0 {
                    user = val
                    break
                }
            }
        }
        user.posts = append(user.posts, post)
    }
    return posts
}


Ovo za dodavanje novog atributa origAuthor je dobra ideja. Ako budem nekada nadograđivao prograrm implementiraću je. U svakom slučaju možeš da dodaš potpis ispod svake poruke ukoliko ne želiš da menjaš kod.
[ svojnasvome @ 08.03.2026. 18:59 ] @
Na primer, tvoj saradnik Zurg je 16.04.2020. objavio poruku https://www.elitemadzone.org/p3944798
u temi "Koronanomalije i samoizolacija".
U poruci je kratko komentarisao tekst napisan u Novosti-ma.

Poruke nema jer je cela tema uklonjena.
Pretpostavimo da vaša aplikacija primeti da poruke sa brojem 3944798 nema i pokušava da je obnovi.
Ali server odbija upis poruke na temi koja ne postoji.

Gde će aplikacija da objavi tu poruku?

[ pover @ 08.03.2026. 20:08 ] @
Neće da je objavi jer ne postoji tema. Program bi detektovao da nema teme, logovao neuspeh i nastavio sa sledećom porukom. U sledećem prolazu ponovo bi pokušao, jer teme na ES nasumično nestaju i pojavljuju se. Nisam želeo da poruka bude automatski objavljena u okviru neke druge teme jer to ne bi bilo u skladu sa pravilnikom: tačka 4. Pišite kvalitetno i ozbiljno i tačka 9. Izaberite relevantan forum za svoju temu. Ukoliko korisnik programa želi može da nakon inspekcije loga ručno dodeli poruku nekoj drugoj temi.
[ svojnasvome @ 09.03.2026. 04:49 ] @
Dosta tema na forumu nestaje bez traga.

Ako si na temi napisao po 10-tak poruku na 10-tak obrisanih tema to onda povlači na 100-ne ili 1000-de provera na svakih 10 minuta jer i broj obrisanih poruka raste kao što raste i broj obrisanih tema a raste i broj korisnika koji obnavljaju poruke.

Potencijalno broj reqest-a za proveru postojanja poruke / obnovu poruke ide u milione.

Praktično računar koji korsiti tu aplikaciju bi se "usijao" od rada a server ES-a bi non-stop opsluživao request-e koje svaki put odbija.

Da li ste u fazi testiranja programa dolazili u slične situacije?

[ pover @ 09.03.2026. 08:35 ] @
Zauzeće procesora klijentskog računara ne zavisi od broja poruka. Poruke sa jednog naloga se obrađuju sekvencijalno sa pauzama od 31 s između slanja. Pauze postoje da ne bi došlo do "flodovanja" servera.

Opterećenje računara zavisi od broja naloga sa kojih šalješ poruke.

main.go:
Code:

...
    for _, user := range activeUsersMap {
        //svaki korisnik se obradjuje u posebnoj gorutini
        go func() {
            if len(user.posts) > 0 {
                user.run()
            }
            wg.Done()
        }()
    }
...


U isečku koda iznad možeš da vidiš ključnu reč go ispred poziva anonimne funkcije. Za svaki korisnički nalog kreira se posebna gorutina, tako da se obrada poruka različitih korisnika odvija konkurentno. Gorutine su lake niti kojima upravlja go runtime. Runtime može da mapira veliki broj gorutina na mali broj niti operativnog sistema.

Ne verujem da možeš da napišeš toliko poruka i otvoriš toliko naloga da bi usijao svoj računar ili ES server.
Koliko mogu da primetim ES server koristi više nivoa keširanja, tako da mislim da do DDOS-ovanja servera neće doći, osim ako bi se neko baš potrudio da to uradi.
[ svojnasvome @ 09.03.2026. 10:48 ] @
Imao sam na umu ono šta si napisao u uvodu da se aplikacije pokreće na svakih 10 minuta.

Kako bilo, sad vidim da u funkciji writePost sa FLOOD_TIMEOUT regulišeš vremenski okvir izmedju objavljivanja poruka.

To spasava forum od gušenja ali smanjuje efikasnost aplikacije.

Bez obzira što ti razmisljas o malom broju poruka ja ne vidim smisla godinama razvijati aplikaciju da bih povremeno obnovio poruku. Mali broj poruke se može obnoviti iz brauzera bez ikakvih posebnih alata.

Razvijanje opsežne aplikacije ima smisla samo ako se obnavlja veliki broj poruka.

Već sam naveo niz razloga koji vode neograničenom rasta broja obnavljanja poruka.

Aplikacija zapravo treba da poseduje mehanizme da obmanu ES server tako da slanje zahteva za obnovu server prihvati a ne da odbaci kao flodovanje.

Zar ne?

Citat:
Zauzeće procesora klijentskog računara ne zavisi od broja poruka.

To u slučaju ako jedna osoba koristi samo jedan nalog.
Ipak mislim da bi aplikacija više imala smisla ako jedna ista osoba istovremeno koristi više naloga.

Na primer, Robert je koristio više naloga istovremeno i to je utvrdila Administracija foruma. Njemu bi takva aplikacija dobrodošla.

Sumnjam da je Robert za svaki nalog koristio drugi računar pa bi zauzeće klijentskog procesora zavisilo i od broja naloga i od broja poruka.

[ pover @ 09.03.2026. 12:32 ] @
NIsi pažljivo čitao moju prethodnu poruku. Program može da pošalje istovremeno (tačnije konkurentno) više poruka, samo ne sa istog naloga. Takođe, može da pošalje veliki broj poruka sa jednog naloga, ali ne odjednom. Nisam testirao, ali trebalo bi da prosečan moderni računar može da podrži više stotina ili čak hiljada naloga, što je mnogo više nego što bi prosečan (normalan) čovek bio spreman da otvori. Meni se čini da tebi treba program koji bi zagušio ES server, a ovaj program nije napravljen sa tim ciljem. Čemu objavljivanje poruka ako zagušiš server tako da ih niko ne vidi? Aplikacija nije razvijana godinama, nego nekoliko dana, radi zabave i testiranja go jezika. Posebnu zahvalnost dugujem moderatoru koji mi je pomogao prilikom testiranja programa.
[ svojnasvome @ 09.03.2026. 17:30 ] @
Da sam na tvom mestu i da se tako dobro razumem u programiranje ja bih se na 10 strana raspisao hvaleći aplikaciju i objašnjavajući kako radi.

No, dobro, ako aplikacija može da šalje poruke sa više naloga u kratkim vremenskim intervalima onda je to u redu. Dok pošalješ po 1 poruku sa 100 naloga onda možeš krenuti opet kroz listu naloga i slati drugu poruku sa tih naloga i da pri tome ne bi došlo do "flodovanja" servera

Citat:
Meni se čini da tebi treba program koji bi zagušio ES server

Taman posla. Pa što bih onda pisao poruke ako hoću da ugušim ES? Već sam napisao da sam ja hvalisavac a za to mi forum upravo treba.

Ako hoću da srušim neki forum jednostavnije mi je da platim nekog Indijca da za 30 dolara angažuje familiju i dok kažeš Piksla! forum bi bio izbombardovan sa milion poruika.

Nego, da te pitam još nešto: da li svoje poruke šalješ preko te aplikacije ili kroz brauzer?

[ pover @ 09.03.2026. 19:34 ] @
Tek smo na 2. stranici, a mislim da smo skoro sve pokrili. Hvala ti na pomoći. Bez tebe ne bih ovako dobro predstavio program. Ako se setiš još nečega, vrlo rado ću odgovoriti.

Nisam odavno slao poruke kroz program, ali evo sada da bih testirao da li još uvek radi poslao sam poruku: https://www.elitemadzone.org/t510702-17#4108411 i radi.
[ MajorFatal @ 09.03.2026. 21:52 ] @
Skraćeno rečeno napravio si program za spamovanje foruma? :) Užas.
[ svojnasvome @ 10.03.2026. 00:18 ] @
Naravno da imam još pitanja. Zapravo, tek sam počeo.

Na ovoj temi ti je IP adresa
2a0b:f4c2:1:.*
2a0d:bbc7::f816:3eff:fe77.*
2a12:a800:2:1:91:206:169.*
*.dfri.se. via ipv6
2a0b:f4c2:1:.*

Na strani 1 ove teme
2a0b:f4c2:1:.*
2a0b:f4c2:2:.*
2a0b:f4c2:.*
2a03:e600:100:.*
2a12:a800:9:1:193:26:115.*
2a03:4000:17:a15:d4db:fbff:f..
*.brandonkuschel.com. via ipv6
2a0b:f4c2:.*
2a12:a800:11:1:192:159:99.*
2a0d:bbc7::f816:3eff:fec7.*


Na temi gde si aplikacijom poslao post ti je IP adresa *.myersact.com

Odakle ti sve te IP adrese?

Da li si upotrebio proxy da bi poslao poruku putem aplikacije?
Ako jesi da li to znači da već koristiš program sa izmenama o kojima si pisao na prethodnoj strani: napraviti malu izmenu u izvornom kodu ?

[ ademare @ 10.03.2026. 01:40 ] @
Ove adrese heksadecimalne su vp6 adrese.

Standardne vp4 imaju standardne decimalne brojeve.

Kako ih ima toliko ? Adrese su najverovatnije "Torovane" .

Drugi segment je oznaka ISP (Internet provajder) u ovoj prvoj f4c2. Tor tako seta i izmenja vise adresa da bi se otezalo pracenje.
[ Shadowed @ 10.03.2026. 02:22 ] @
vp? :)
[ pover @ 10.03.2026. 08:49 ] @
Zbog prirode svog posla često putujem, pa otuda različite IP adrese. Bavim se proizvodnjom i prodajom sapuna. Dešava mi se da se probudim na nepoznatom mestu sa modricama po licu i telu... Raspričah se o sebi i rizikujem da prekršim prvo i drugo pravila Kluba...

Većina IP adresa je iz Tor mreže, jer koristim Tor veb pregledač. Adresa *.myersact.com je javni http proksi, a uz malu modifikaciju program može da šalje poruke i preko Tora. Potrebno je izmeniti funkciju getTransport na sledeći način:

Code:

func getTransport(proxyEnabled bool) http.RoundTripper {
    transport := http.Transport{}
    if proxyEnabled {
        dialer, _ := proxy.SOCKS5("tcp", "127.0.0.1:9050", nil, proxy.Direct)
        transport.DialContext = func(ctx context.Context, network, addr string) (net.Conn, error) {
            return dialer.Dial(network, addr)
        }
    }

    return &CustomTransport{
        Base: &transport,
    }
}


Potrebno je i u import odeljak dodati odgovarajuće biblioteke, kao što su "golang.org/x/net/proxy" i "net".

U funkciji koja kreira novi http klijent, može se povećati Timeout jer je Tor spor. Ja sam stavio 60 sekundi.

Code:

func newClient() *http.Client {
    jar, _ := cookiejar.New(nil)
    proxy := true
    parsedBaseUrl, err := url.Parse(BASE_URL)
    if err != nil {
        panic(err)
    }
    return &http.Client{
        Timeout:   time.Second * 60,
        Jar:       jar,
        Transport: getTransport(proxy),
        CheckRedirect: func(req *http.Request, via []*http.Request) error {
            if req.URL.Host != parsedBaseUrl.Host {
                return http.ErrUseLastResponse
            }
            return nil
        },
    }
}


Testirao sam objavljivanje preko Tora: https://www.elitemadzone.org/t492806-4#4108433
[ svojnasvome @ 11.03.2026. 22:07 ] @
Jesi imao problema sa CORS?
[ pover @ 12.03.2026. 08:21 ] @
Naravno da ne. CORS je mehanizam koji primenjuju veb brauzeri kako bi zaštitili korisnika od učitavanja potencijalno opasnih resursa sa drugih domena. S obziromm da se ovde ne koristi brauzer, ne izvršava se JS, ne učitavaju resursi, a http.Client i nema ugrađene SOP i CORS, pitanje nije relevantno. Kada smo već kod resursa da dopunim odgovor na tvoje ranije pitanje - program mnogo manje opterećuje server pri učitavanju stranice nego brazuer, jer program učita samo html i ne obraća pažnju na slike, stilove, skripte, fontove... Otvaranje stranice u brauzeru pokreće dvadesetak zahteva, dok program pošalje jedan ili dva.

Da nisi možda mislio na CSRF, a napisao CORS? Ako si mislio na to, CSRF nije nikakav problem. Očekivano je da postoji i lako se izvlači iz stranice.

Code:

    if tokenNode := htmlquery.FindOne(doc, "//input[@name='es_token']/@value"); tokenNode != nil {
        token = htmlquery.InnerText(tokenNode)
    }


Program sam pisao pre skoro godinu dana. Ako se dobro sećam jedini problem sam imao dok nisam provalio da ES u kukijima koristi zagrade [ i ]. Ove zagrade po standardu nisu dozvoljene, a http.Client se striktno pridržava standarda i jednostavno ignoriše takve kukije. Rešio sam to funkcijom cookieHack, gde ručno parsiram kukije i dodajem u teglu one koji nedostaju.

Kod prikazan u poruci iznad, u vezi sa objavljivanjem kroz Tor mrežu, ima nedostatak. Tor ponekad, ničim izazvan, vrati grešku. Problem sam rešio tako što sam napravio izvedenu verziju Klijenta i overrajdovao funkciju Do (terminologija je iz OO jezika, ali mislim da je primenljiva u ovom slučaju).

Nova verzija ponavlja zahtev više puta, dok ne uspe ili dostigne broj od 5 pokušaja.

Code:

type Klijent struct {
    http.Client
}

func (k *Klijent) Do(req *http.Request) (*http.Response, error) {
    var err error
    var resp *http.Response
    retry := 5
    for i := range retry {
        if req.GetBody != nil {
            req.Body, _ = req.GetBody()
        }
        resp, err = k.Client.Do(req)
        if err != nil {
            log.Println("Do pokušaj ", i, err.Error())
            time.Sleep(time.Duration(i) * time.Second)
            continue
        }
        if resp.StatusCode >= 500 {
            log.Println("Do pokušaj", i, "Server je vratio status", resp.StatusCode)
            if i < retry-1 {
                resp.Body.Close()
            }
            continue
        }
        if i > 0 {
            log.Println("OK", req.URL.String())
        }
        return resp, err
    }
    return resp, err
}


Izmenio sam i funkciju getTransport, kako bih Toru dao više vremena.

Code:

func getTransport(proxyEnabled bool) http.RoundTripper {
    transport := http.Transport{
        DisableKeepAlives:     false,
        TLSHandshakeTimeout:   20 * time.Second,
        ResponseHeaderTimeout: 30 * time.Second,
        IdleConnTimeout:       90 * time.Second,
    }
    if proxyEnabled {
        dialer := &net.Dialer{
            Timeout:   30 * time.Second,
            KeepAlive: 30 * time.Second,
        }
        torDialer, _ := proxy.SOCKS5("tcp", "127.0.0.1:9050", nil, dialer)
        transport.DialContext = func(ctx context.Context, network, addr string) (net.Conn, error) {
            return torDialer.Dial(network, addr)
        }
    }

    return &CustomTransport{
        Base: &transport,
    }
}


Osim navedenih promena neophodno je promeniti potpise funkcija koje kao argument uzimaju http.Client.

Sve poruke na EMZ sada šaljem programom kroz Tor. Jedna od prednost korišćenja programa je i što u slučaju da poruke budu izbrisane, čak i ako ih nikada ne budem obnovio, ostaje mi arhiva kvazi-duhovitih poruka.



[Ovu poruku je menjao pover dana 12.03.2026. u 09:31 GMT+1]

[Ovu poruku je menjao pover dana 12.03.2026. u 09:36 GMT+1]

[Ovu poruku je menjao pover dana 12.03.2026. u 11:47 GMT+1]
[ svojnasvome @ 12.03.2026. 15:09 ] @
CORS mehanizam može da aktivira server i nije potrebno html renderisanje.
Da bi server aktivirao CORS mehanizam dovoljno je da sa nedozvoljenog domena klijent pokuša da pristupi podacima na serveru.

Evo, na primer, pokušavam da učitam tvoju poruku na dva načina, sa jednokomponentnom adresom i sa trokomponentnom adresom.
Code:
package main

import (
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
)

func main() {
    // Jednokomponentni URL (samo postId)
    // url := "https://www.elitesecurity.org/p4108525"
    // Trokomponentni URL (temaId-pageId # postId)
    url := "https://www.elitesecurity.org/t511444-1#4108525"

    response, err := http.Get(url)
    if err != nil {
        log.Fatalf("Greška prilikom slanja zahteva: %v", err)
    }
    defer response.Body.Close()

    body, err := ioutil.ReadAll(response.Body)
    if err != nil {
        log.Fatalf("Greška prilikom čitanja tela odgovora: %v", err)
    }

    fmt.Printf("Status kod: %d\n", response.StatusCode)
    fmt.Printf("Odgovor: %s\n", body)
}

Za jednokomponentnu adresu znam da se sa XMLHTTP kroz brauzer aktivira CORS mehanizam.

U navedenom GO lang primeru, bez obzira da li serveru pristupim sa jednokomponentnom URL ili sa trokomponentno URL, u oba slučaja dobijam poruku:
Citat:
Greška prilikom slanja zahteva: Get "https://www.elitesecurity.org/..."


Ima li to veze sa CORS ili je nešto drugo?

[ pover @ 12.03.2026. 17:15 ] @
Server šalje brauzeru hedere u kojima je definisano da li je dozvoljeno učitati spoljni resurs, a na brauzeru je da ograničenja sprovede u delo. MDN

Tvoj program funkcioniše! CORS u tvom slučaju ne igra nikakvu ulogu. Ne znam zašto dobijaš grešku. Problem može da bude u vezi sa operativnim sistemom koji koristiš i mrežnim podešavanjima.

Što se veb servera tiče tvoje "jednokomponente i trokomponentne" adrese su skoro iste. Deo iza heš taga uopšte ne stiže do servera i koristi ga brauzer kako bi skrolovao stranicu do određenog elementa. Deo iza minusa parsira rewrite endžin veb servera ili php skript, ali u svakom slučaju ne utiče na uspeh učitavanja stranice. ES vraća praznu stranicu ukoliko iza minusa upišeš broj veći od ukupnog broja stranice, tako da ni to ne bi dovelo do greške.
[ svojnasvome @ 12.03.2026. 22:52 ] @
Reinstalirao sam GO. Sad radi kako treba.

Generalno izgleda brži pristup. Mogao bih da koristim GO za čitanje poruka na forumu i eliminišem beskorisne stvari. Eskiviram css-ove, google skripte, fontove, itd.

A slike, na primer, bih mogao da učitavam iz brauzera klikom na ikonu.
[ pover @ 13.03.2026. 09:33 ] @
Za čitanje bi ipak bila bolja GUI aplikacija. Ovo može da se napravi u bilo kom programskom jeziku. Ako bi koristio go imaš zanimljiv frejmvork, Wails, koji ti omogućava da koristiš veb tehnologije za grafički interfejs. Nešto slično kao elektron. U kombinaciji sa bazom nebo je granica šta možeš da napraviš od foruma :)
[ svojnasvome @ 13.03.2026. 18:37 ] @
Postoji više razloga zašto Go nije interesantan za kontinuirani razvoj aplikacija.
Naravno, ako ti klijent traži Go aplikaciju onda radiš Go aplikaciju.
U suprotnom, bar ja do danas nisam našao razlog da razvijam Go aplikacije dalje od epizodnih skriptova kao što je ovde slučaj.

Go ima arhaičnu sintaksu koja podseća na C ali nije C sintaksa.
Ako je u vreme računara sa oskudnom memorijom imalo smisla koristiti specijalne karaktere za oznaku pointera, indirektno adresiranje itd. danas ne vidim razloga za tako nešto.
Nikakve koristi osim 'mističnog' programiranja ponekad teško razumljivog.

Na primer
Code:
 for i, x := range v1 {
        y := v2[i]
        s += x * y
    }

Par znakova := se koristi za deklaraciju i inicijalizaciju Go lang promenljivih.
U navedenom primery y se i puta deklariše!

Poseban autofaul Go-a je JSON.

Sada kad je JSON najprihvatljiviji standard za razmenu podataka Go se zagrcne na parsiranju elementarnih JSON struktura koje JavaScript obradi dok kazeš 'SAD!'.
Code:

/*
var o = JSON.parse('{"A":"b","C":[{"D":"e","false":1,"g":[{"1":2,"3":"H","4":true},{"I":"j","k":"L","M":"n"}]}],"D":1769508300000}');
*/
// Ekvivalentno sa:

var o = {
    "A":"b",
    "C":[
        {
            "D":"e",
            "false":1,
            "g":[
                {
                    "1":2,
                    "3":"H",
                    "4":true
                },
                {
                    "I":"j",
                    "k":"L",
                    "M":"n"
                }
            ]
        }
    ],
    "D":1769508300000
};
alert(o.C[0].g[1]["k"]);// L

A JavaScript radi i ovo:
Code:

var t={
    159:"FF1",
    170:"DC"
};
var x = 170;
alert(t[x]);// DC


Što se tiče Wails, paa, osim "amazing features" šta tu još ima?

[ pover @ 14.03.2026. 10:16 ] @
Ako ti JavaScript odgovara, koristi JS. Svaki programski jezik predstavlja skup nekih kompromisa. Primena jezika Go i JS se preklapa u nekim delovima, iako se radi o veoma različitim jezicima razvijenim za rešavanje različitih problema. Besmisleno je porediti JS i Go. Možda ako napišeš program za objavljivanje poruka na EMZ u JavaScriptu, pa da onda analiziramo koji je jezik bolji za razvoj konkretnog programa.

Pointeri u Golangu postoje sa razlogom. S obzirom da koristiš JS, ti si naučio da prosleđuješ objekte po referenci, jer je to jedini način. U suštini u JS imaš samo pokazivače. Golang ti nudi dva načina prosleđivanja struktura, po referenci i po vrednosti. Danas je memorija jeftina (bar je bila do pojave AI balona), ali su promašaji keša skupi. Zato moderni jezici preferiraju korišćenje steka i prosleđivanje struktura po vrednosti, a ne po referenci. Go je osmišljen kao jezik koji podržava konkuretno programiranje. Ključna reč za pokretanje gorutine je samo ime jezika, što dovoljno govori koliko je konkurentnost bitna za Go. Konkurentnost nameće problem sinhronizacije. Kada gorutina dobije kopiju strukture, onda se ne moraju koristiti mehanizmi za zaključavanje. Naravno, ne možeš uvek da prosleđuješ kopije, pa zato kada treba da proslediš original, ti proslediš pointer i obezbediš pristup resursu muteksom. Ovo što sam napisao do sada odnosi se na semantiku, ako ti smeta korišćenje zvezdice i za to postoji dobar razlog. C je najpopopularnji programski jezik svih vremena, tako da je upotrebljeno nešto što je većini programera poznato.

Citat:
Par znakova := se koristi za deklaraciju i inicijalizaciju Go lang promenljivih.
U navedenom primery y se i puta deklariše!


Što se tiče := ne vidim u čemu je problem. Ko voli da kuca može da koristi dužu varijantu, var promenljiva tip. Tvoje y je se deklariše i puta, tako i treba jer si tako napisao. Nebitno je koliko se puta deklariše, bitan je opseg važenja. Ako si želeo da y postoji i nakon izlaska iz petlje, onda je trebalo da deklarišeš promenljivu iznad petlje.

Citat:
Sada kad je JSON najprihvatljiviji standard za razmenu podataka Go se zagrcne na parsiranju elementarnih JSON struktura koje JavaScript obradi dok kazeš 'SAD!'.


Hoćeš da kažeš da je u JavaSkriptu jednostavnije parsirati JSON (Java Skript Object Notation). Zvuči mi logično, ipak prva dva slova u akronimu JSON stoje za JavaScript. Pa, ako je već tako, evo programa koji umesto da parsira samo JSON, parsira i izvršava kompletan JavaScript :) Ako Go može da parsira kompletan JavaScript, to možda znači da si ti imao problem sa konkretnom JSON bibliotekom za go, a ne da se go "zagrcne" i ne može to da uradi.

Code:

package main

import (
    "fmt"
    "strconv"

    "github.com/dop251/goja"
)

func main() {
    str := `{"A":"b","C":[{"D":"e","false":1,"g":[{"1":2,"3":"H","4":true},{"I":"j","k":"L","M":"n"}]}],"D":1769508300000}`

    vm := goja.New()
    vm.RunString(`
        var o;

        function setObj(str) {
            o = JSON.parse(str);
        }

        function formatirajJson() {
            return JSON.stringify(o, null, 2);
        }    

        function upit(q) {
            return eval(q)
        }

        function t() {
            var t={
                159:"FF1",
                170:"DC"
            };
            return t
        }
    `)

    var setObj func(string)
    vm.ExportTo(vm.Get("setObj"), &setObj)
    setObj(str)

    var formatirajJson func(string) string
    vm.ExportTo(vm.Get("formatirajJson"), &formatirajJson)
    fmt.Println(formatirajJson(str))

    var upit func(string) any
    vm.ExportTo(vm.Get("upit"), &upit)
    fmt.Println(upit(`o.C[0].g[1]["k"]`))

    var t func() any
    vm.ExportTo(vm.Get("t"), &t)
    tobj := t()
    x := 170
    fmt.Println(getJsObj(tobj).at(x))
}

type jsobjekat map[string]any

func (o jsobjekat) at(x any) any {
    var kljuc string
    switch x := x.(type) {
    case int:
        kljuc = strconv.Itoa(x)
    case string:
        kljuc = x
    default:
        panic("nepoznat tip ključa")
    }
    return o[kljuc]
}

func getJsObj(obj any) jsobjekat {
    return obj.(map[string]any)
}



Wails nisam koristio, mislio sam da ćeš ti, pa da ćeš mi reći. Mene je na prvi pogled privuklo što liči na Elektron, ali nije toliko glomazan i spor i što bih mogao da koristim Go umesto JS.
[ svojnasvome @ 18.03.2026. 22:24 ] @
Šta da se zaludjujem sa Wails da bih utvrdio da ima osiromašenu emulaciju JavaScript funkcionalnosti?
U životu mi samo nedostaje maltretiranje sa organizacijom i strukturom nakaradno sročenih Wails protokola.
Rekao bih da tu iza otmenih fraza stoji gola propaganda sa nekoliko JavaScript funkcija da izgleda uverljivo a da ništa ne možeš da uradiš.

Nego, ovaj tvoj Go ima uvrnut smisao za crni humor.

Teroriše me porukama o grešci u liniji 296 a program ima 280 linija!
Žali se da sam napravio IO/Error u funkciji u kojoj ne koristim IO!

Na kraju se ispostavi da sam umesto string(x) napisao strings(x).
Crni humor, ništa drugo.

Vidim da imaju i neke Go verzije za Android.
Ako se to pokaže upotrebljivo možda nešto adaptiram za Android.
[ pover @ 19.03.2026. 10:07 ] @
Wails nema emulaciju JavaScript funkcionalnosti, već korististi WebView operativnog sistema. Na Windowsu je to Edge, na Linux-u WebKitGTK. U prethodnoj poruci napisao sam ti isečak koda u kojem koristim JS endžin (goja). To nema nikakve veze sa Wails-om. Bio je to moj odgovor na tvoju tvrdnju da se Go zagrcne kada mu daš da parsira konkretan JSON string. Moj odgovor jeste jednim delom bio šala, ali i demonstracija prednosti statički tipiziranih jezika koji se prevode na mašinski kod. Pokušaj da napraviš interpreter sa JavaSkriptom, pa ćeš videti koliko će biti upotrebljiv. Ne kažem da je nemoguće, naročito zato što sam to već radio, ali krajnji domet takvog projekta bi bio potvrda koncepta ili razonoda.

Iskreno, malo si me razočarao svojim odgovorom. Očekivao sam da ćeš mi reći da se JSON ne parsira na način koji sam ja prezentovao u prethodnoj poruci, jer se stvarno ne radi na taj način. Go ima odličnu stabilnu ("future proof") standardnu biblioteku. Osim standardne biblioteke postoji ogroman broj nezavisnih biblioteka koje određene stvari rade na bolji ili drugačiji način. Tako i za JSON postoji veliki broj nezavisnih biblioteka. Na primer https://github.com/tidwall/gjson, gde bi tvoj primer bi izgledao ovako:

Code:

    str := `{"A":"b","C":[{"D":"e","false":1,"g":[{"1":2,"3":"H","4":true},{"I":"j","k":"L","M":"n"}]}],"D":1769508300000}`
    v := gjson.Get(str, "C.0.g.1.k")
    fmt.Println(v)


Ako ti je prioritet brzina parsiranja, onda možeš da isprobaš: https://github.com/bytedance/sonic. U krajnjem slučaju ako ti ne odgovara nijedna od postojećih biblioteka možeš da napišeš svoju biblioteku koja bi teoretski mogla da bude i brža i fleksibilinija od postojećih. Sa JavaScriptom si ograničen na JSON.parse.

Što se tiče crnog humora, ne mogu da komentarišem dok ne vidim kod. S obzirom na ono što si pisao o CORS, bez nekih dokaza, više verujem Go kompajleru :)
[ svojnasvome @ 19.03.2026. 15:44 ] @
Ja ne proveravama ni za koga.
Ako si nešto napisao netačno moraćeš sam da ispraviš :)

Širenje konteksta neme smisla. U ovoj temi je Go lang u fokusu.
Korišćenje biblioteka, goja, WebView, Electron-a, Tauri-ja, Wails-a ili sličnih frameworkova, github.com, gorilla, websocket, Go WASM, Node.js i alternative, ili šta god, za problem koji obradjujem ne dolazi u obzir.

Go ima prednost u brzini rada i jednostavnosti instalacije ali je komplikovan u obradi JSON podataka.

Ako imaš pure Go lang ideju slobodno napiši, ne za mene nego za tvoju aplikaciju :)
[ pover @ 19.03.2026. 22:49 ] @
Ne znam koji problem obrađuješ. Ukoliko želiš možeš nešto detaljnije da napišeš.

Moja aplikacija koristi standardnu JSON biblioteku, Za ovako jednostavan slučaj korišćenja sasvim je zadovoljavajuća. Biblioteke goja, gjson i sonic, koje sam ja pomenuo, su pure Go. Ne razumem o kakvoj pure Go ideji za moju aplikaciju pričaš.
[ svojnasvome @ 20.03.2026. 08:12 ] @
Već sam napisao da korišćenje biblioteka ne dolazi u obzir.
Šta ima da me github špijunira?

Ono što si ti koristio JSON Go lang je sasvim dovoljan.

Nego, da li si u Go lang http konekcijama imao problema sa verifikacijom TLS sertifikata?
[ pover @ 20.03.2026. 09:25 ] @
Ako nećeš da koristiš biblioteke jer te Github špijunira (nije mi baš jasno na koji način), onda možeš da razmotriš TempleOS i HollyC.

Program sam prilikom razvoja testirao kroz javne proxy servere. Neki od tih servera prave problem pri verifikaciji sertifikata. Moguće je da je cilj nekih od tih proksija MITM napad na korisnike. S obzirom da sam koristio privremene naloge nije mi bilo bitno i jednostavno sam isključio TLS verfikaciju.

Code:

transport.TLSClientConfig = &tls.Config{InsecureSkipVerify: true}


Objavljena verzija programa ne koristi proksi servere, bar ne bez modifikacije izvornog koda.

Podsetio si me na zanimljivu temu gde smo Branimir Maksimović i ja uživo demonstrirali MITM napad. Učestvovao si i ti, samo tada još uvek nisi bio svoj na svom. Stvarno mi je žao što Branimir nije sada ovde sa nama.

[ svojnasvome @ 20.03.2026. 10:05 ] @
Nikad se nisam bavio bilo kakvim napadima.
Outsorsovao si me s nekim :)

Za eskiviranje TLS sam koristio:
Code:
client := &http.Client{
    Transport: &http.Transport{
        TLSClientConfig: &tls.Config{
            InsecureSkipVerify: true,
        },
    },
}

A to bi trebalo da bude isto rešenje kao što si naveo.
Time se ukloni x509 error.

Medjutim, glupavi server mi pošalje 0 bajtova.
[ pover @ 20.03.2026. 10:37 ] @
Tvoj stil pisanja odgovara starom članu aliimamnekolikokuća, poznatijem kao Ali Imam. Možda je to samo slučajnost. U svakom slučaju nije bitno.

Kod koji si postavio je ekvivalentan mom kodu i u mom slučaju funkcioniše. Ne znam šta pokušavaš da uradiš, tako da ne mogu da pogodim zašto server vraća 0 bajtova. Ali Imam bi pokušao da se nakači na server kladionice i koristio bi JavaScript, ali izgleda da ti nisi taj korisnik...
[ svojnasvome @ 20.03.2026. 11:06 ] @
Ne znam zašto pitanje identiteta sa jedne teme postavljaš na ovoj temi?
Ako te zanima identitet sa druge teme onda treba da to diskutuješ na forumu gde mogu da ti odgovorim u punom kapacitetu.

Trenutno pišem u forumu "Art of Programming" da bih se proslavio kao programer a ne da bih hakovao identitete.

Ipak, ako hoćeš da pišeš u forumu "Art of Programming" i da problem osvetliš iz ugla Go lang programiranja onda se možda pridružim.

Ili te zanima nešto u vezi kladionica? Tražiš algoritam za gold jack pot?

Trenutno me zanima problem servera koji neće da mi pošalje poruku ili se poruka negde zagubi tako da do mene dodje prazna koverta.
[ pover @ 20.03.2026. 11:15 ] @
U pravu si, izvini. Napiši mi molim te adresu servera da vidimo da li ću imati više sreće od tebe, odnosno da li će meni hteti da vrati poruku.
[ svojnasvome @ 20.03.2026. 15:51 ] @
Server je proradio i sad dobijam podatke.
Izgleda da je Cloudflare tu nešto "čačkao".
[ svojnasvome @ 23.03.2026. 00:23 ] @
Ovo je zanimljivo:

B je jedinstven ključ.
B=0 je dozvoljeno i označava da B ne postoji.
Ali

B = IObj.I[m].O.B
Za sve m, IObj.I[m].O.B != IObj.I[m+1].O.B

Ako je stvarni B jednak nil (ključ ne postoji što je dozvoljeno), taj ključ B primi vrednost od nekog prethodnog (što nije dozvoljeno).

Liči na "pointer reuse" problem u petlji!
Kada bi bio "pointer reuse" problem onda ne može biti

IObj.I[m].O.B != IObj.I[m+1].O.B (za sve m)

nego za neko m mora biti

IObj.I[m].O.B == IObj.I[m+1].O.B

Zato kreiram ListaB u koju dodajem svako novo B.
Ako u ListaB postoji B onda je ponovljen.
Takva provera funkcioniše i tada znam da imam problem jer mi article sa B[m] nije isto što i B[m+1] a B je (prividno) isto za oba.
Go lang ne dozvoljava "pointer reuse" error a ne znam ni kako se to može dogoditi jer u funkciji UpdateArticle( m int ) se kreira nova promeljiva I := IObj.I[m].
U stvari vrednosti za svaki element IObj.I su morale biti dodeljeno još sa json.Unmarshal() i ne bi smelo da se desi "pointer reuse".