@gogolang

Страница 942 из 1630
Sergey
24.03.2018
13:28:44
ничего сврехестественного, протсо результат соранения надис перевернут

кажется нашел шершение, дело в Exif тегах, сейчас попробую решить

Zver
24.03.2018
14:38:56
Ребят, всем привет! Может кто знает, почему изображение переворачиватеся влево после кропа или/и ресайза?
Оно возможно и было повернуто, если от куда-нибудь из фотоаппарата или телефона, просмотрщики многие делают автоповорот по данным Exif. Так что нужно сохранять тег эксифовский, или самому поворочивать в соответствии с ним и отбрасывать.

Google
The
24.03.2018
15:02:42
господа, подскажите как сделать, пишу 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) }

основной затык с интерфейсами и функциями первого класса. хочу ну функцию объявить метод Header() string

но не могу понять как это осуществить

Daniel
24.03.2018
15:04:42
чет не понятно

зачем это все?

The
24.03.2018
15:05:16
Ну, а как по другому сделать? через мапу что-ли?

Задача короче, писать сначала хидер, а потом и поля для товаров

при этом дать какую-то гибкость

чтобы если мне нужно добавить поля, я определил функцию, и она разрулит сама все.

а не писать ручками csv.Write([]string{...., "New Field"), и потом топать в цикл и там ещё дописывать нужное поле

Короче, вопрос в следующем, можно ли как-то сделать type MyFunc func() которая бы при этом реализовывала какой-то интерфейс?

Daniel
24.03.2018
15:13:26
что такое реализовывала интерфейс?

если вы определили тип как func, и передаете параметром переменную этого типа, передать функцию, которая имеет другой набор параметров и возвращаемых значений вам не дадут

Google
The
24.03.2018
15:19:40
нужно что-то вроде таких вот функций 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, из него вытягивается нужное поле, конвертится в строку, и пишется в файл.

видимо, нихера такое не выйдет, нужно либо структуры удовлетворяющие интерфейсы (Header() string и Value(Product) string) передавать

Daniel
24.03.2018
15:42:49
вы бы ответили для начала на вопрос - зачем это все?

Daniel
24.03.2018
15:45:04
я подозреваю, что просто задача поставлена невнятно, и в ней нашлось место для неуместной генерализации

обычно надо решать задачу как можно уже

но иногда из ТЗ можно высосать странное

The
24.03.2018
15:45:34
Смотрите, я может повторюсь. Я хочу один раз указать, что я собираюсь записать файл, и затем передавать туда сущность. И все.

Daniel
24.03.2018
15:45:41
ну

у сущности есть структура

у сущности есть теги

этого достаточно, чтобы написать любой csv

The
24.03.2018
15:49:12
окей, а если мне не нужно экспортировать часть полей? Мне удалять теги, или писать вот так csv:"-"?

Daniel
24.03.2018
15:49:25
так и писать, да

The
24.03.2018
15:51:23
я хочу пакет, который я просто подключил бы. мне часто приходится писать конвертеры товаров из движка А в движок Б, из формата А в формат Б. Я просто пишу a-to-b converter, и все. Я не хочу лазить в этот пакет больше одного раза, и тем более не хотелось бы там теги редактировать.

Sergey
24.03.2018
15:52:33
В вашем случае либо интерфейс с header value либо извращения

Теги не всегда выход, например структура одна а файлов три вида с разным набором

The
24.03.2018
15:53:49
я вот такое как бы вижу, и оно сработает: csv.WithFields(ProductID{}, ProductName{}, ProductPrice{}) Но сюда приходится передавать структуры, и эти скобки немного бесят, а я бы хотел прям функции указывать.

Google
Zver
24.03.2018
15:54:19
Данные к вам в каком виде приходят?

Sergey
24.03.2018
15:55:04
Можно функцию которая при получении nil выдаёт хидер а если указатель на структуру то значение, но это плохо

The
24.03.2018
15:55:35
с нилом я тоже думал, но это в каждой функции if product == nil {, это ещё хуже скобок :(

Данные к вам в каком виде приходят?
данные приходят в разных форматах, это может быть и выборка из базы сразу в Product{}, или csv, json, xml/yml.

сейчас это yml.

я его конвертнул в промежуточный Product{}

Zver
24.03.2018
15:56:44
Как продукт ваш выглядит?

Daniel
24.03.2018
15:56:54
все остальные способы устроить генерализацию будут костыльными и потому слегка мутными

The
24.03.2018
15:58:39
Как продукт ваш выглядит?
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 написан, но он в этой цепочке не участвует пока.

https://pastebin.com/43s1dLcC

вот конвертер, соре за портянку :(

Zver
24.03.2018
16:00:28
У вас данные всегда имют табличный вид?

Структура у вас всегда известна до начала обработки файла?

The
24.03.2018
16:03:30
что вы имеете ввиду под табличным видом? Например, здесь CategoryID это int, но на выходе будет не int, а что-то вроде Главная///Товары для дома///Утюги///Чугунные Структура всегда известна, моя задача описать некий алгоритм конвертации из одного формата в другой, при этом как-то максимально делкаративно сделать.

Zver
24.03.2018
16:04:14
Если да, то дописывайте теги и рефлексируйте структуру и никаких проблем. По другому сначала передаете записывателю слайс с заголовками, а потом просто мапу со значением колонок.

Я бы взял структуру, если она всегда известна. type Parampampam struct { Name string csv:"Name" } Что-то в этом роде

Можно даже тогда заголовок не инициализировать отдельно, если первая запись, то сначала выводим заголовок, а потом данные.

The
24.03.2018
16:12:23
структура всегда известна (я её смотрю перед началом работы), но каждый раз разная со своим геморроем)) часто работаю с интернет-магазинами, помогаю миграции делать и прочее, и, сцуко, ни один поставщик не следуют строгому формату, тому же yml например. постоянно приходится писать транспорты, которые где-то на миллиметр, но отличаются, и вот думаю уже который раз сделать какое-то гибкое решение, которое позволит сэкономить мне время на описании алгоритмов конвертации. где-то у файла есть header, где-то нет. где-то в csv нужно очередность сохранить, и указывать после товара строку с артикулом, но без product_id. Вот собственно думал как-бы покрыть хотя бы часть таких конвертаций, но видимо чудес не бывает.

Google
Zver
24.03.2018
16:24:33
структура всегда известна (я её смотрю перед началом работы), но каждый раз разная со своим геморроем)) часто работаю с интернет-магазинами, помогаю миграции делать и прочее, и, сцуко, ни один поставщик не следуют строгому формату, тому же yml например. постоянно приходится писать транспорты, которые где-то на миллиметр, но отличаются, и вот думаю уже который раз сделать какое-то гибкое решение, которое позволит сэкономить мне время на описании алгоритмов конвертации. где-то у файла есть header, где-то нет. где-то в csv нужно очередность сохранить, и указывать после товара строку с артикулом, но без product_id. Вот собственно думал как-бы покрыть хотя бы часть таких конвертаций, но видимо чудес не бывает.
Записывайте просто на основании структуры с полями, в тегах указывать необходимое наименование. Можете еще функциию передовать для преобразования полей. func Write(data interface{}, convert func(field string, value interface{}) value interface{}) err Если нужны сложные преобразования, то делать их вне записи. Сначала прочитать, потом конвертировать в нужную структуру данных, а потом уже как обычно вывести.

