Pawel
Daniel
зачем?!
Pawel
для домашних проектов же) почему нет? он классный
Daniel
мне не интересно про гуй
Daniel
иногда он нужен, но я бы предпочел уделить ему минимум времени
Daniel
совсем минимум
Stanislav
Daniel
и это печаль
Michael 🌌
Cenator 🐈
Cenator 🐈
Вообще у норм людей щас фронт и бэк общаются через апи
Stanislav
Michael 🌌
Michael 🌌
Stanislav
@jhekasoft я тебе скажу так:
1. GTK - удобно и легко писать, можно даже сделать приложение go get-абельным. Но совершенно вырвиглазный гуй для макоси.
2. Qt5 - единственное, что вменяемо умеет мимикрировать под родной гуй каждой оси. Код писать сложновато порой.
3. zserge/webview годно, памяти жрет куда меньше, чем nw.js и электроны, из минусов - забудь про системные меню, трей придется реализовывать сторонним пакетом, и т.д. и т.п. Это только webview и не более.
4. andlabs/ui откровенная срань, имел дело, больше не хочу.
Остальное либо для эмбеддеда, либо для игроделов. Либо настолько крейзанутое API, что куда спокойнее будет написать на Qt5.
Pawel
gopherjs к примеру :)
нет нормальног биндинга для реакта и apollo js. без этого никакой фронтенд сейчас невозможен
Stanislav
Stanislav
(это ответ на последнюю часть фразы)
Cenator 🐈
Cenator 🐈
А для go есть graphql сервер?
Eugene
@jhekasoft я тебе скажу так:
1. GTK - удобно и легко писать, можно даже сделать приложение go get-абельным. Но совершенно вырвиглазный гуй для макоси.
2. Qt5 - единственное, что вменяемо умеет мимикрировать под родной гуй каждой оси. Код писать сложновато порой.
3. zserge/webview годно, памяти жрет куда меньше, чем nw.js и электроны, из минусов - забудь про системные меню, трей придется реализовывать сторонним пакетом, и т.д. и т.п. Это только webview и не более.
4. andlabs/ui откровенная срань, имел дело, больше не хочу.
Остальное либо для эмбеддеда, либо для игроделов. Либо настолько крейзанутое API, что куда спокойнее будет написать на Qt5.
Спасибо. Та я вот недавно инвестигейтил. У andalabs/ui даже нет обычного списка/таблицы (не выпадающий список). Откинул сразу. Теперь вот думаю таки на webview сделать, единственное не хочеться опять с JS иметь дело.
Eugene
Вот как выглядит Qt (слева), GTK+ 3 (справа) на МакОси.
Stanislav
Sergey
Ребят, всем привет! Может кто знает, почему изображение переворачиватеся влево после кропа или/и ресайза?
Andrey
код?
Andrey
хотяб библиотеку сказал :)
Sergey
Рукими писал, и всеми возможными библеотеками
Sergey
ничего сврехестественного, протсо результат соранения надис перевернут
Sergey
кажется нашел шершение, дело в Exif тегах, сейчас попробую решить
Sergey
heavycharged
господа, подскажите как сделать, пишу CSV файл, и есть например набор столбцов которые нужно записать.
Я хочу сделать что-то вроде враппера, которому я передаю некоторый список полей (функций), они сначала пишут Header, а затем при добавлении товаров эти же функции принимают в себя сущность, и пишут значения этой сущности.
Если запутанно, то концепция такая:
func (builder CSVBuilder) WriteHeader(funcs ...ExtractorFunc) {
и используют так
builder.WriteHeader(ProductID, ProductName, ProductPrice, ProductImages)
после чего передаю в билдер товары
builder.AddOffer(MyProduct)
и для него вызываются методы, что-то вроде func Value(p ProductID) string {return strconv.Itoa(p.ID) }
heavycharged
основной затык с интерфейсами и функциями первого класса. хочу ну функцию объявить метод Header() string
heavycharged
но не могу понять как это осуществить
Daniel
чет не понятно
Daniel
зачем это все?
heavycharged
Ну, а как по другому сделать? через мапу что-ли?
heavycharged
Задача короче, писать сначала хидер, а потом и поля для товаров
heavycharged
при этом дать какую-то гибкость
heavycharged
чтобы если мне нужно добавить поля, я определил функцию, и она разрулит сама все.
heavycharged
а не писать ручками csv.Write([]string{...., "New Field"), и потом топать в цикл и там ещё дописывать нужное поле
heavycharged
Короче, вопрос в следующем, можно ли как-то сделать type MyFunc func() которая бы при этом реализовывала какой-то интерфейс?
Daniel
что такое реализовывала интерфейс?
Daniel
если вы определили тип как func, и передаете параметром переменную этого типа, передать функцию, которая имеет другой набор параметров и возвращаемых значений вам не дадут
Igor
heavycharged
нужно что-то вроде таких вот функций
type Getter func(product Product) string
func (Getter) Header() string { return "Some header" }
Я просто делаю так:
csv.Export(ProductID, ProductName) // ProductID и ProductName - функции, при вызове которых возвращает строку для записи заголовка csv файла
далее я передаю в в csv файлик свои товары, например так: csv.AddProduct(product) и уже для этого товара вызываются функции ProductID, ProductName, только например метод, в который передается product, из него вытягивается нужное поле, конвертится в строку, и пишется в файл.
heavycharged
видимо, нихера такое не выйдет, нужно либо структуры удовлетворяющие интерфейсы (Header() string и Value(Product) string) передавать
Daniel
вы бы ответили для начала на вопрос - зачем это все?
Zver
господа, подскажите как сделать, пишу CSV файл, и есть например набор столбцов которые нужно записать.
Я хочу сделать что-то вроде враппера, которому я передаю некоторый список полей (функций), они сначала пишут Header, а затем при добавлении товаров эти же функции принимают в себя сущность, и пишут значения этой сущности.
Если запутанно, то концепция такая:
func (builder CSVBuilder) WriteHeader(funcs ...ExtractorFunc) {
и используют так
builder.WriteHeader(ProductID, ProductName, ProductPrice, ProductImages)
после чего передаю в билдер товары
builder.AddOffer(MyProduct)
и для него вызываются методы, что-то вроде func Value(p ProductID) string {return strconv.Itoa(p.ID) }
Как все сложно.
Daniel
я подозреваю, что просто задача поставлена невнятно, и в ней нашлось место для неуместной генерализации
Daniel
обычно надо решать задачу как можно уже
Daniel
но иногда из ТЗ можно высосать странное
heavycharged
Смотрите, я может повторюсь. Я хочу один раз указать, что я собираюсь записать файл, и затем передавать туда сущность. И все.
Daniel
ну
Daniel
у сущности есть структура
Daniel
у сущности есть теги
Daniel
этого достаточно, чтобы написать любой csv
Zver
нужно что-то вроде таких вот функций
type Getter func(product Product) string
func (Getter) Header() string { return "Some header" }
Я просто делаю так:
csv.Export(ProductID, ProductName) // ProductID и ProductName - функции, при вызове которых возвращает строку для записи заголовка csv файла
далее я передаю в в csv файлик свои товары, например так: csv.AddProduct(product) и уже для этого товара вызываются функции ProductID, ProductName, только например метод, в который передается product, из него вытягивается нужное поле, конвертится в строку, и пишется в файл.
Берете у структуры прописываете теги. Из тегов берете наменования заголовков, а из самих полей данные.
heavycharged
окей, а если мне не нужно экспортировать часть полей? Мне удалять теги, или писать вот так csv:"-"?
Daniel
так и писать, да
heavycharged
я хочу пакет, который я просто подключил бы. мне часто приходится писать конвертеры товаров из движка А в движок Б, из формата А в формат Б. Я просто пишу a-to-b converter, и все. Я не хочу лазить в этот пакет больше одного раза, и тем более не хотелось бы там теги редактировать.
Sergey
В вашем случае либо интерфейс с header value либо извращения
Sergey
Теги не всегда выход, например структура одна а файлов три вида с разным набором
heavycharged
я вот такое как бы вижу, и оно сработает:
csv.WithFields(ProductID{}, ProductName{}, ProductPrice{})
Но сюда приходится передавать структуры, и эти скобки немного бесят, а я бы хотел прям функции указывать.
Zver
Данные к вам в каком виде приходят?
Sergey
Можно функцию которая при получении nil выдаёт хидер а если указатель на структуру то значение, но это плохо
heavycharged
с нилом я тоже думал, но это в каждой функции if product == nil {, это ещё хуже скобок :(
heavycharged
сейчас это yml.
heavycharged
я его конвертнул в промежуточный Product{}
Zver
Как продукт ваш выглядит?
Daniel
Daniel
все остальные способы устроить генерализацию будут костыльными и потому слегка мутными
heavycharged
Как продукт ваш выглядит?
type Offer struct {
XMLName xml.Name `xml:"offer"`
Available bool `xml:"available,attr"`
ID int `xml:"id,attr"`
Name string `xml:"name"`
CategoryID int `xml:"categoryId"`
Price float64 `xml:"price"`
CurrencyId string `xml:"currencyId"`
Pictures []string `xml:"picture"`
Vendor string `xml:"vendor"`
VendorCode int `xml:"vendorCode"`
CountryName string `xml:"country"`
Description string `xml:"description"`
Params []Param `xml:"param"`
}
что-то вроде этого, но это не промежуток, это просто сущность yml файла. я её передаю в csv. промежуточный product написан, но он в этой цепочке не участвует пока.
heavycharged
https://pastebin.com/43s1dLcC
heavycharged
вот конвертер, соре за портянку :(
Zver
У вас данные всегда имют табличный вид?
Zver
Структура у вас всегда известна до начала обработки файла?
heavycharged
что вы имеете ввиду под табличным видом? Например, здесь CategoryID это int, но на выходе будет не int, а что-то вроде Главная///Товары для дома///Утюги///Чугунные
Структура всегда известна, моя задача описать некий алгоритм конвертации из одного формата в другой, при этом как-то максимально делкаративно сделать.