
Slava
17.02.2017
10:45:42
всё уже сказано

Alexander
17.02.2017
10:45:59
Обязательно надо! И тут два варианта: или тебе объяснят что-то недопонятое, или, может быть, и правда ничего идеального в мире не существует и надо уметь правиьно выбирать инструменты...

Slava
17.02.2017
10:46:04
http://devs.cloudimmunity.com/gotchas-and-common-mistakes-in-go-golang/

Alexander
17.02.2017
10:47:10
Слава, я читал. И, кажется, твой перевод был на хабре? Как-то не вполне сторго и убедительно.

Google

Slava
17.02.2017
10:47:46
нет, не мой =)

Alexander
17.02.2017
10:48:19
Тут вот вчера запостили: https://github.com/Konstantin8105/Effective_Go_RU
Переводчику, конечно, респект, но редактура нужна явно! Не такой хороший текст получился, как в оригинале

Vladimir
17.02.2017
11:02:02
Необходимость перевода технической литературы вообще весьма сомнительна.

Alexander
17.02.2017
11:03:19
И вобще, с языком как-то чем даьше, тем больше косноязычия. Самый печальный вариант - публичные выступления на наших конференциях. Люди не только говорить не умеют, но даже, зная, что придется лезть перед камеру/микрофон, даже и учиться не хотят :(

Andrey
17.02.2017
11:04:12

Slava
17.02.2017
11:04:20
ну хоть что-то говорят - это уже здорово, всё приходит с опытом

Alexander
17.02.2017
11:04:45
Да и пока сам переводишь, хоть поймешь, наконец, что там написано=то хотя бы :)

Andrey
17.02.2017
11:05:10
в общем переводить полезно, читать чужой перевод сомнительно

Alexander
17.02.2017
11:05:39
Слава, надо как-то все равно на это внимание обращать. Если выступающий сподобился выступить, то пусть хотя бы нескоько вещей учтет:

Mike
17.02.2017
11:09:39

Alexander
17.02.2017
11:10:52
1. Надо иметь что сказать.
2. Надо заранее снать план выступления, какие темы будут, в каком объеме, а каких не будет.
3. Заранее продумать, как ты преподнесешь то, о чем речь таки будет.
4. Научи ться слышать свое следующее слово до того, как ты его скажешь. Если следующее слово - это междометие "как бы" и ему подобные - лучше просто его не сказать, а набычась поглядеть в зал четверть секунды
5. Научиться не сидеть на шее у зала. Все вопросы типа "а кто знает, в какой версии ядра Linux появились CGroup" - это просто до свидания. Вышел выступать - выступай, а не еби людям моск
Ну, и куча других косяков... Все приходит с опытом. Жаль, что не у всех такого опыта пубичных выступлений достаточно

Google

Slava
17.02.2017
11:23:52
москва не сразу строилась =) надо же и интернам практиковаться на ком-то

Alexander
17.02.2017
11:26:22
Ну, пипл хавает пока что, так что никаких проблем. :) И есть прекрасные ораторы, не побоюсь этого слова. :) Это, в первую очередь те, кому есть таки что сказать, у кого глаза горят это донести. А полно и такого убожетва - мама не горюй. Хоть и специалист, вроде, и дело знает... Его что туда пистолетом загоняли выступать, блин???
Я это не про конференции Go, а вобще. Те же курсы лекций от Mail.RU или Яндекса. Бывает слушаешь минут 15-20 для начала что-то и просто физически страдаешь, как человеку плохо, так не надо было и лезть в это! А бывают просто суперские лекторы! Но сильно реже :(

Daniel
17.02.2017
11:29:41
вообще-то, все 5 пунктов - чистое капитанство

Alexander
17.02.2017
11:29:54
Да!

Daniel
17.02.2017
11:30:12
то есть, если человек не умеет этого - не надо бы ему - пока? - выступать
другое дело, что как этому научиться, не выступая?

Alexander
17.02.2017
11:30:35
Почитаешь курсы по UNIX по две пары до обеда и две после хотя бы пару недель, еще и не так задембелюешь :)

Daniel
17.02.2017
11:30:38
наших западных коллег этому учат прямо в школе
а кого не в школе - того в универе

Alexander
17.02.2017
11:31:27
Меня никто не учил. Просто у меня был учебный план и было что сказать на каждой лекции. И я парился просто, чтобы это донести. А если этого нет, то, как бы, кому это вобще надо?

Daniel
17.02.2017
11:32:17
ну вот у нас нет специально риторики ни в школе, ни в вузе.

Alexander
17.02.2017
11:32:41
И к лекциям готовился, особенно поначалу! Но то, что я вижу на ютюбе - это просто модой об забор, даже если то под вывеской Яндекса или MRU идет

Daniel
17.02.2017
11:32:43
то есть, ежели кто из наших это умеет - это просто талант, а талантов мало, как известно

