💬 Как развернуть односвязный список в Go? Приведите пример кода, который создает три элемента односвязного списка, связывает их последовательно и разворачивает этот список в обратную сторону.
Для разворота односвязного списка в Go нужно создать структуру для представления узлов списка, инициализировать элементы списка, связать их, а затем развернуть их порядок
Для разворота односвязного списка в Go нужно создать структуру для представления узлов списка, инициализировать элементы списка, связать их, а затем развернуть их порядок
package main
import (
"fmt"
)
// Определение структуры узла односвязного списка
type LinkNode struct {
next *LinkNode
value int
}
// Метод для печати элементов списка
func (l *LinkNode) Print() {
for current := l; current != nil; current = current.next {
fmt.Print(current.value)
if current.next != nil {
fmt.Print(" -> ")
}
}
fmt.Println()
}
func main() {
// Инициализация элементов списка
var n1, n2, n3 = LinkNode{value: 1}, LinkNode{value: 2}, LinkNode{value: 3}
// Связывание элементов
n1.next, n2.next = &n2, &n3
// Вывод исходного списка
fmt.Println("Исходный список:")
n1.Print() // 1 -> 2 -> 3
// Разворот списка
var prev, next *LinkNode
for current := &n1; current != nil; {
next, current.next = current.next, prev
prev, current = current, next
}
// Вывод развернутого списка
fmt.Println("Развернутый список:")
prev.Print() // 3 -> 2 -> 1
}
👍6
💬 Какие типы баз данных существуют?
Базы данных можно классифицировать по различным признакам, включая модель данных, архитектуру, способ хранения данных и предназначение.
📌 Вот основные типы баз данных:
1. Реляционные:
🔸 Описание: хранение данных в виде таблиц, связанных между собой ключами. Основой являются строки и столбцы.
🔸 Примеры: MySQL, PostgreSQL, Oracle Database, Microsoft SQL Server.
🔸 Использование: применяются для большинства бизнес-приложений, где важны транзакционная целостность и согласованность данных.
2. Документные:
🔸 Описание: хранение данных в виде документов (обычно JSON или BSON). Документы могут содержать сложные, вложенные структуры.
🔸 Примеры: MongoDB, CouchDB.
🔸 Использование: идеальны для приложений с динамическими схемами, таких как веб-приложения и контент-менеджмент системы.
3. Ключ-значение:
🔸 Описание: хранение данных в виде пар ключ-значение. Простой и быстрый доступ к данным по ключу.
🔸 Примеры: Redis, DynamoDB, Riak.
🔸 Использование: часто используются для кэширования, сессий пользователя и других задач, требующих высокой производительности.
4. Графовые:
🔸 Описание: хранение данных в виде графов с узлами и рёбрами. Идеальны для представления связей и взаимосвязей между данными.
🔸 Примеры: Neo4j, JanusGraph.
🔸 Использование: социальные сети, системы управления рекомендациями, аналитика сетей.
5. Столбцовые:
🔸 Описание: хранение данных по столбцам, а не по строкам. Позволяют эффективно выполнять аналитические запросы.
🔸 Примеры: Apache Cassandra, HBase, Google Bigtable.
🔸 Использование: большие аналитические системы, хранилища данных.
6. Расширяемые хранилища записей:
🔸 Описание: гибрид ключ-значение и столбцовых баз данных, где данные хранятся в виде больших, широко распределённых таблиц.
🔸 Примеры: Google Bigtable, Apache Cassandra.
🔸 Использование: приложения, требующие горизонтальной масштабируемости и быстрой обработки больших объёмов данных.
7. Многомерные:
🔸 Описание: специализированные базы данных для обработки и анализа многомерных данных, часто используются в OLAP.
🔸 Примеры: IBM Cognos TM1, Microsoft Analysis Services.
🔸 Использование: бизнес-аналитика, финансовое планирование.
8. Встраиваемые:
🔸 Описание: встраиваются в приложения и работают автономно без необходимости установки и обслуживания сервера баз данных.
🔸 Примеры: SQLite, Berkeley DB.
🔸 Использование: мобильные приложения, десктопные приложения, устройства IoT.
9. NoSQL:
🔸 Описание: объединяют различные типы баз данных, которые не используют реляционную модель. Подразделяются на документные, графовые, ключ-значение и столбцовые базы данных.
🔸 Примеры: MongoDB, Neo4j, Cassandra, Redis.
🔸 Использование: гибкость схемы, горизонтальная масштабируемость, обработка больших данных.
10. In-Memory:
🔸 Описание: хранят данные в оперативной памяти для обеспечения высокой скорости доступа.
🔸 Примеры: Redis, Memcached, SAP HANA.
🔸 Использование: реализация кэша, временных хранилищ, аналитика в реальном времени.
11. NewSQL:
🔸 Описание: сочетают преимущества реляционных баз данных и NoSQL, обеспечивая высокую производительность и масштабируемость.
🔸 Примеры: Google Spanner, CockroachDB, VoltDB.
🔸 Использование: приложения, требующие высокой согласованности и масштабируемости.
Базы данных можно классифицировать по различным признакам, включая модель данных, архитектуру, способ хранения данных и предназначение.
📌 Вот основные типы баз данных:
1. Реляционные:
🔸 Описание: хранение данных в виде таблиц, связанных между собой ключами. Основой являются строки и столбцы.
🔸 Примеры: MySQL, PostgreSQL, Oracle Database, Microsoft SQL Server.
🔸 Использование: применяются для большинства бизнес-приложений, где важны транзакционная целостность и согласованность данных.
2. Документные:
🔸 Описание: хранение данных в виде документов (обычно JSON или BSON). Документы могут содержать сложные, вложенные структуры.
🔸 Примеры: MongoDB, CouchDB.
🔸 Использование: идеальны для приложений с динамическими схемами, таких как веб-приложения и контент-менеджмент системы.
3. Ключ-значение:
🔸 Описание: хранение данных в виде пар ключ-значение. Простой и быстрый доступ к данным по ключу.
🔸 Примеры: Redis, DynamoDB, Riak.
🔸 Использование: часто используются для кэширования, сессий пользователя и других задач, требующих высокой производительности.
4. Графовые:
🔸 Описание: хранение данных в виде графов с узлами и рёбрами. Идеальны для представления связей и взаимосвязей между данными.
🔸 Примеры: Neo4j, JanusGraph.
🔸 Использование: социальные сети, системы управления рекомендациями, аналитика сетей.
5. Столбцовые:
🔸 Описание: хранение данных по столбцам, а не по строкам. Позволяют эффективно выполнять аналитические запросы.
🔸 Примеры: Apache Cassandra, HBase, Google Bigtable.
🔸 Использование: большие аналитические системы, хранилища данных.
6. Расширяемые хранилища записей:
🔸 Описание: гибрид ключ-значение и столбцовых баз данных, где данные хранятся в виде больших, широко распределённых таблиц.
🔸 Примеры: Google Bigtable, Apache Cassandra.
🔸 Использование: приложения, требующие горизонтальной масштабируемости и быстрой обработки больших объёмов данных.
7. Многомерные:
🔸 Описание: специализированные базы данных для обработки и анализа многомерных данных, часто используются в OLAP.
🔸 Примеры: IBM Cognos TM1, Microsoft Analysis Services.
🔸 Использование: бизнес-аналитика, финансовое планирование.
8. Встраиваемые:
🔸 Описание: встраиваются в приложения и работают автономно без необходимости установки и обслуживания сервера баз данных.
🔸 Примеры: SQLite, Berkeley DB.
🔸 Использование: мобильные приложения, десктопные приложения, устройства IoT.
9. NoSQL:
🔸 Описание: объединяют различные типы баз данных, которые не используют реляционную модель. Подразделяются на документные, графовые, ключ-значение и столбцовые базы данных.
🔸 Примеры: MongoDB, Neo4j, Cassandra, Redis.
🔸 Использование: гибкость схемы, горизонтальная масштабируемость, обработка больших данных.
10. In-Memory:
🔸 Описание: хранят данные в оперативной памяти для обеспечения высокой скорости доступа.
🔸 Примеры: Redis, Memcached, SAP HANA.
🔸 Использование: реализация кэша, временных хранилищ, аналитика в реальном времени.
11. NewSQL:
🔸 Описание: сочетают преимущества реляционных баз данных и NoSQL, обеспечивая высокую производительность и масштабируемость.
🔸 Примеры: Google Spanner, CockroachDB, VoltDB.
🔸 Использование: приложения, требующие высокой согласованности и масштабируемости.
❤5👍2😁1
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Библиотека дата-сайентиста | Data Science, Machine learning, анализ данных, машинное обучение
🤯 Как простая задачка поставила в тупик программистов (и как они из него выбрались)
В 2010 году пользователь Stack Overflow не справился с задачей на собеседовании. Обсуждение способов решения этого задания стало одной из самых популярных тем на платформе.
Об этой истории, а также о способах решения задачи, читайте в нашей статье
👉 Ссылка
👉 Зеркало
В 2010 году пользователь Stack Overflow не справился с задачей на собеседовании. Обсуждение способов решения этого задания стало одной из самых популярных тем на платформе.
Об этой истории, а также о способах решения задачи, читайте в нашей статье
👉 Ссылка
👉 Зеркало
🥱4
💬 Что означает понятие false sharing?
False sharing — это ситуация, когда ядра начинают мешать друг другу. У каждого из ядер есть свой L1 Cache, который поделён на линии (cache Line) по 64 байта. Когда мы получаем какие-то данные из памяти, мы всегда получаем не меньше, чем 64 байта. Изменяя эти данные, мы инвалидируем кэши всех ядер.
Получается, что если два ядра меняют очень близкие друг к другу данные (на расстоянии меньше 64-х байт), они начинают друг другу мешать, инвалидируя кэши. В этом случае, если бы программа была написана последовательно, она работала бы быстрее, чем при использовании нескольких ядер, которые друг другу мешают. Чем больше ядер, тем меньшая производительность получится.
False sharing — это ситуация, когда ядра начинают мешать друг другу. У каждого из ядер есть свой L1 Cache, который поделён на линии (cache Line) по 64 байта. Когда мы получаем какие-то данные из памяти, мы всегда получаем не меньше, чем 64 байта. Изменяя эти данные, мы инвалидируем кэши всех ядер.
Получается, что если два ядра меняют очень близкие друг к другу данные (на расстоянии меньше 64-х байт), они начинают друг другу мешать, инвалидируя кэши. В этом случае, если бы программа была написана последовательно, она работала бы быстрее, чем при использовании нескольких ядер, которые друг другу мешают. Чем больше ядер, тем меньшая производительность получится.
🤔11👍3🥱2
💬 Что из себя представляет CAP-теорема (теорема Брюера)?
CAP-теорема утверждает, что в любой реализации распределённых вычислений можно обеспечить не более двух из трёх следующих свойств:
1. Согласованность данных (Consistency): как только мы успешно записали данные в наше распределенное хранилище, любой клиент при запросе получит актуальные данные.
2. Доступность (Availability): в любой момент клиент может получить данные из нашего хранилища или получить ответ об их отсутствии, если их никто еще не сохранял.
3. Устойчивость к разделению (Partition Tolerance): потеря сообщений между компонентами системы (возможно даже потеря всех сообщений) не влияет на работоспособность системы.
📌 Распределенные системы и CAP-теорема
Распределённые системы, в зависимости от поддерживаемых двух из трёх свойств CAP-теоремы, делятся на три категории:
1. CA (Consistency + Availability):
🔸 Во всех узлах данные согласованы и обеспечена доступность. При этом система жертвует устойчивостью к разделению.
🔸 Пример: системы, использующие репликацию данных и требуют синхронного подтверждения от всех узлов (в условиях отсутствия разделений).
2. CP (Consistency + Partition Tolerance):
🔸 В каждый момент система обеспечивает целостный результат и способна функционировать в условиях разделения, но достигает этого в ущерб доступности (может не выдавать отклик на запрос).
🔸 Пример: системы баз данных, такие как HBase, где в условиях разделения данные остаются согласованными, но некоторые части системы могут быть недоступны.
3. AP (Availability + Partition Tolerance):
🔸 Не гарантируется целостность данных, но обеспечивается доступность и устойчивость к разделению.
🔸 Пример: системы, такие как Cassandra, которые обеспечивают доступность и устойчивость к разделению, но могут возвращать устаревшие данные.
Подробнее:
🔗 CAP-теорема простым, доступным языком
🔗 Недопонимание CAP-теоремы
CAP-теорема утверждает, что в любой реализации распределённых вычислений можно обеспечить не более двух из трёх следующих свойств:
1. Согласованность данных (Consistency): как только мы успешно записали данные в наше распределенное хранилище, любой клиент при запросе получит актуальные данные.
2. Доступность (Availability): в любой момент клиент может получить данные из нашего хранилища или получить ответ об их отсутствии, если их никто еще не сохранял.
3. Устойчивость к разделению (Partition Tolerance): потеря сообщений между компонентами системы (возможно даже потеря всех сообщений) не влияет на работоспособность системы.
📌 Распределенные системы и CAP-теорема
Распределённые системы, в зависимости от поддерживаемых двух из трёх свойств CAP-теоремы, делятся на три категории:
1. CA (Consistency + Availability):
🔸 Во всех узлах данные согласованы и обеспечена доступность. При этом система жертвует устойчивостью к разделению.
🔸 Пример: системы, использующие репликацию данных и требуют синхронного подтверждения от всех узлов (в условиях отсутствия разделений).
2. CP (Consistency + Partition Tolerance):
🔸 В каждый момент система обеспечивает целостный результат и способна функционировать в условиях разделения, но достигает этого в ущерб доступности (может не выдавать отклик на запрос).
🔸 Пример: системы баз данных, такие как HBase, где в условиях разделения данные остаются согласованными, но некоторые части системы могут быть недоступны.
3. AP (Availability + Partition Tolerance):
🔸 Не гарантируется целостность данных, но обеспечивается доступность и устойчивость к разделению.
🔸 Пример: системы, такие как Cassandra, которые обеспечивают доступность и устойчивость к разделению, но могут возвращать устаревшие данные.
Подробнее:
🔗 CAP-теорема простым, доступным языком
🔗 Недопонимание CAP-теоремы
❤7👍3
Вот несколько топовых постов за последнее время:
⭐️Инструмент, который сам делает короткие вертикальные видео из ваших длинных роликов, например, на ютуб
⭐️Подборка нейро-генераторов видео с пробным периодом
⭐️Анонс ИИ-«нетфликса», который будет штамповать вам мультики по запросам
Please open Telegram to view this post
VIEW IN TELEGRAM
💬 Почему использование time.After для установки таймаутов может привести к утечке памяти в Go. Как можно предотвратить эту проблему?
Использование
Однако таймер, созданный
В приведенном ниже примере код обрабатывает события из канала и выводит предупреждение, если за 15 минут не поступило ни одного события:
При высоком потоке событий это может привести к утечке памяти. Каждый раз, когда вызывается
📌 Как предотвратить проблему утечки памяти?
Для предотвращения этой проблемы можно использовать
В примере таймер создается с использованием
👉 Подробнее:
• Go Documentation: time.After
• Effective Go: Memory Management
• Go Memory Management
Использование
time.After
для создания таймеров или установки таймаутов может привести к утечке памяти из-за особенностей работы сборщика мусора Go. Когда мы вызываем time.After(d)
, создается канал, который закроется после задержки d
. Однако таймер, созданный
time.After
, не будет собран сборщиком мусора до тех пор, пока не истечет задержка времени. Это означает, что даже если канал выходит из области видимости, он остается в памяти до тех пор, пока не истечет таймер.В приведенном ниже примере код обрабатывает события из канала и выводит предупреждение, если за 15 минут не поступило ни одного события:
func consumer(ch <-chan Event) {
for {
select {
case event := <-ch:
handle(event)
case <-time.After(time.Minute * 15) :
fmt.Println("warning: no messages received")
}
}
}
При высоком потоке событий это может привести к утечке памяти. Каждый раз, когда вызывается
time.After
, создается новый канал, который остается в памяти до истечения таймера.📌 Как предотвратить проблему утечки памяти?
Для предотвращения этой проблемы можно использовать
time.NewTimer
и явным образом останавливать таймер, когда он больше не нужен:
func consumer(ch <-chan Event) {
for {
timer := time.NewTimer(time.Minute * 15)
select {
case event := <-ch:
handle(event)
if !timer.Stop() {
<-timer.C
}
case <-timer.C:
fmt.Println("warning: no messages received")
}
}
}
В примере таймер создается с использованием
time.NewTimer
, и мы явным образом останавливаем его с помощью timer.Stop()
после обработки события. Это предотвращает создание множества неиспользуемых таймеров, которые могут привести к утечке памяти.👉 Подробнее:
• Go Documentation: time.After
• Effective Go: Memory Management
• Go Memory Management
pkg.go.dev
time package - time - Go Packages
Package time provides functionality for measuring and displaying time.
👍21❤1
Forwarded from Библиотека Go-разработчика | Golang
💡 Если у вас запущено множество локальных серверов, и вам надоело обращаться к ним как
Предположим, у вас есть локальный сервер на порту 9000. После установки Caddy, выполните команду:
и откройте https://myserver.localhost. Вы увидите, что сервер на
А если вы хотите проксировать больше серверов таким образом, создайте файл с именем
#tip
localhost:8081
, localhost:9000
и т. д., посмотрите в сторону Caddy. Он сделает настройку «доменов» для локальных серверов проще простого.Предположим, у вас есть локальный сервер на порту 9000. После установки Caddy, выполните команду:
caddy reverse-proxy --from myserver.localhost --to :9000
и откройте https://myserver.localhost. Вы увидите, что сервер на
localhost:9000
отвечает. Caddy даже предоставляет локальные TLS-сертификаты. А если вы хотите проксировать больше серверов таким образом, создайте файл с именем
Caddyfile
и введите конфигурацию хоста следующим образом:
myapp.localhost {
reverse-proxy :9000
}
myhugoblog.localhost {
reverse-proxy :1313
}
#tip
🔥22👍2
✍️Библиотека программиста» находится в поиске автора оригинальных статей
Кто нужен?
● Энтузиасты (джуны и выше), которые держат руку на пульсе, читают помимо книг зарубежные техноблоги
● Энтузиасты, которым есть что сказать
Тематика
● DevOps
● В четырех случаях из пяти вы предлагаете тему статьи
Объем
● От 7 до 15 тыс. знаков без учета кода
● 2-3 статьи в месяц
Оплата
● 8к руб. за статью
● Работаем с самозанятыми (компенсируем налог), ИП
Я пишу «так себе», что делать?
Чтобы написать статью, которую не стыдно опубликовать, достаточно овладеть инфостилем. У нас есть бесплатный курс для начинающих копирайтеров «Статьи для IT: как объяснять и распространять значимые идеи». Время прохождения курса: 1-2 недели.
✉️Пишите на hello@proglib.io
Кто нужен?
● Энтузиасты (джуны и выше), которые держат руку на пульсе, читают помимо книг зарубежные техноблоги
● Энтузиасты, которым есть что сказать
Тематика
● DevOps
● В четырех случаях из пяти вы предлагаете тему статьи
Объем
● От 7 до 15 тыс. знаков без учета кода
● 2-3 статьи в месяц
Оплата
● 8к руб. за статью
● Работаем с самозанятыми (компенсируем налог), ИП
Я пишу «так себе», что делать?
Чтобы написать статью, которую не стыдно опубликовать, достаточно овладеть инфостилем. У нас есть бесплатный курс для начинающих копирайтеров «Статьи для IT: как объяснять и распространять значимые идеи». Время прохождения курса: 1-2 недели.
✉️Пишите на hello@proglib.io
Мы наконец-то запустили канал по разработке игр — теперь все самое важное и полезное из мира геймдева можно узнать в одном месте.
Please open Telegram to view this post
VIEW IN TELEGRAM
💬 Что такое свойство ACID в базе данных?
ACID — это набор свойств, обеспечивающих надежную обработку транзакций в СУБД. Аббревиатура расшифровывается следующим образом:
🔸 Атомарность (Atomicity): гарантирует, что каждая транзакция либо полностью завершится, либо не выполнится вообще. Транзакция представляет собой единое логическое действие с данными, которое либо выполняется целиком, либо не выполняется вовсе («всё или ничего»).
🔸 Согласованность (Consistency): обеспечивает соответствие данных всем установленным правилам и ограничениям. Это означает, что после завершения транзакции все данные будут в допустимом состоянии.
🔸 Изолированность (Isolation): обеспечивает независимость выполнения транзакций, предотвращая их взаимное влияние. Это означает, что результаты выполнения одной транзакции не будут видны другим транзакциям до её завершения.
🔸 Долговечность или стойкость (Durability): обеспечивает сохранение результатов подтвержденных транзакций даже в случае сбоев.
В базах данных, соответствующих принципу ACID, данные сохраняют целостность и согласованность независимо от возможных ошибок.
Некоторые NoSQL базы данных оптимизированы для высокой доступности в кластере, что может потребовать компромиссов по части согласованности или долговечности данных. Тем не менее, существуют NoSQL БД, такие как MarkLogic, OrientDB и Neo4j, которые поддерживают ACID-свойства.
ACID — это набор свойств, обеспечивающих надежную обработку транзакций в СУБД. Аббревиатура расшифровывается следующим образом:
🔸 Атомарность (Atomicity): гарантирует, что каждая транзакция либо полностью завершится, либо не выполнится вообще. Транзакция представляет собой единое логическое действие с данными, которое либо выполняется целиком, либо не выполняется вовсе («всё или ничего»).
🔸 Согласованность (Consistency): обеспечивает соответствие данных всем установленным правилам и ограничениям. Это означает, что после завершения транзакции все данные будут в допустимом состоянии.
🔸 Изолированность (Isolation): обеспечивает независимость выполнения транзакций, предотвращая их взаимное влияние. Это означает, что результаты выполнения одной транзакции не будут видны другим транзакциям до её завершения.
🔸 Долговечность или стойкость (Durability): обеспечивает сохранение результатов подтвержденных транзакций даже в случае сбоев.
В базах данных, соответствующих принципу ACID, данные сохраняют целостность и согласованность независимо от возможных ошибок.
Некоторые NoSQL базы данных оптимизированы для высокой доступности в кластере, что может потребовать компромиссов по части согласованности или долговечности данных. Тем не менее, существуют NoSQL БД, такие как MarkLogic, OrientDB и Neo4j, которые поддерживают ACID-свойства.
👍6
💬 Назовите ключевые недостатки рефлексии в Go.
🔸 Ошибки рефлексии не могут быть обнаружены во время сборки и появляются в виде сообщений об ошибке (паник) уже во время выполнения. Другими словами, они потенциально могут привести к аварийному завершению программы.
🔸 Go-код, использующий рефлексию, замедляет программу. Если смотреть более широко, Go-код, который работает с определенным типом данных, всегда быстрее, чем Go-код, который использует рефлексию для динамической работы с любым типом данных Go. Кроме того, такой динамический код затрудняет рефакторинг или анализ кода с помощью специальных инструментов.
🔸 Широкое использование рефлексии затрудняет чтение и поддержку кода. Потенциальное решением этой проблемы — документирование.
🔸 Ошибки рефлексии не могут быть обнаружены во время сборки и появляются в виде сообщений об ошибке (паник) уже во время выполнения. Другими словами, они потенциально могут привести к аварийному завершению программы.
🔸 Go-код, использующий рефлексию, замедляет программу. Если смотреть более широко, Go-код, который работает с определенным типом данных, всегда быстрее, чем Go-код, который использует рефлексию для динамической работы с любым типом данных Go. Кроме того, такой динамический код затрудняет рефакторинг или анализ кода с помощью специальных инструментов.
🔸 Широкое использование рефлексии затрудняет чтение и поддержку кода. Потенциальное решением этой проблемы — документирование.
👍8❤4🥱2
Подписывайтесь на наш новый канал про нейросети для создания изображений, там есть:
Please open Telegram to view this post
VIEW IN TELEGRAM
Самые полезные каналы для программистов в одной подборке!
Сохраняйте себе, чтобы не потерять 💾
🔥Для всех
Библиотека программиста — новости, статьи, досуг, фундаментальные темы
Книги для программистов
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++
💻Другие каналы
Библиотека фронтендера
Библиотека мобильного разработчика
Библиотека хакера
Библиотека тестировщика
Вакансии по фронтенду, джаваскрипт, 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++
💻Другие каналы
Библиотека фронтендера
Библиотека мобильного разработчика
Библиотека хакера
Библиотека тестировщика
Вакансии по фронтенду, джаваскрипт, React, Angular, Vue
Вакансии для мобильных разработчиков
Вакансии по QA тестированию
InfoSec Jobs — вакансии по информационной безопасности
📁Чтобы добавить папку с нашими каналами, нажмите 👉сюда👈
Также у нас есть боты:
Бот с IT-вакансиями
Бот с мероприятиями в сфере IT
Мы в других соцсетях:
🔸VK
🔸YouTube
🔸Дзен
🔸Facebook *
🔸Instagram *
* Организация Meta запрещена на территории РФ
👍1
💬 Как реализовать rate limiter на Go?
Rate limiter — это механизм для контроля частоты доступа к определенному ресурсу. В Go для его реализации можно использовать пакет
Один из распространенных подходов к ограничению скорости — использование алгоритма token bucket, который позволяет добавлять фиксированное количество токенов в пакет с фиксированной скоростью. Когда токен извлекается из бакета, скорость добавления токенов временно уменьшается.
Пакет
Затем можно использовать метод
В качестве альтернативы можно использовать метод
Также можно использовать метод
Rate limiter — это механизм для контроля частоты доступа к определенному ресурсу. В Go для его реализации можно использовать пакет
rate
из стандартной библиотеки.Один из распространенных подходов к ограничению скорости — использование алгоритма token bucket, который позволяет добавлять фиксированное количество токенов в пакет с фиксированной скоростью. Когда токен извлекается из бакета, скорость добавления токенов временно уменьшается.
Пакет
rate
предоставляет функцию NewLimiter()
, которую можно использовать для создания нового token bucket rate limiter. Например:
limiter := rate.NewLimiter(rate.Limit(100), 100)
Затем можно использовать метод
limiter.Allow()
, чтобы проверить, доступен ли токен перед выполнением задачи:
if limiter.Allow() {
// выполнение задачи
} else {
// превышен лимит скорости
}
В качестве альтернативы можно использовать метод
limiter.Wait()
, чтобы подождать, пока токен станет доступен:
limiter.Wait()
// выполнение задачи
Также можно использовать метод
limiter.Reserve()
, чтобы зарезервировать токен заранее и выполнить задачу позже.🔥14👍4
Proglib запускает канал Азбука айтишника
Подписывайтесь на наш новый канал про айти для неайтишников — для совсем новичков и тех, кто постоянно взаимодействует с айтишниками.
У нас есть рубрики:
⭐ База — в ней рассказываем про термины из IT простым языком
⭐ Проект — объясняем, из чего состоят айтишные проекты и сколько они могут стоить
⭐ Психология айтишника — тут говорим про софт-скиллы, особенности работы и взаимодействия
👉Подписывайтесь!
Подписывайтесь на наш новый канал про айти для неайтишников — для совсем новичков и тех, кто постоянно взаимодействует с айтишниками.
У нас есть рубрики:
👉Подписывайтесь!
Please open Telegram to view this post
VIEW IN TELEGRAM
💬 Как реализовать reverse proxy на Go?
Reverse proxy — это механизм для перенаправления входящих запросов на другой сервер или сервис. Для реализации на Go можно использовать пакет
В примере входящие запросы на обратный прокси на порту 8000 будут перенаправлены на целевой сервер
Мы также можем настроить поведение обратного прокси, реализовав функцию
📌 Пример настройки функции Director:
Reverse proxy — это механизм для перенаправления входящих запросов на другой сервер или сервис. Для реализации на Go можно использовать пакет
httputil
:
package main
import (
"net/http"
"net/http/httputil"
"net/url"
)
func main() {
targetServer := "example.com"
proxy := httputil.NewSingleHostReverseProxy(&url.URL{
Scheme: "http",
Host: targetServer,
})
http.Handle("/", proxy)
http.ListenAndServe(":8000", nil)
}
В примере входящие запросы на обратный прокси на порту 8000 будут перенаправлены на целевой сервер
example.com
.Мы также можем настроить поведение обратного прокси, реализовав функцию
Director
, которая может быть использована для изменения запроса перед его перенаправлением на целевой сервер.📌 Пример настройки функции Director:
package main
import (
"net/http"
"net/http/httputil"
"net/url"
)
func main() {
targetServer := "example.com"
proxy := httputil.NewSingleHostReverseProxy(&url.URL{
Scheme: "http",
Host: targetServer,
})
proxy.Director = func(req *http.Request) {
req.Header.Set("X-Forwarded-Host", req.Host)
req.Header.Set("X-Origin-Host", targetServer)
req.Host = targetServer
}
http.Handle("/", proxy)
http.ListenAndServe(":8000", nil)
}
👍15❤1
🧑💻 Статьи для IT: как объяснять и распространять значимые идеи
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
💬 Что из себя представляют теги структур в Go?
Теги структур — это аннотации, которые отображаются после типа в объявлении структуры Go. Каждый тег состоит из коротких строк, которым назначены определенные значения.
Они не влияют на саму логику программы, но позволяют контролировать процесс сериализации и десериализации данных, валидацию и многое другое.
Пример использования:
В этом примере к полям структуры
Для работы с этими тегами можно использовать пакет
Теги структур — это аннотации, которые отображаются после типа в объявлении структуры Go. Каждый тег состоит из коротких строк, которым назначены определенные значения.
Они не влияют на саму логику программы, но позволяют контролировать процесс сериализации и десериализации данных, валидацию и многое другое.
Пример использования:
type User struct {
Name string `json:"name"`
Age int `json:"age"`
}
В этом примере к полям структуры
User
добавлены теги json
, которые указывают, как эти поля должны быть сериализованы в JSON. Тег json:"name"
говорит, что поле Name
должно быть представлено как "name"
в JSON, аналогично для поля Age
.Для работы с этими тегами можно использовать пакет
reflect
. Например, чтобы получить значение тега json
для поля Name
, можно использовать:
package main
import (
"fmt"
"reflect"
)
type User struct {
Name string `json:"name"`
Age int `json:"age"`
}
func main() {
p := User{Name: "John Doe", Age: 30}
t := reflect.TypeOf(p)
field, ok := t.FieldByName("Name")
if ok {
fmt.Println(field.Tag.Get("json")) // Выведет: name
}
}
👍22