Писатель все же должен заниматься писанием, а не преобразованием. Иначе это бeдет выглядеть более монструозно, чем конвертер посередине.

The
24.03.2018
16:43:00
да. я тоже так думаю, но пока делаю просто наброски, прощупываю возможность и ищу лучшую реализацию. спасибо всем за советы.

No
24.03.2018
17:51:47
интересно было взглянуть на эмулятор сервера какой-то игры на Go, кто-то такое видел ибо всё на java и на java)

Denys
24.03.2018
18:41:15
прям таки все на java ?

No
24.03.2018
18:48:24
Подавляющее большинство)

Никита
24.03.2018
20:10:48
Возникла проблема с драйвером под Postgres (pq). При возрастающем количестве соединений к серверу (> 125) начинают лезть ошибки pq: remaining connection slots are reserved for non-replication superuser connections и pq: sorry, too many clients already. С чем может быть связано и как это решить?

Aleksandr
24.03.2018
20:11:37
не закрываешь соедеинения

Никита
24.03.2018
20:13:47
Окей, как это сделать? У меня в main() открывается соединение с помощью sql.Open(), потом я в хендлеры API вызовов передаю указатель на БД *sql.DB, где уже выполняются запросы к БД. Где что мне надо закрывать?

Aleksandr
24.03.2018
20:14:19
закрывай Rows

