Warning: Undefined array key 0 in /var/www/tgoop/function.php on line 65

Warning: Trying to access array offset on value of type null in /var/www/tgoop/function.php on line 65
426 - Telegram Web
Telegram Web
🤯 Как простая задачка поставила в тупик программистов (и как они из него выбрались)

В 2010 году пользователь Stack Overflow не справился с задачей на собеседовании. Обсуждение способов решения этого задания стало одной из самых популярных тем на платформе.

Об этой истории, а также о способах решения задачи, читайте в нашей статье
👉 Ссылка
👉 Зеркало
🥱4
💬 Что означает понятие false sharing?

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-теоремы
7👍3
⚡️Proglib запускает канал про ИИ в сфере видео

Вот несколько топовых постов за последнее время:

⭐️Инструмент, который сам делает короткие вертикальные видео из ваших длинных роликов, например, на ютуб
⭐️Подборка нейро-генераторов видео с пробным периодом
⭐️Анонс ИИ-«нетфликса», который будет штамповать вам мультики по запросам

👉Подписывайтесь!
Please open Telegram to view this post
VIEW IN TELEGRAM
💬 Почему использование time.After для установки таймаутов может привести к утечке памяти в Go. Как можно предотвратить эту проблему?

Использование 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
👍211
💡 Если у вас запущено множество локальных серверов, и вам надоело обращаться к ним как 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
🎮Новый канал по разработке игр

Мы наконец-то запустили канал по разработке игр — теперь все самое важное и полезное из мира геймдева можно узнать в одном месте.

👉Подписаться
Please open Telegram to view this post
VIEW IN TELEGRAM
💬 Что такое свойство ACID в базе данных?

ACID — это набор свойств, обеспечивающих надежную обработку транзакций в СУБД. Аббревиатура расшифровывается следующим образом:

🔸 Атомарность (Atomicity): гарантирует, что каждая транзакция либо полностью завершится, либо не выполнится вообще. Транзакция представляет собой единое логическое действие с данными, которое либо выполняется целиком, либо не выполняется вовсе («всё или ничего»).
🔸 Согласованность (Consistency): обеспечивает соответствие данных всем установленным правилам и ограничениям. Это означает, что после завершения транзакции все данные будут в допустимом состоянии.
🔸 Изолированность (Isolation): обеспечивает независимость выполнения транзакций, предотвращая их взаимное влияние. Это означает, что результаты выполнения одной транзакции не будут видны другим транзакциям до её завершения.
🔸 Долговечность или стойкость (Durability): обеспечивает сохранение результатов подтвержденных транзакций даже в случае сбоев.

В базах данных, соответствующих принципу ACID, данные сохраняют целостность и согласованность независимо от возможных ошибок.

Некоторые NoSQL базы данных оптимизированы для высокой доступности в кластере, что может потребовать компромиссов по части согласованности или долговечности данных. Тем не менее, существуют NoSQL БД, такие как MarkLogic, OrientDB и Neo4j, которые поддерживают ACID-свойства.
👍6
💬 Назовите ключевые недостатки рефлексии в Go.

🔸 Ошибки рефлексии не могут быть обнаружены во время сборки и появляются в виде сообщений об ошибке (паник) уже во время выполнения. Другими словами, они потенциально могут привести к аварийному завершению программы.
🔸 Go-код, использующий рефлексию, замедляет программу. Если смотреть более широко, Go-код, который работает с определенным типом данных, всегда быстрее, чем Go-код, который использует рефлексию для динамической работы с любым типом данных Go. Кроме того, такой динамический код затрудняет рефакторинг или анализ кода с помощью специальных инструментов.
🔸 Широкое использование рефлексии затрудняет чтение и поддержку кода. Потенциальное решением этой проблемы — документирование.
👍84🥱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 запрещена на территории РФ
👍1
💬 Как реализовать rate limiter на Go?

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 можно использовать пакет 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)
}
👍151
🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи

Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.

Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.

Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.

👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
💬 Что из себя представляют теги структур в 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
💬 Как создать кэш на Go?

Кэш — это инструмент, который сохраняет данные в памяти, чтобы их можно было быстро получить позже. На Go можно создать кэш с использованием пакета sync или сторонних библиотек вроде go-cache:


package main

import (
"fmt"
"sync"
)

func main() {
// создаем новый кэш
cache := &sync.Map{}

// добавляем пару ключ-значение в кэш
cache.Store("key", "value")

// извлекаем значение из кэша
value, ok := cache.Load("key")
if ok {
fmt.Println(value) // Output: value
}

// удаляем ключ из кэша
cache.Delete("key")

// проверяем, существует ли ключ в кэше
_, ok = cache.Load("key")
fmt.Println(ok) // Output: false
}


В примере мы создаем новую структуру sync.Map и используем функции Store(), Load(), Delete() для добавления, извлечения и удаления пар ключ-значение из кэша соответственно.
🥱15😢3👍1
💬 Что происходит при запуске программы на Go? Например, если пакет main импортирует пакет A, а пакет A зависит от пакета B.

🔸 Процесс начинается с пакета main
🔸 Пакет main импортирует пакет A
🔸 Пакет A импортирует пакет B
🔸 Инициализируются глобальные переменные (если таковые имеются) в пакете B
🔸 Выполняется функция init() или функции пакета B, если они существуют. Это первая функция init(), которая выполняется
🔸 Глобальные переменные, если таковые имеются, в пакете A инициализируются
🔸 Выполняется функция init() или функции пакета A, если таковые имеются
🔸 Инициализируются глобальные переменные в пакете main
🔸 Выполняется функция init() или функции пакета main, если они есть
🔸 Функция main() пакета main начинает выполнение

📌 Если пакет main импортирует пакет B самостоятельно, то ничего не произойдет, поскольку все, что связано с пакетом B, запускается пакетом A. Так происходит потому, что пакет A сначала импортирует пакет B.
👍24🥱6🔥1
Ответьте на 3 вопроса, чтобы получить вводные занятия к курсу «Алгоритмы и структуры данных»

🔥Получите вводные занятия, ответив на 3 вопроса – https://proglib.io/w/c2161ff4

На вводной части вас ждут:

1. Лекция «Производительность алгоритмов» от руководителя разработки Яндекс.Самокатов

2. Лекция «Итеративные сортировки и линейные сортировки» от аспирант департамента искусственного интеллекта ВШЭ

3. Практические задания после лекций

4. Ссылки на дополнительные материалы для самостоятельного изучения

⚡️Переходите и начинайте учиться уже сегодня – https://proglib.io/w/c2161ff4
Please open Telegram to view this post
VIEW IN TELEGRAM
2025/07/12 18:20:51
Back to Top
HTML Embed Code: