LINUX.ORG.RU

Гошка - для жуков?

 , , ,


0

3

Стоит задача - написать веб сервис так, чтобы клиент мог его запустить одним щелчком а распускать руки не мог. Гошка с его компиляцией в бинарник - оно? Декомпилятор не гуглится. Как оно в плане капризности, везде потом запускается? Из собственно работы - отдать статику в один файл, эта самая статика посредством полностью клиентского жабаскрипта будет делать другие вызовы. Вызовы будут давать авторизацию десятка юзверей и немного раскладывания данных по базе. Тоесть обычные gin + gorm. Как думаете, до релиза доживёт?

Ответ на: комментарий от DumLemming

Смело, начинать проект с изучения нового языка под него, удачи.
Пингую @Zhbert, он на go пишет, больше я не знаю, а не, вру @beastie тоже вот.

Из собственно работы - отдать статику в один файл

Сишку можно взять, тебе к такому серверу линковать надо будет чуть меньше чем ничего. Разве что openssl для https ну и птхреад для птхреадов, не в одно же ядро долбить проц.

везде потом запускается?

Если в статике и с glibc то будет зависеть от того используешь ли ты вызовы которых нет в прошлых версиях или вызовы которые выкинули в новых. Можно с musl подсобрать, но кажется оно не годится для экзотики

В помощь

Чекать все зависимости и вызовы libc, включая всякие pthreadы и прочие рекомендательно/утилитарные вызовы, которые компилятор может сам подсунуть. Выявлять через тестирование в виртуалках с убунтой от 14.04 до 24.04. Ну или Debian от 6 до 12

Хоть я и про сишку, но это и go касается, ибо оно в себя вшивает те же самые сишные библиотеки, которые могут из glibc явно дёрнуть то что приведёт к отвалу всего для случаев версий glibc когда обратка сломана вперёд или взад.

Рассуждать можно долго, прощее, надёжнее и правильнее протестировать и исправлять по мере слома, ибо там где работает, значит работает, а там где нет, надо чинить. Гениально я сщитаю, и все в шоколаде.

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)

Клиент всегда сможет, если он достаточно компетентный. О каком декомпиляторе речь непонятно. Сейчас самый известный наверно hexrays, но многие реверсят другими инструментами.

Разницы между статическим бинарником на го и статическим бинарником на Си в целом нет, кроме того что первый скорее всего будет за авторством макак и соответственно низкого качества.

firkax ★★★★★
()
Ответ на: комментарий от firkax

Декомпилятор такой как для дотнета или жабы. Там на бинарник натравливаешь - получаешь почти исходный код. С гошкой вроде не так, hexrays и прочие гораздо более низкий уровень выдают

DumLemming ★★★
() автор топика
Ответ на: комментарий от firkax

Я пытался найти язык на котором можно вызовы лепить так же тяп-ляп как на ноде, не заботясь о памяти, сокетах и базе, и чтобы высокоуровневого декомпилятора для него не существовало. Гошка - первое найденное более менее подходящее

DumLemming ★★★
() автор топика
Ответ на: комментарий от DumLemming

дык ща макаки в коде это один из способов защиты от отчуждения кода от «настоящих» патенто-кодо-держателей

ибо для рефакторинга и роста плодов стада нужно другое стадо - а зачем другое если на круг исходное дешевле

вот такая вот экономия вот такая вот вечная молодость

- если найдёшь го2виртмашин - то и аналог dotpeek найдёшь

а так теже инструменты ida и прочее битолюбство

qulinxao3 ★★
()

Что вы пытаетесь скрыть с помощью Go? Статику? Так любая макака подрубит tcpdump и попробует прочесть, а если там будет TLS то возьмет hex редактор, найдет там адрес сервера откуда тянется статика, потом подберет/подглядит параметры запроса на этот сервер включая любые «api key» которые вы засунете внутрь бинарника и стянет.

Может быть просто сделаете нормальное апи с OAuth2 и не будете делать нервы?

Obezyan
()
Ответ на: комментарий от neumond

Что ж там такое секретное, что сделается с нуля (нет 10 лет исследований и потраченных бешеных денег), и что нельзя повторить другому человеку за аналогичное время?

Милый маленький бэкдорчик…
Говнокодика кусочек…
Худших практик чуть…

Ну и заказчик, которого устраивает результат в виде бинарника без кода, тоже хорош.

anonymous
()

