🧑💻 Статьи для IT: как объяснять и распространять значимые идеи
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
💬 Назовите основные способы создания среза в Go.
Предположим, что тип нового создаваемого среза — это
1. Использование составных литералов:
Емкость результирующего среза не всегда выравнивается по размеру класса памяти.
2. Использование встроенной функции
Емкость результирующего среза не всегда выравнивается по размеру класса памяти.
3. Использование встроенных функций
С официальным Go-инструментарием емкость результирующего среза выравнивается по размеру класса памяти.
Предположим, что тип нового создаваемого среза — это
S,
а s0
— это нулевое значение литерала типа S.
1. Использование составных литералов:
// или
var aSlice = S{Len - 1: s0} // длина и емкость равны Len (константа)
Емкость результирующего среза не всегда выравнивается по размеру класса памяти.
2. Использование встроенной функции
make:
// или
var aSlice = make(S, initialLength) // емкость == initialLength
Емкость результирующего среза не всегда выравнивается по размеру класса памяти.
3. Использование встроенных функций
append
+ make
):
// или
var aSlice = append(S(nil), make(S, initialLength)...)
// или
var aSlice = append(S{}, make(S, initialLength, capacity)...)
// или
var aSlice = append(S(nil), make(S, initialLength, capacity)...)
С официальным Go-инструментарием емкость результирующего среза выравнивается по размеру класса памяти.
👍5
💬 Как создать байтовый срез на Go, не обнуляя его байтовые элементы?
До версии Go 1.21 этого добиться было невозможно, даже небезопасными способами. Начиная с Go 1.21, реализация
В большинстве случаев встроенная функция make обнуляет элементы результирующего среза, поэтому она часто сравнительно медленнее.
С реализацией версии 1.21+ у нас появилась возможность создавать байтовые срезы без инициализации их элементов нулем (хотя для достижения этой функциональности требуется использование функций
До версии Go 1.21 этого добиться было невозможно, даже небезопасными способами. Начиная с Go 1.21, реализация
strings.Builder.Grow
вызывает внутреннюю функцию bytealg.MakeNoZero
вместо встроенной функции make
, которую вызывала старая реализация. В большинстве случаев встроенная функция make обнуляет элементы результирующего среза, поэтому она часто сравнительно медленнее.
С реализацией версии 1.21+ у нас появилась возможность создавать байтовые срезы без инициализации их элементов нулем (хотя для достижения этой функциональности требуется использование функций
unsafe
)
import (
"strings"
"unsafe"
)
func MakeDirtyByteSlice(n int) []byte {
var b strings.Builder
b.Grow(n)
var p = unsafe.StringData(b.String())
return unsafe.Slice(p, n)
}
👍9❤3
💬 Назовите основные функции и механизмы, которые могут остановить или приостановить выполнение текущей горутины в Go.
1.
2.
3.
4. Блокировка в канале: горутина приостанавливается, ожидая отправки или получения данных через канал.
5.
6.
1.
time.Sleep(d time.Duration)
: приостанавливает горутину на указанный период времени.2.
runtime.Gosched()
: уступает выполнение другим горутинам, временно приостанавливая текущую.3.
runtime.Goexit()
: немедленно завершает текущую горутину, выполняя все отложенные вызовы.4. Блокировка в канале: горутина приостанавливается, ожидая отправки или получения данных через канал.
5.
sync.Mutex
: горутина блокируется при вызове Lock(),
ожидая освобождения мьютекса.6.
context.Context
: приостанавливает горутину, слушающую канал Done()
, когда контекст отменяется.👍16🔥2
Forwarded from Библиотека девопса | DevOps, SRE, Sysadmin
🍇 18 основных паттернов микросервисной архитектуры
Рассказываем о паттернах, которые представляют собой набор проверенных решений типичных проблем и задач в микросервисной архитектуре. Их правильное применение может значительно улучшить масштабируемость и надежность системы.
Читать статью
Рассказываем о паттернах, которые представляют собой набор проверенных решений типичных проблем и задач в микросервисной архитектуре. Их правильное применение может значительно улучшить масштабируемость и надежность системы.
Читать статью
❤4🥱2
💬 Какие типы оператора defer существуют в Go?
📌 До Go 1.13: heap-allocated defer
До версии Go 1.13 все объекты
📌 Go 1.13: stack-allocated defer
С версии Go 1.13 была введена возможность выделения объектов
📌 Go 1.13+: open-coded defer
Также с версии Go 1.13 была введена оптимизация для встраивания
📌 Go 1.22: heap-allocated defer в циклах
В Go 1.22, если
👉 Подробнее
📌 До Go 1.13: heap-allocated defer
До версии Go 1.13 все объекты
defer
выделялись в куче. Это могло приводить к снижению производительности из-за затрат на выделение памяти в куче.📌 Go 1.13: stack-allocated defer
С версии Go 1.13 была введена возможность выделения объектов
defer
в стеке. Это позволило улучшить производительность за счет уменьшения затрат на выделение памяти.📌 Go 1.13+: open-coded defer
Также с версии Go 1.13 была введена оптимизация для встраивания
defer
в конец функции и перед каждым оператором return
. Это значительно улучшило производительность, но применимо только в ограниченных кейсах, например, когда количество defer-операторов невелико (не более 8) и нет динамических конструкций, таких как циклы.📌 Go 1.22: heap-allocated defer в циклах
В Go 1.22, если
defer
используется внутри цикла, он по-прежнему выделяется в куче, поскольку количество объектов defer
может динамически меняться во время выполнения.👉 Подробнее
👍12
Forwarded from Библиотека девопса | DevOps, SRE, Sysadmin
🌐 9 основных паттернов для проектирования распределенных систем
В этой статье мы рассмотрим 9 основных паттернов и области их применения, что поможет вам в проектировании высоконагруженных приложений.
Читать статью
В этой статье мы рассмотрим 9 основных паттернов и области их применения, что поможет вам в проектировании высоконагруженных приложений.
Читать статью
❤🔥2
💬 Как эффективно удалять смежные элементы среза, сохраняя порядок элементов?
Предположим:
1. Задействованный срез обозначен как
2. Мы хотим удалить элементы в
📌 Способы удаления элементов:
1️⃣
2️⃣
3️⃣ С использованием пакета
Если используется Go toolchain 1.21, то после вызова функции
Предположим:
1. Задействованный срез обозначен как
s
, и его тип — []E
, где E
— тип элементов среза.2. Мы хотим удалить элементы в
s[from:to]
, где from <= to
.📌 Способы удаления элементов:
1️⃣
s = s[:from + copy(s[from:], s[to:])]
2️⃣
s = append(s[:from], s[to:]...)
3️⃣ С использованием пакета
slices
:import "slices"
s = slices.Delete(s, from, to)
Если используется Go toolchain 1.21, то после вызова функции
slices.Delete
мы должны самостоятельно очистить освобожденные элементы. Начиная с Go 1.22, функция slices.Delete
автоматически очищает освобожденные элементы.👍11
Forwarded from Библиотека джависта | Java, Spring, Maven, Hibernate
🐘🔮 Иллюзия согласованности в PostgreSQL: как избежать неприятных сюрпризов
Несмотря на то, что PostgreSQL обеспечивает строгую согласованность данных благодаря использованию многоверсионного параллельного контроля (MVCC), порядок выполнения транзакций может быть неожиданным для клиента. Это может привести к ситуации, когда записи появляются в неправильном порядке. Рассказываем, как и почему это происходит, и что делать для минимизации подобных проблем.
Читать статью
Несмотря на то, что PostgreSQL обеспечивает строгую согласованность данных благодаря использованию многоверсионного параллельного контроля (MVCC), порядок выполнения транзакций может быть неожиданным для клиента. Это может привести к ситуации, когда записи появляются в неправильном порядке. Рассказываем, как и почему это происходит, и что делать для минимизации подобных проблем.
Читать статью
👍3
💬 Какими свойствами должны обладать ключи в map'е?
Ключи должны поддерживать операции сравнения
Ключи должны поддерживать операции сравнения
==
и !=
(comparable). Это необходимо, чтобы Go мог эффективно выполнять операции поиска, вставки и удаления элементов из мапы.👍8
💬 В каких режимах может работать мьютекс в Go?
Мьютекс может работать в одном из двух режимов: нормальный и starvation.
В нормальном режиме горутины, ожидающие мьютекса, организованы в очередь по принципу FIFO. Однако, когда горутина пробуждается и пытается захватить мьютекс, она не получает управление сразу. Вместо этого она вынуждена конкурировать с новыми горутинами, которые также хотят захватить мьютекс в этот момент.
Эта конкуренция складывается не в пользу ожидающей горутины, так как новые горутины могут быстро попытаться захватить мьютекс, в то время как горутина из очереди еще только пробуждается.
📌 Пример сценария в нормальном режиме: допустим, горутина, которая только что проснулась, часто проигрывает эту гонку новым претендентам и снова попадает в начало очереди. Если горутине не везет, она может каждый раз просыпаться именно тогда, когда приходит новая горутина, что приводит к тому, что она никогда не захватывает мьютекс. Именно для таких случаев предусмотрен переход мьютекса в режим starvation.
Режим starvation включается, если горутина не может захватить мьютекс более 1 миллисекунды. Этот режим гарантирует, что ожидающие горутины получат справедливый шанс на захват мьютекса.
В режиме starvation, когда горутина освобождает мьютекс, управление передается непосредственно горутине, которая находится в начале очереди. Это означает, что никакой конкуренции и гонки с новыми горутинами нет — они просто присоединяются к концу очереди.
📌 Пример сценария в режиме starvation: мьютекс последовательно предоставляет доступ горутинам G1, G2 и так далее. Каждая ожидающая горутина получает управление и проверяет два условия: является ли она последней горутиной в очереди; ожидала ли она менее одной миллисекунды.
Если выполняется хотя бы одно из этих условий, мьютекс переключается обратно в нормальный режим.
Такое поведение мьютекса в Go помогает сбалансировать конкурентный доступ к общим ресурсам, обеспечивая справедливость и предотвращая бесконечное ожидание горутин в очереди.
👉 Подробнее
Мьютекс может работать в одном из двух режимов: нормальный и starvation.
В нормальном режиме горутины, ожидающие мьютекса, организованы в очередь по принципу FIFO. Однако, когда горутина пробуждается и пытается захватить мьютекс, она не получает управление сразу. Вместо этого она вынуждена конкурировать с новыми горутинами, которые также хотят захватить мьютекс в этот момент.
Эта конкуренция складывается не в пользу ожидающей горутины, так как новые горутины могут быстро попытаться захватить мьютекс, в то время как горутина из очереди еще только пробуждается.
📌 Пример сценария в нормальном режиме: допустим, горутина, которая только что проснулась, часто проигрывает эту гонку новым претендентам и снова попадает в начало очереди. Если горутине не везет, она может каждый раз просыпаться именно тогда, когда приходит новая горутина, что приводит к тому, что она никогда не захватывает мьютекс. Именно для таких случаев предусмотрен переход мьютекса в режим starvation.
Режим starvation включается, если горутина не может захватить мьютекс более 1 миллисекунды. Этот режим гарантирует, что ожидающие горутины получат справедливый шанс на захват мьютекса.
В режиме starvation, когда горутина освобождает мьютекс, управление передается непосредственно горутине, которая находится в начале очереди. Это означает, что никакой конкуренции и гонки с новыми горутинами нет — они просто присоединяются к концу очереди.
📌 Пример сценария в режиме starvation: мьютекс последовательно предоставляет доступ горутинам G1, G2 и так далее. Каждая ожидающая горутина получает управление и проверяет два условия: является ли она последней горутиной в очереди; ожидала ли она менее одной миллисекунды.
Если выполняется хотя бы одно из этих условий, мьютекс переключается обратно в нормальный режим.
Такое поведение мьютекса в Go помогает сбалансировать конкурентный доступ к общим ресурсам, обеспечивая справедливость и предотвращая бесконечное ожидание горутин в очереди.
👉 Подробнее
VictoriaMetrics
Go sync.Mutex: Normal and Starvation Mode
Mutex in Go has two main flows: Lock and Unlock and 2 modes: Normal and Starvation Mode. The state field of mutex is a 32-bit integer that represents the current state, it’s divided into multiple bits that encode various pieces of information about the mutex.
🔥25👍7💯1
💬 Какой основной юзкейс функции TryLock?
В Go 1.18 была введена новая функция TryLock для мьютексов (
Она может быть полезна в ситуациях, когда требуется неблокирующая попытка захватить ресурс. Например, если очередь может быть очищена любой горутиной и не нужно очищать ее несколько раз подряд, первая горутина, которая захватит блокировку, выполнит эту задачу, а остальные могут продолжить работу.
В Go 1.18 была введена новая функция TryLock для мьютексов (
sync.Mutex
и sync.RWMutex
), которая позволяет попытаться захватить блокировку в неблокирующем режиме. Это означает, что если блокировка уже занята, функция просто вернет значение false, вместо того чтобы ждать освобождения блокировки.Она может быть полезна в ситуациях, когда требуется неблокирующая попытка захватить ресурс. Например, если очередь может быть очищена любой горутиной и не нужно очищать ее несколько раз подряд, первая горутина, которая захватит блокировку, выполнит эту задачу, а остальные могут продолжить работу.
pkg.go.dev
sync package - sync - Go Packages
Package sync provides basic synchronization primitives such as mutual exclusion locks.
👍10
🧑💻 Статьи для IT: как объяснять и распространять значимые идеи
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
👍1
💬 Для чего можно использовать тег структуры json:"-" в Go?
Данный тег можно использовать для того, чтобы игнорировать поле структуры при сериализации в JSON (маршализации).
Это означает, что данное поле не будет включено в итоговый JSON-объект при его создании. Простой пример представлен выше.
Данный тег можно использовать для того, чтобы игнорировать поле структуры при сериализации в JSON (маршализации).
Это означает, что данное поле не будет включено в итоговый JSON-объект при его создании. Простой пример представлен выше.
👍11
Самые полезные каналы для программистов в одной подборке!
Сохраняйте себе, чтобы не потерять 💾
🔥Для всех
Библиотека программиста — новости, статьи, досуг, фундаментальные темы
Книги для программистов
IT-мемы
Proglib Academy — тут мы рассказываем про обучение и курсы
Азбука айтишника — здесь мы познаем азы из мира программирования
🤖Про нейросети
Библиотека робототехники и беспилотников | Роботы, ИИ, интернет вещей
Библиотека нейрозвука | Транскрибация, синтез речи, ИИ-музыка
Библиотека нейротекста | ChatGPT, Gemini, Bing
Библиотека нейровидео | Sora AI, Runway ML, дипфейки
Библиотека нейрокартинок | Midjourney, DALL-E, Stable Diffusion
#️⃣C#
Книги для шарпистов | C#, .NET, F#
Библиотека шарписта — полезные статьи, новости и обучающие материалы по C#
Библиотека задач по C# — код, квизы и тесты
Библиотека собеса по C# — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Вакансии по C#, .NET, Unity Вакансии по PHP, Symfony, Laravel
☁️DevOps
Библиотека devops’а — полезные статьи, новости и обучающие материалы по DevOps
Вакансии по DevOps & SRE
Библиотека задач по DevOps — код, квизы и тесты
Библиотека собеса по DevOps — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
🐘PHP
Библиотека пхпшника — полезные статьи, новости и обучающие материалы по PHP
Вакансии по PHP, Symfony, Laravel
Библиотека PHP для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по PHP — код, квизы и тесты
🐍Python
Библиотека питониста — полезные статьи, новости и обучающие материалы по Python
Вакансии по питону, Django, Flask
Библиотека Python для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Python — код, квизы и тесты
☕Java
Книги для джавистов | Java
Библиотека джависта — полезные статьи по Java, новости и обучающие материалы
Библиотека Java для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Java — код, квизы и тесты
Вакансии для java-разработчиков
👾Data Science
Книги для дата сайентистов | Data Science
Библиотека Data Science — полезные статьи, новости и обучающие материалы по Data Science
Библиотека Data Science для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Data Science — код, квизы и тесты
Вакансии по Data Science, анализу данных, аналитике, искусственному интеллекту
🦫Go
Книги для Go разработчиков
Библиотека Go разработчика — полезные статьи, новости и обучающие материалы по Go
Библиотека Go для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Go — код, квизы и тесты
Вакансии по Go
🧠C++
Книги для C/C++ разработчиков
Библиотека C/C++ разработчика — полезные статьи, новости и обучающие материалы по C++
Библиотека C++ для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по C++ — код, квизы и тесты
Вакансии по C++
💻Другие каналы
Библиотека фронтендера
Библиотека мобильного разработчика
Библиотека хакера
Библиотека тестировщика
Библиотека разработчика игр | Gamedev, Unity, Unreal Engine
Вакансии по фронтенду, джаваскрипт, React, Angular, Vue
Вакансии для мобильных разработчиков
Вакансии по QA тестированию
InfoSec Jobs — вакансии по информационной безопасности
📁Чтобы добавить папку с нашими каналами, нажмите 👉сюда👈
Также у нас есть боты:
Бот с IT-вакансиями
Бот с мероприятиями в сфере IT
Мы в других соцсетях:
🔸VK
🔸YouTube
🔸Дзен
🔸Facebook *
🔸Instagram *
* Организация Meta запрещена на территории РФ
Сохраняйте себе, чтобы не потерять 💾
🔥Для всех
Библиотека программиста — новости, статьи, досуг, фундаментальные темы
Книги для программистов
IT-мемы
Proglib Academy — тут мы рассказываем про обучение и курсы
Азбука айтишника — здесь мы познаем азы из мира программирования
🤖Про нейросети
Библиотека робототехники и беспилотников | Роботы, ИИ, интернет вещей
Библиотека нейрозвука | Транскрибация, синтез речи, ИИ-музыка
Библиотека нейротекста | ChatGPT, Gemini, Bing
Библиотека нейровидео | Sora AI, Runway ML, дипфейки
Библиотека нейрокартинок | Midjourney, DALL-E, Stable Diffusion
#️⃣C#
Книги для шарпистов | C#, .NET, F#
Библиотека шарписта — полезные статьи, новости и обучающие материалы по C#
Библиотека задач по C# — код, квизы и тесты
Библиотека собеса по C# — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Вакансии по C#, .NET, Unity Вакансии по PHP, Symfony, Laravel
☁️DevOps
Библиотека devops’а — полезные статьи, новости и обучающие материалы по DevOps
Вакансии по DevOps & SRE
Библиотека задач по DevOps — код, квизы и тесты
Библиотека собеса по DevOps — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
🐘PHP
Библиотека пхпшника — полезные статьи, новости и обучающие материалы по PHP
Вакансии по PHP, Symfony, Laravel
Библиотека PHP для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по PHP — код, квизы и тесты
🐍Python
Библиотека питониста — полезные статьи, новости и обучающие материалы по Python
Вакансии по питону, Django, Flask
Библиотека Python для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Python — код, квизы и тесты
☕Java
Книги для джавистов | Java
Библиотека джависта — полезные статьи по Java, новости и обучающие материалы
Библиотека Java для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Java — код, квизы и тесты
Вакансии для java-разработчиков
👾Data Science
Книги для дата сайентистов | Data Science
Библиотека Data Science — полезные статьи, новости и обучающие материалы по Data Science
Библиотека Data Science для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Data Science — код, квизы и тесты
Вакансии по Data Science, анализу данных, аналитике, искусственному интеллекту
🦫Go
Книги для Go разработчиков
Библиотека Go разработчика — полезные статьи, новости и обучающие материалы по Go
Библиотека Go для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по Go — код, квизы и тесты
Вакансии по Go
🧠C++
Книги для C/C++ разработчиков
Библиотека C/C++ разработчика — полезные статьи, новости и обучающие материалы по C++
Библиотека C++ для собеса — тренируемся отвечать на каверзные вопросы во время интервью и технического собеседования
Библиотека задач по C++ — код, квизы и тесты
Вакансии по C++
💻Другие каналы
Библиотека фронтендера
Библиотека мобильного разработчика
Библиотека хакера
Библиотека тестировщика
Библиотека разработчика игр | Gamedev, Unity, Unreal Engine
Вакансии по фронтенду, джаваскрипт, React, Angular, Vue
Вакансии для мобильных разработчиков
Вакансии по QA тестированию
InfoSec Jobs — вакансии по информационной безопасности
📁Чтобы добавить папку с нашими каналами, нажмите 👉сюда👈
Также у нас есть боты:
Бот с IT-вакансиями
Бот с мероприятиями в сфере IT
Мы в других соцсетях:
🔸VK
🔸YouTube
🔸Дзен
🔸Facebook *
🔸Instagram *
* Организация Meta запрещена на территории РФ
👍2❤1
💬 Чем версия Go отличается от Go toolchain?
Версия Go — это номер версии языка программирования Go, который указывает на конкретный релиз языка и его стандартной библиотеки. Версия Go определяет синтаксис языка, доступные стандартные библиотеки, и базовые инструменты, входящие в комплект поставки языка.
Go Toolchain — это набор инструментов, предоставляемый с Go, который включает в себя компилятор (
Версия Go — это номер версии языка программирования Go, который указывает на конкретный релиз языка и его стандартной библиотеки. Версия Go определяет синтаксис языка, доступные стандартные библиотеки, и базовые инструменты, входящие в комплект поставки языка.
Go Toolchain — это набор инструментов, предоставляемый с Go, который включает в себя компилятор (
go build
), менеджер пакетов (go mod
), инструмент тестирования (go test
), анализатор кода (go vet
) и другие утилиты, необходимые для разработки, сборки и отладки Go программ. Go toolchain обновляется с каждым новым релизом Go, и его версия соответствует версии языка Go.❤7
Приглашенный спикер: Павел Запольский – Senior Quantitative Researcher at Exness и Co-founder GrowLytics. Запустивший более 10 проектов по машинному обучению и анализу данных для ведущих компаний.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1👾1