в основном там теряются соединения

Никита
24.03.2018
20:14:33
у меня в вызове есть только QueryRow

Aleksandr
24.03.2018
20:14:48
один запрос на все приложение?

Никита
24.03.2018
20:15:04
нет нет

в функции, которая передается хендлеру, делается запрос к БД с помощью QueryRow()

Aleksandr
24.03.2018
20:17:30
ну а QueryRows например у тебя нигде нет?

Никита
24.03.2018
20:17:50
в драйвере под монгу mgo как я помню соединения пихаются в пул и проблем так вообще не было. а вот с postgres появились

Aleksandr
24.03.2018
20:18:29
здесь тоже в пуле

и на всех sql-драйверах эта проблема

Google
Никита
24.03.2018
20:18:54
А нет, сейчас проверю на счет QueryRows, мне кажется все таки есть вызов

Aleksandr
24.03.2018
20:20:08
в функции, которая передается хендлеру, делается запрос к БД с помощью QueryRow()
а когда передаешь в хэндлер QueryRow, всегда потом сканируешь его? или при наступлении условия?

Никита
24.03.2018
20:21:04
Я в хендер передаю только указатель на БД. В функции уже делаются запросы к БД. Сканируются всегда

сделал rows.Close(), 0 эффекта

Aleksandr
24.03.2018
20:22:06
в общем посмотри свои запросы. каждый запрос создает подключение к базу - его надо закрыть, иначе кончатся. в QueryRow например подключение закрывается автоматически во время скана. в QueryRows не закрывается.

Никита
24.03.2018
20:31:02
Ошибки лезут даже когда делается чисто один QueryRow. Мда

Aleksandr
24.03.2018
20:32:24
тогда много одновременных соединений

https://stackoverflow.com/questions/2757549/org-postgresql-util-psqlexception-fatal-sorry-too-many-clients-already

Никита
24.03.2018
20:40:08
На самом деле это как то странно

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

А тут Пострес требует настроек для того чтобы обрабатывать более 100 соединений

The
24.03.2018
20:42:43
func (db *DB) SetMaxIdleConns(n int) func (db *DB) SetMaxOpenConns(n int)

Wingman
24.03.2018
20:42:44
пушто особенности

в pg соединения - дороги

и вообще желательно юзать pgbouncer

The
24.03.2018
20:43:24
попробуй прописать SetMaxIdleConns 10 и например MaxOpenConns 50

Wingman
24.03.2018
20:43:47
или поюзай go-pg и модели мне пока нравится

Petr
24.03.2018
20:45:15
mysql+postgre+oracle все они требуют настроек для коннектов, на продакшене от этого одни плюсы

Wingman
24.03.2018
20:45:42
пг вообще по дефолту настроен так, чтобы на любом утюге запустился

Никита
24.03.2018
20:46:12
Он то запустился, но требует много настроек

Страница 942 из 1630