Звучит как бред, ибо

  1. если это вебня, то зачем беспокоится о возможном реверсе кода ? вся ваша логика, всё равно в виду того, что компилятор в общем то один, будет локализована и её не так сложно будет восстановить.
  2. Декомпиляторы Go существуют и работают достаточно уверенно, что естественно, логично и ожидаемо, т.к. и язык достаточно простой и из-за внутренних особенностей, относительной молодости компилятора и более однозначного ABI позволяет восстанавливать код теряя только имена. Поэтому если вас сильно ест паранойя то используйте самораспаковывающийся через встроенную виртуальную машину бинарь написанный на C++ со всеми возможными оптимизациями и обфускацией, желательно используя вместо циклов goto там где это возможно, тогда да - сложность декомпиляции будет колоссальной… как и потраченное вами на эту паранойю время. Бонусом получите, что даже если написанный вами софт окажется мало-мальски полезным/интересным кому-то, но в целом не выстрелит, то получится, что 100% потраченного времени уйдёт в пустую, а софтина уйдёт в небытье в пучине интернета.

Короче - если вы не пишете безальтернативно востребованное ПО, то ваши заморочки с страхом декомпиляции ПО это просто вредное идефикс, ибо подавляющую часть ПО не взламывают, причём даже, если оно +- оказывается востребованным, во многом потому, что взлом даже незащищённого ПО это время и ресурсы, которые тратить никто особо не станет, если конечно это не личный вызов, который обычно заканчивается взломом без распространения результатов.

anonymous
()

Везде запускается, да. Один бинарь, если упакуешь темплейты в него, но можно и положить рядом, чтобы менять на лету (если в контейнер будет паковать, напимер). Еще можно под разные платформы сконпелять прям сходу, без плясок.

Zhbert ★★★★★
()

Хорошо писать на Golang тоже надо уметь. И она не нода, кода явно больше. Но и при правил нос подходе проблем меньше.

anonymous
()

Гошка с его компиляцией в бинарник - оно? Декомпилятор не гуглится. Как оно в плане капризности, везде потом запускается?

да, никаких байткодов там нет, декомпилируется так же как сишный софт.

Насчёт капризности - по дефолту линкуется с libc. Если хочешь чтобы запускалось вообще везде, с любыми жлибц, мюслями и т.п., то можно запилить статический бинарник. Вот хорошая статья по теме: https://eli.thegreenplace.net/2024/building-static-binaries-with-go-on-linux/

В целом, запилить не экстремально требовательный к производительности веб-сервак, который чего-то там раздаёт - гошка изначально придумана именно для такого софта, можешь смело юзать.

Прежде чем тащить всякие gin и gorm, попробуй просто стандартную библиотеку. С большой вероятностью ее тебе вполне хватит.

Lrrr ★★★★★
()
Последнее исправление: Lrrr (всего исправлений: 1)
Ответ на: комментарий от DumLemming

Декомпилятор такой как для дотнета

Для дотнета можно NativeAOT использовать, тогда уже так просто не декомпилируешь.
На выходе получим WebAPI приложение состоящее из одного файла ~10Мб размера и жрущее 20Мб оперативы.
Зависимость будет только от libc.

arax ★★
()
Ответ на: комментарий от LamerOk

Чем же оно лучше, если прибито гвоздями к pg?

А pg – это так, к слову. Хотя оно всё равно лучше gorm. Его уже переделали под bun. По сути тот же pg, только с поддержкой PostgreSQL, MySQL, MSSQL, и SQLite.

И в чём религиозная разница с gin?

Что не нужно погружаться в какой-то там фреймворк и его способы работы с запросами и прочим.

Chi – это просто роутер. Он не меняет тип обработчика запроса (http.Handler). И не вводит свой контекст запроса.

thegoldone ★★
()
Ответ на: комментарий от thegoldone

А pg – это так, к слову.

Ну, то есть ты брякнул, даже не дав себе труда подумать.

Chi – это просто роутер.

И тут у тебя аргументов нет, потому что с обоими ты не работал?

Ясно-понятно.

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

Ну, то есть ты брякнул, даже не дав себе труда подумать.

Неверное утверждение. Если Вы работаете с pg, то в курсе. Если нет, то информационное сообщение укажет Вам путь. Ошибиться невозможно.

И тут у тебя аргументов нет, потому что с обоими ты не работал?

Сможете объяснить?

thegoldone ★★
()
Ответ на: комментарий от thegoldone

А pg – это так, к слову. Хотя оно всё равно лучше gorm. Его уже переделали под bun. Если Вы работаете с pg, то в курсе.

pg - работает с постгресом. gorm - ORM общего назначения, работающая с разными БД. Чем «оно лучше» ты объяснить не смог, но каким-то образом умудрился сравнить жопу с пальцем и даже придти к выводу, «что лучше».