Alexander
17.02.2017
11:34:21
Талант талантом, но если нет элеметарных речевых навыков - лучше, наверное, не надо. Хотя опять же, кто хочет выступить и есть о чем - почему нет? Если хочешь, то обычно и можешь, а опыт - дело наживное.

Anton
17.02.2017
11:36:18
это от отношения к аудитории зависит - имхо достаточно прогнать раз перед зеркалом (дабы посмотреть как это выглядит со стороны)
если криво выглядит, то повторять пока не понравится, простой же алгоритм

Alexander
17.02.2017
11:37:01
А потом достаточно посмотреть запись на ютюбе и просто умолять их удалить это унылое гавно :(

Daniel
17.02.2017
11:38:09
но, повторюсь, это редкость

Google

Alexander
17.02.2017
11:39:02
Перед зеркалом ничего не надо. Просто если есть план выступления, то уже заранее думаешь, что вот это я расскажу так... Потом думаешь, нет... половина поймет неправильно. Лучше так расскажу... В общем, муки творчества непостаредтвенно в голове. А потом видишь аудиторию и уже как-то само начинает идти, потому что ты уже о разных методиках подачи дал себе труд подумать.

Daniel
17.02.2017
11:39:12

Alexander
17.02.2017
11:40:16
И свои выступления - тоже! Обычно когда свои - то ты и есть самый строгий зритель :)

Anton
17.02.2017
11:40:19
это подразумевается (что глядя в зеркало ты сравниваешь себя с хорошими выступлениями)

Alexander
17.02.2017
11:41:33
Мы тут не о конкурсе мужской красоты еще? Я про косноязычие на наших конпутерных конференциях и курсах тут разоряюсь. Хотя, я может быть, что-то пропустил?

Ivan
17.02.2017
11:41:35
А вообще , что посоветует, я б научился вытупать

Alexander
17.02.2017
11:41:58
Слава! Не упускай парня! Он выступить хочет!

Ivan
17.02.2017
11:42:44
ну вот что пишут, выступать то сё.
Да не, я не в том смысле что есть доклад и хочу его точить, а в том что сатсо приходится даже вот перед коллегами, и чуствуешь что слабо доносишь

Alexander
17.02.2017
11:43:49
Ваня, вот, послушай хорошего лектора: https://www.youtube.com/watch?v=LcQXXhNT__I
Ж)))
Это вырезки, полностью лкция про Кложуру тоже там есть. Но это - просто чудо природы! :)))

Ivan
17.02.2017
11:50:48
спасибо

Alexander
17.02.2017
11:51:21
обращайся :)

Kanybek
17.02.2017
12:20:40
Приветствую товарищи, есть такой вопрос про база данных:
Работаю sqlx + postres, использую не http server, а grpc методы, но не суть.
Например в 1 секунду одновременно может прийти 50 запросов, но
у меня база глобальная, в main я его открыл, и держу в memory:
var db *sqlx.DB
func AccountFor(db *sqlx.DB)
и просто в каждый запрос передаю его в параметрах, так вот у меня крашит на транзакциях, как работать многопоточно с базой? Сильно гуглю, пока стоящее не нашел?

Alexander
17.02.2017
12:23:12
Делай одну транзакцию, если у тебя атомарные запросы и все такие запросы просто делай в ней . Эта транзакция будет идти через один connect. И, разумеется, счетчик времени, или количества атомарных запросов (по ситуации). Периодически ты должен говорить COMMIT

Kanybek
17.02.2017
12:25:45

