• úvod
  • témata
  • události
  • tržiště
  • diskuze
  • nástěnka
  • přihlásit
    registrace
    ztracené heslo?
    BLAMIThe Go Programming Language - moderni programovaci jazyk
    MYSUNK
    MYSUNK --- ---
    pozice Go vyvojare stale aktualni, vhodne i pro mediora: https://www.startupjobs.cz/nabidka/36366/go-developer-medior-senior-remote
    MYSUNK
    MYSUNK --- ---
    Golang developer wanted

    Hledám kolegu do našeho vývojového týmu.

    Rozšiřujeme náš vývojový tým a hledáme někoho, kdo nám pomůže s vývojem zajímavého projektu, který tvoříme v Golangu. Je založený na microservices a provozujeme ho v AWS.

    Hledáme někoho, kdo má smysl pro detail, nezalekne se psaní testů, API dokumentace, používání Gitflow a pojmů z oblasti DevOps.

    Důležitější je pro nás ale zájem učit se novým věcem a pracovat s novými technologiemi.

    Snažíme se fungovat pomocí agilních metodik a věříme, že nejlepších výsledků lze dosahovat v dobré partě, když nás práce baví a můžeme společně tvořit něco zajímavého.

    Není nutné jezdit do kanceláře. Práci lze vykonávat vzdáleně, ideálně na IČO.
    BLAMI
    BLAMI --- ---
    Btw. pro nedockavce go2go uz neni potreba a Go v master branchi golang/go uz podporuje genericky programovani.
    VELDRANE
    VELDRANE --- ---
    BLAMI: …sem to bral jako prilezitost se aspon trochu s golangem pocvicit :). Nejsem zadnej profi programator a ocekaval sem ze mam nekdy nakou trivialni chybku o ktery nevim.
    BLAMI
    BLAMI --- ---
    VELDRANE: neni to tfuj, naopak v Go svete se tyhle reseni celkem bezne pouzivaj radsi nez NginxConfigGeneratorFactory...
    VELDRANE
    VELDRANE --- ---
    ale asi mi nic jinyho nezbyde
    VELDRANE
    VELDRANE --- ---
    BLAMI: Jako to me taky napadlo ale tfuj tfuj tfuj :)
    BLAMI
    BLAMI --- ---
    VELDRANE: no jako pokud chces, aby se to chovalo nejak pro n-1 pripadu a v tom ntym jinak, tak to udelat jde. Jestlize hledas spis to spravne reseni, tak si naimplementujes template funkci, ktera detekuje posledni prvek v range a v takovym pripade tam ten novy radek neudelas - hint tady: https://stackoverflow.com/a/22375000/497127 ; pokud hledas pragmaticke reseni co funguje, tak ten template vyrenderujes do stringu a na ten pustis strings.TrimSuffix(out, "\n") :)
    VELDRANE
    VELDRANE --- ---
    Ale jo tak ste me ukecali:

    config := help.SetArgs()
    	setLog(config)
    
    	f, err := os.OpenFile(config.OutFile, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0644)
    
    	if err != nil {
    		log.Errorf("Cannon open output file: %s", config.OutFile)
    	}
    	defer f.Close()
        .
        .
        .
        t := setTemplate(config)
    
        err = t.Execute(f, endpoints)
        if err != nil {
            log.Fatalf("Error during template occurred: %s", err)
        }

    a setTemplate vypada nejak takhle:

    .
    .
    		log.Infof ("Using template file %s", config.Template)
    		t, err := template.ParseFiles(config.Template)
    
    		if err != nil {
    			log.Fatalf("Unable to parse template %s ", config.Template)
    		}
    
    		return t
    .
    .

    Cely je to o tom ze se stahne swagger definice a udela se config podle pouzity technologie (nginx, krakend whatsever). Pouzivali jsme to na poc api gateway, kde bylo nutny rychle generovat config mapy. Myslenka je takova ze vezmou vsechny endpointy ktery to najde ze swaggeru, prida se nakej kontext a udela se z toho novy pole (var endpoints) a to se podle go templaty vyrenderuje do nakyho konfiguraku. Jako vsechno funguje cajk, templata je vetsinou nakej range. To pridani radku je blby v tom ze buhvi proc z nakyho duvodu to openshift/kubernetes nema rad a kdyz v configmape najde white line nebo nakej divnej tak se pak cela tak configmapa uplne rozsype. Je funkcni ale strasne se v ni cte o ad-hoc upravach ani nemluvim. Neni to zadnej showstoper je me to spis trochu sere.
    VELDRANE
    VELDRANE --- ---
    BLAMI: Dikec. Jako to se zbavis, jenze pak mas konec tech zavorek na zacatku te 'location' cesty a to ja nechci :). Cywe kdyz to tak ctu pripomina mi to reseni nekterejch issues s moji drahou polovickou :)). Kod radsi posilat moc nechci, to byste me ugrilovali namiste :).
    BLAMI
    BLAMI --- ---
    VELDRANE: mozna kdybys poslal i kus kodu jak s tim template pracujes. Pokud jde o ten enter za `}` uplne na konci tak toho se zbavis pomoci `{{- end -}}` ( https://play.golang.org/p/2m02dueLj0n )
    VELDRANE
    VELDRANE --- ---
    cus, neumel by mi nekdo poradit s golang templatama. Potrebuju se zbavit posledniho prazdnyho radku a uz mi dochazej napady. Mam neco jako:

    {{ range . -}}
    location {{- if .IsRegex}} ~ {{- else}} = {{- end }} {{ .Prefix}}{{.Path}} {
            set $upstream {{.Upstream}};
            set $locid {{.Id}};
    
            add_header X-Location-Id "$locid";
            proxy_read_timeout 45s;
            {{if .Prefix}}proxy_set_header X-Forwarded-Prefix {{.Prefix}};{{end}}
            proxy_set_header X-Forwarded-Proto https;
            proxy_set_header X-Forwarded-Port 443;
    
            limit_except{{range .Limits}} {{.}}{{end}} {
              deny all;
            }
    
            {{- if .Prefix}}
            if ($request_uri ~* "{{.Prefix}}/(.*))" {
               proxy_pass http://$upstream/$1;
            }
            {{- else}}
            proxy_pass http://$upstream/$request_uri;
            {{- end}}
    }
    {{ end -}}
    kdy se mi spravne vygeneruje kus nginx confu, jen uplne na konci se buhvi proc odradkuje, coz je pikacu paac kdyz to pak nahraju do k8s nebo ocp jako konfigmapu tak se cela rozsrackuje a udela se z toho neprehlednej sranec. Potrebuju jen ten posledni radek zrusit.
    BLAMI
    BLAMI --- ---
    TLDR: go get uz nebude od 1.17 buildit a instalovat balicky, pokud jste ho pouzivali k instalaci globalnich tools do GOPATH je potreba prepnout na go install...

    Deprecation of 'go get' for installing executables - The Go Programming Language
    https://golang.org/doc/go-get-install-deprecation#/ref/mod#go-install
    BLAMI
    BLAMI --- ---
    ADMIX: jako bys to neznal, vsechno dobre bude zkorporatizovano...
    ADMIX
    ADMIX --- ---
    BLAMI: symlink farm! stravil jsem dneska asi hodinu a pul debugovanim jedny a mam chut se zastrelit. Nejdriv zastrelit nekoho jinyho, ale pak i sebe :D

    ty staticky binarky do kontejneru jsou bozi, v $job-1 jsem delal cloud-native prototype nad nomad/rkt a prvni image byly nakej base OS, ale pak jsem zjistil ze Go binarku do toho proste das jednu a vono to jede, to byly casy s CoreOS :)
    BLAMI
    BLAMI --- ---
    VELDRANE: jo staticky binarky jsem opomenul. Ve financnim svete je v mnoha pripadech cloud nebo VMs tabu (soucasti regulace je casto bare metal na kterym to bezi) a sdilet runtime zavislosti s deseti dalsima tymama co jedou jinak rychle a cekat kdy Ti kdo co rozbije, not fun.
    VELDRANE
    VELDRANE --- ---
    LARS_GUNNER: Pokud delas infra admina nejake microservice platformy jako k8s, docker apod tak je go presne co potrebujes. Dobre se v tom pisou vsemozne tooly, jednoduche api apod. K dispozici mas nativni knihovny treba pro zmineneho promethea, takze kdyz pises nejaky apicko apod neni problem rovnou pridat prometheus metriky. Spousta toolu nebo sdk pro kubernetes je napsana prave v/pro go.

    V posledni dobe se treba hodne sklonujou operators pro k8s/ocp coz jsou v podstate udelatka, ktery nejak komunikuji s k8s api a nebo reaguji na zmeny stavu primo v nem. Primarni sdk je v go (jasne operator napises i v jinym jazyku).

    Hezky se v tom pisou ruzna restapi a to at uz pomoci nativnich knihiven nebo treba sofistikovanejsich frameworku jako je treba goa.

    Velkou vyhodu vidim i ve statickym linkovani by default. Jednak neresis jestli franta kterymu posilas svuj tool ma stejnou verzi knihovny “pycus” jako ty, ale hlavne kdyz chces svou aplikaci soupnout treba do konterjneru a udelat z nic docker image, tak je to easy. Proste si vemes base image nebo ubi dle tveho gusta, pridas binarku a poustis docker build. Neresis zavislosti, nepises 1000+ radkovej docker (ano i takovej mam - buildi mi custom verzi nginxu).

    Na druhou stranu, mam kamose co dela binary analysis a ten by Ti dal tucet argumentu proc je golang zlo :))
    LARS_GUNNER
    LARS_GUNNER --- ---
    BULHI: Javascript je jazyk, ktery bude neustale vzrustat a jeho uziti pujde cestou multiparadigmatu. Nejslibnejsi jazyk pro juniory. Ale to sem nepatri.
    BULHI
    BULHI --- ---
    Jeste bych dodal z pohledu web backendu - hlavni hrac je dneska bohuzel Javascript/Node, kde teda jednak Javascript je tragickej jazyk, navic npm dependency hell, kde porad neco nefunguje, nekompatibilni zavislosti, knihovny opusteny vyvojarema atd. Go je naopak, jak uz bylo zmineno, pomerne jednoduchej jazyk, kterej se da rychle naucit, nemusis si pamatovat dvacet tisic gotchas. Celej ekosystem je pomerne zdravej, cemuz asi dost pomaha ta silna standardni knihovna, ktera napriklad obsahuje i http server. S cimz souvisi dalsi vyhoda oproti vsem skriptovacim jazykum obecne, ze to cely zkompiluju do binarky a nemusim resit prostredi, napr. ze je na serveru nejakej webserver, kterej mi nevyhovuje, stara verze PHP, nebo chybi extensions, ktery potrebuju a podobne.
    ALMAD
    ALMAD --- ---
    LARS_GUNNER: Já si teda s Go jenom hraju, ale naše SRE si Go pochvalovalo jednak z důvodu co píše BLAMI, druhak pak to že u hromady malejch utilit byl ten výkonnostní rozdíl fakt poznat (proti node a pythonu), jako třeba log forwarding. A ono člověku na rychlosti nezáleží moc, dokud to neni rychlý a nemá se vracet :D

    Druhej aspekt pak je že v dockerizovanym světě najednou docela záleží na velikosti těch imagů a go vrazíš do podstatně menšího balíku. A ona ta velikost dost ovlivňuje všechny operace a z mojí zkušenosti se to dost posčítá.

    A osobně po něm pokukuju mj. proto, že teď přepisuju jeden střední člověk do Pythonu 3 a...Python je furt můj neoblíbenější jazyk po stránce syntaxe a takový tý všeobecný filozofie, ale fakt začíná bejt složitej jak C++ rádio. Já bych si to ani neuvědomil, protože v něm dělám od 2.4 a nabírám ty změny inkrementálně, ale ten přepis dělám s pár dobrovolníkama co nejsou profi programátoři a to je dobrej feedback loop. "No tohle je vlastně protože" sem za poslední dva měsíce řek fakt hodněkrát. A "import this" ti furt napíše "There should be one-- and preferably only one --obvious way to do it.", ale tady máš osm způsobu jak flatnout list listů (ano, je to napůl vtip, podobnej článek se dá napsat o spoustě jazyků, ale přijde mi že se prostě Python posouvá na tu heavyweight část)
    Kliknutím sem můžete změnit nastavení reklam