Сможете объяснить?

Объяснить чем полноценный фреймворк лучше роутера? Это понимают после написания примерно одного веб-приложения. Тебе это ещё предстоит.

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

pg - работает с постгресом

Это не так.

Объяснить чем полноценный фреймворк лучше роутера? Это понимают после написания примерно одного веб-приложения. Тебе это ещё предстоит.

Что я не работал с чем-то из вышеперечисленного объяснить.

Фреймворки – это просто лишняя трата времени. Они работают, когда цель что-нибудь быстро нашлепать. Когда цель создать, развивать и поддерживать – они отсекаются.

thegoldone ★★
()
Ответ на: комментарий от thegoldone

pg - работает с постгресом

Это не так

Ну и как выглядит подключение к sqlite или mysql в go-pg? Приведёшь пример кода? Что надо передать в ParseURL, чтобы подключится к ним?

Даю подсказку, код ParseURL выглядит вот так:

func ParseURL(sURL string) (*Options, error) {
	parsedUrl, err := url.Parse(sURL)
	if err != nil {
		return nil, err
	}

	// scheme
	if parsedUrl.Scheme != "postgres" && parsedUrl.Scheme != "postgresql" {
		return nil, errors.New("pg: invalid scheme: " + parsedUrl.Scheme)
	}
	...

Экскаваторы – это просто лишняя трата времени. Они работают, когда цель что-нибудь быстро выкопать. Когда цель копать, копать и копать – они отсекаются и остаётся только лопата.

Ну давай, поставь мне ещё одного клоуна. Что бы твой уровень дискуссии был уж совсем очевиден.

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

Ну и как выглядит подключение к sqlite или mysql в go-pg? Приведёшь пример кода? Что надо передать в ParseURL, чтобы подключится к ним?

Вы не код функции, а рабочий код приведите. Код приложения. Тогда скажу.

Ну давай, поставь мне ещё одного клоуна. Что бы твой уровень дискуссии был уж совсем очевиден.

Я так одобряю Вас.

thegoldone ★★
()
Ответ на: комментарий от thegoldone
package main

import (
  "fmt"
  "log"
  "os"
  "io/ioutil"
  "github.com/go-pg/pg/v10"
  "github.com/go-pg/pg/v10/orm"
)

type Person struct {
    Id        int64
    Name      string
    Age       int64
    Language  []string
}

const (
  host     = "127.0.0.1"
  port     = 5433
  user     = "user"
  password = "password"
  dbname   = "database"
)

func (u Person) String() string {
    return fmt.Sprintf("Person<%d %s %v %l>", u.Id, u.Name, u.Age, u.Language)
}

func main() {

    url := fmt.Sprintf("postgres://%s:%s@%s:%d/%s%s",
                      user, password, host, port, dbname, false)
    opt, errors := pg.ParseURL(url)
    if errors != nil {
        log.Fatal(errors)
    }

    db := pg.Connect(opt)

    defer db.Close()

    model := (*Person)(nil)
    err := db.Model(model).DropTable(&orm.DropTableOptions{
        IfExists: true,
    })
    if err != nil {
        log.Fatal(err)
    }

    err = db.Model(model).CreateTable(&orm.CreateTableOptions{
        Temp: false,
    })
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println("Created table")

    Person1 := &Person{
        Name:   "John",
        Age:    35,
        Language: []string{"Go"},
    }
    _, err = db.Model(Person1).Insert()
    if err != nil {
        log.Fatal(err)
    }

    _, err = db.Model(&Person{
        Name:      "Kelly",
        Age:       35,
        Language:  []string{"Golang", "Python"},
    }).Insert()
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println("Inserted data")

    emp := new(Person)
    err = db.Model(emp).
        Where("Person.id = ?", Person1.Id).
        Select()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Query for id=1 returned: ");
    fmt.Println(emp)
}
LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

Изменения

diff --git a/origin.go b/changed.go
index a9192fa..f4c2ea3 100644
--- a/origin.go
+++ b/changed.go
@@ -1,11 +1,15 @@
 package main
 
 import (
+       "context"
+       "database/sql"
        "fmt"
        "log"
 
-       "github.com/go-pg/pg/v10"
-       "github.com/go-pg/pg/v10/orm"
+       "github.com/uptrace/bun"
+       "github.com/uptrace/bun/dialect/mysqldialect"
+
+       _ "github.com/go-sql-driver/mysql"
 )
 
 type Person struct {
@@ -29,28 +33,24 @@ func (u Person) String() string {
 
 func main() {
 
-       url := fmt.Sprintf("postgres://%s:%s@%s:%d/%s%s",
-               user, password, host, port, dbname, false)
-       opt, errors := pg.ParseURL(url)
-       if errors != nil {
-               log.Fatal(errors)
-       }
+       url := fmt.Sprintf("%s:%s@%s:%d/%s", user, password, host, port, dbname)
 
-       db := pg.Connect(opt)
+       sqldb, err := sql.Open("mysql", url)
+       if err != nil {
+               log.Fatal(err)
+       }
 
+       db := bun.NewDB(sqldb, mysqldialect.New())
        defer db.Close()
 
+       var ctx = context.Background()
        model := (*Person)(nil)
-       err := db.Model(model).DropTable(&orm.DropTableOptions{
-               IfExists: true,
-       })
+       _, err = db.NewDropTable().Model(model).IfExists().Exec(ctx)
        if err != nil {
                log.Fatal(err)
        }
 
-       err = db.Model(model).CreateTable(&orm.CreateTableOptions{
-               Temp: false,
-       })
+       _, err = db.NewCreateTable().Model(model).IfNotExists().Temp().Exec(ctx)
        if err != nil {
                log.Fatal(err)
        }
@@ -62,16 +62,16 @@ func main() {
                Age:      35,
                Language: []string{"Go"},
        }
-       _, err = db.Model(Person1).Insert()
+       _, err = db.NewInsert().Model(Person1).Exec(ctx)
        if err != nil {
                log.Fatal(err)
        }
 
-       _, err = db.Model(&Person{
+       _, err = db.NewInsert().Model(&Person{
                Name:     "Kelly",
                Age:      35,
                Language: []string{"Golang", "Python"},
-       }).Insert()
+       }).Exec(ctx)
        if err != nil {
                log.Fatal(err)
        }
@@ -79,9 +79,9 @@ func main() {
        fmt.Println("Inserted data")
 
        emp := new(Person)
-       err = db.Model(emp).
+       _, err = db.NewSelect().Model(emp).
                Where("Person.id = ?", Person1.Id).
-               Select()
+               Exec(ctx)
        if err != nil {
                log.Fatal(err)
        }

Итоговый файл

package main

import (
	"context"
	"database/sql"
	"fmt"
	"log"

	"github.com/uptrace/bun"
	"github.com/uptrace/bun/dialect/mysqldialect"

	_ "github.com/go-sql-driver/mysql"
)

type Person struct {
	Id       int64
	Name     string
	Age      int64
	Language []string
}

const (
	host     = "127.0.0.1"
	port     = 5433
	user     = "user"
	password = "password"
	dbname   = "database"
)

func (u Person) String() string {
	return fmt.Sprintf("Person<%d %s %v %l>", u.Id, u.Name, u.Age, u.Language)
}

func main() {

	url := fmt.Sprintf("%s:%s@%s:%d/%s", user, password, host, port, dbname)

	sqldb, err := sql.Open("mysql", url)
	if err != nil {
		log.Fatal(err)
	}

	db := bun.NewDB(sqldb, mysqldialect.New())
	defer db.Close()

	var ctx = context.Background()
	model := (*Person)(nil)
	_, err = db.NewDropTable().Model(model).IfExists().Exec(ctx)
	if err != nil {
		log.Fatal(err)
	}

	_, err = db.NewCreateTable().Model(model).IfNotExists().Temp().Exec(ctx)
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println("Created table")

	Person1 := &Person{
		Name:     "John",
		Age:      35,
		Language: []string{"Go"},
	}
	_, err = db.NewInsert().Model(Person1).Exec(ctx)
	if err != nil {
		log.Fatal(err)
	}

	_, err = db.NewInsert().Model(&Person{
		Name:     "Kelly",
		Age:      35,
		Language: []string{"Golang", "Python"},
	}).Exec(ctx)
	if err != nil {
		log.Fatal(err)
	}

	fmt.Println("Inserted data")

	emp := new(Person)
	_, err = db.NewSelect().Model(emp).
		Where("Person.id = ?", Person1.Id).
		Exec(ctx)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("Query for id=1 returned: ")
	fmt.Println(emp)
}

thegoldone ★★
()
Последнее исправление: thegoldone (всего исправлений: 1)
Ответ на: комментарий от thegoldone

pg - работает с постгресом

Это не так

-       "github.com/go-pg/pg/v10"
-       "github.com/go-pg/pg/v10/orm"
+       "github.com/uptrace/bun"
+       "github.com/uptrace/bun/dialect/mysqldialect"

Секундочку. А где, собственно, go-pg, про который весь сыр бор?

LamerOk ★★★★★
()