Alexander
17.02.2017
12:26:32
К сожалению, в библиотеке Go сделано все так, что подразумеваются только транзакции, на каждую он будет открывать новое подключение к базе.
Поправьте, если не прав, но я в это утыкался :(

Slava
17.02.2017
12:27:08
в го есть пул коннектов

Alexander
17.02.2017
12:27:18
Пример кода - звучит слишком по-индийски

Google

Alexander
17.02.2017
12:28:32
Слава, есть пул коннектов и размером даже можно рулить. Но библиотека думает, что любой запрос - это транзакция, а для нее надо открыть соединение с базой :(

Kanybek
17.02.2017
12:28:58
Например как эту задачу я решил бы в Swift или Object-C, просто создаю global queue очередь только для database, и все операций по базе, кидаю в block в эту очередь: queue.async{}

Alexander
17.02.2017
12:30:21
Да! И я о том же. Кидаешь все атомарные запросы в функцию, которая умеет их слать, но при этом еще и делает это в одной транзакции с периодическим коммитом.
И эта функция, как можно понять. держит один коннект с базой.
Или я не понял, и ты о чем-то другом?

Kanybek
17.02.2017
12:31:43

Alexander
17.02.2017
12:32:06
У меня нет готового примера

Andrew
17.02.2017
12:33:40
У sqlx вроде есть connection pool:
http://jmoiron.github.io/sqlx/#connectionPool
не оно?

Alexander
17.02.2017
12:33:47
По сути, я предлагаю тебе сделать на Go функцию, которая обрабатывает очередь запросов, как ты привык. Но она должна периодически говорить Commit
в общем, SQL-библиотека - это не ORM, а довольно низкоуровневое средство, на надо думать, что она все сделает за тебя и даже думать, что сделает правильно :(

Kanybek
17.02.2017
12:35:13

Alexander
17.02.2017
12:36:51
А у тебя panic? Тогда я точно не понял вопроса. Сначал свой код покажи, как ты хотел это сделать?

Kanybek
17.02.2017
12:41:17
func (s *server) CreatePayment(ctx context.Context, paymentReq *pb.PaymentRequest) (*pb.PaymentRequest, error) {
unique_key, storeError := model.StorePayment(db, paymentReq)
if storeError != nil {
return nil, storeError
}
return paymentReq, nil
}
func StorePayment(db *sqlx.DB, payment *pb.PaymentRequest) (uint64, error) {
tx := db.MustBegin()
var lastInsertId uint64
err := tx.QueryRow("INSERT INTO payments " +
"(total_order_price, discount, total_price_with_discount) " +
"VALUES($1, $2, $3) returning payment_id;",
payment.TotalOrderPrice,
payment.Discount,
payment.TotalPriceWithDiscount).Scan(&lastInsertId)
CheckErr(err)
commitError := tx.Commit()
CheckErr(commitError)
return lastInsertId, nil
}
сейчас все в одном потоке

⠀
17.02.2017
12:42:04
а можно в тройных бэктиках?

Sergey
17.02.2017
12:42:21
А лучше на pastebin хотя бы ;D

Daniel
17.02.2017
12:42:44
содомия какая-то
коллеги, вы бы спросили для начала, что такое "крашит на транзакциях"

Kanybek
17.02.2017
12:44:08
http://pastebin.com/W6Maddm4

⠀
17.02.2017
12:44:21

Google

Sergey
17.02.2017
12:44:46

Daniel
17.02.2017
12:45:03
так это
что с транзакциями не так?

Alexander
17.02.2017
12:46:34
да, кажется тут с ТЦП/ИП и вобще этой проблематикой что-то не так. До баз данных дело еще даже не у всех доходит.

Kanybek
17.02.2017
12:47:09
что с транзакциями не так?
Суть в том что таких мест много, тоесть одновременно StorePayment, StoreCustomer, StoreSupplier может вызвать, а db *sqlx.DB только одно, и все, лови panic, тоесть crash


Alexander
17.02.2017
12:47:24
func (s *server) CreatePayment(ctx context.Context, paymentReq *pb.PaymentRequest) (*pb.PaymentRequest, error) {
unique_key, storeError := model.StorePayment(db, paymentReq)
if storeError != nil {
return nil, storeError
}
return paymentReq, nil
}
func StorePayment(db *sqlx.DB, payment *pb.PaymentRequest) (uint64, error) {
tx := db.MustBegin()
var lastInsertId uint64
err := tx.QueryRow("INSERT INTO payments " +
"(total_order_price, discount, total_price_with_discount) " +
"VALUES($1, $2, $3) returning payment_id;",
payment.TotalOrderPrice,
payment.Discount,
payment.TotalPriceWithDiscount).Scan(&lastInsertId)
CheckErr(err)
commitError := tx.Commit()
CheckErr(commitError)
return lastInsertId, nil
}
сейчас все в одном потоке
Боюсь, ты спросил не тот вопрос. Согласись?
Mo, ты сообщение err от базы берешь при выполнении вызова библиотеки? Что в этом сообщении?

Daniel
17.02.2017
12:49:04

Slava
17.02.2017
12:50:03
а можно стектрейс?

Alexander
17.02.2017
12:51:08
только не в канал!

Daniel
17.02.2017
12:51:24

Alexander
17.02.2017
12:51:59
ну... как-то... даже не знаю...
если тут так принято, то почему нет? :)

Daniel
17.02.2017
12:52:05
не принято

Kanybek
17.02.2017
12:57:01
сейчас восоздам данную проблему, stacktrace

Alexander
17.02.2017
12:57:44
для начала хоть воссоздай, что за паника такая :)

Kanybek
17.02.2017
13:11:13
Че то не получается пока, работает, ни одной ошибки, продолжаю поиски...

Slava
17.02.2017
13:12:19
в стек трейсе (или в ошибке) обычно есть ответ на все вопросы, лучше их не игнорировать

Alexander
17.02.2017
13:24:16
Слава, что можешь сказать про mutex? Они правда так глобально все замедляют?
Олдовые Сишники говорят, что mutex - это дико роняет производительность при каждом разе использования. А вот юзал и не чувствовал. Или и правда это так плохо?