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
381 - Telegram Web
Telegram Web
💬 Почему crypto/rand в некоторых кейсах предпочтительнее использовать вместо math/rand для генерации ключей в Go?

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

Пакет math/rand отлично подходит для генерации псевдослучайных чисел. Но у этого метода есть серьезный недостаток: если кто-то узнает, как генерируются числа (начальное значение seed), он сможет предсказать будущие числа.


import "math/rand"

func Key() string {
// rand.Seed(time.Now().UnixNano()) // deprecated
r := rand.New(rand.NewSource(time.Now().UnixNano()))

buf := make([]byte, 16)

for i := range buf {
buf[i] = byte(r.Intn(256))
}

return fmt.Sprintf("%x", buf)
}


Даже если мы инициализируем генератор с чем-то вроде текущего времени, уровень непредсказуемости или энтропии будет довольно низким. Это происходит потому, что вариации времени между запусками незначительны.

С другой стороны, crypto/rand предлагает лучшее решение для генерации чисел, которые криптографически безопасны. Эта библиотека разработана для полной непредсказуемости, используя источники случайности, предоставляемые ОС, которые обычно гораздо сложнее предсказать.


import "crypto/rand"

func Key() string {
buf := make([]byte, 16)

_, err := rand.Read(buf)
if err != nil {
panic(err)
}

return fmt.Sprintf("%x", buf)
}


Использование crypto/rand особенно необходимо для операций, таких как шифрование, аутентификация или любой другой контекст, где безопасность имеет критическое значение.

Опять же, если мы генерируем ключи для целей, не связанных с безопасностью, math/rand вполне подойдет.
👍114
💬 Когда процесс в Linux может не реагировать на SIGKILL?

🔸 Когда процесс является зомби-процессом, который уже завершился, но не освободил свои ресурсы. Зомби не может принимать сигналы и ожидает, что его родительский процесс считает его статус с помощью системного вызова wait.
🔸 Когда процесс находится в состоянии блокировки. Он выполняет неотменяемый системный вызов, такой как ожидание ввода-вывода или другого события, которое не наступило. Процесс не может завершиться, пока операционная система не вернет его в нормальное состояние.
🔸 Когда процесс является процессом init. Он не получает от ОС сигналов, которые не хочет обрабатывать. Процесс init может игнорировать SIGKILL, так как он является особым процессом, который отвечает за запуск и завершение других процессов.
👍13❤‍🔥2
📖 ТОП-10 книг о том, как правильно построить карьеру в IT

Хотите преуспеть в IT? Ознакомьтесь с нашим списком лучших книг, которые помогут вам выстроить успешную карьеру в этой динамичной отрасли!

Читать статью, чтобы ознакомиться со всеми книгами 👉 https://proglib.io/sh/glq68BCSKj
👍1
💬 Что такое статическая компиляция/линковка и в чем ее особенности?

Линковка (или компоновка) — это последний этап сборки программы, когда все скомпилированные части кода и библиотеки объединяются в один исполняемый файл. Статически слинкованный исполняемый файл не зависит от наличия других библиотек в системе во время своей работы, так как все необходимые библиотеки встраиваются в итоговый бинарный файл.

Для включения статической компиляции/линковки в Go необходимо установить переменную окружения CGO_ENABLED=0 при сборке (т. е. `CGO_ENABLED=0 go build ...`). Это гарантирует, что все внешние библиотеки, от которых зависит выполнение кода, будут встроены в итоговый бинарный файл. Полученный бинарный файл можно использовать, например, в Docker-образе, основанном на scratch (т.е. не содержащем никаких файлов, чистая файловая система).

Однако, это накладывает некоторые ограничения и привносит особенности, которые необходимо помнить:

1. C-код будет недоступен. Некоторые модули из стандартной библиотеки Go зависят от C-кода, но они не являются критичными.
2. Не будет использоваться системный DNS-резольвер: Go будет использовать собственный DNS-резолвер.
3. Проблемы с проверкой x.509 сертификатов на MacOS: в некоторых случаях проверка x.509 сертификатов может не работать корректно.

Если итоговый бинарный файл планируется использовать в Docker-образе scratch, то также следует учитывать:

1. Корневые SSL/TLS сертификаты: для осуществления HTTP запросов по протоколу HTTPS нашему приложению, в образ нужно будет поместить корневые SSL/TLS сертификаты в /etc/ssl/certs.
2. Файл временной зоны: для корректной работы с датой и временем необходимо добавить файл временной зоны в /etc/timezone.
👍161
🖼️ Видеогайд про внутреннее устройство планировщика Go от Владимира Балуна

Таймкоды:

00:00 — Введение
03:00 — Потоки операционной системы
07:34 — Легковесные потоки
10:16 — Основные концепции рантайма Go
15:21 — Масштабирование рантайма Go
18:45 — Локальные очереди
21:45 — Work sharing и work stealing
26:08 — Syscalls в планировщике Go
27:41 — Handoff
34:50 — Netpoller
37:33 — Очереди в планировщике Go
42:28 — Примитивы синхронизации
48:57 — Циклы
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15
💬 Что значит work sharing и work stealing в контексте планировщика в Go?

Задача планировщика в Go — распределять запущенные горутины между потоками ОС, которые могут исполняться одним или большим количеством процессоров. В многопоточных вычислениях возникли две парадигмы в планировании: делиться задачами (work sharing) и красть задачи (work stealing).

🔹 Work-sharing: когда процессор генерирует новые потоки, он пытается мигрировать их на другие процессоры, в надежде, что они попадут к простаивающему или недостаточно нагруженному процессору.
🔹 Work-stealing: недостаточно нагруженный процессор активно ищет потоки других процессоров и «крадет» некоторые из них.

Миграция потоков происходит реже при work stealing подходе, чем при work sharing. Когда все процессоры заняты, потоки не мигрируют. Как только появляется простаивающий процессор, рассматривается вариант миграции.

В Go начиная с версии 1.1 планировщик реализован по схеме work stealing.
👍8
🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи

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

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

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

👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
💬 Каковы основные отличия HTTP/3 от предыдущих версий HTTP (HTTP/1.1 и HTTP/2)?

HTTP/3 отличается от HTTP/1.1 и HTTP/2 несколькими ключевыми аспектами:

1. Транспортный протокол:

🔸 HTTP/1.1 и HTTP/2: оба используют TCP для передачи данных. TCP обеспечивает надежную доставку, но может страдать от задержек при потере пакетов из-за необходимости восстановления всего потока данных.
🔸 HTTP/3: использует протокол QUIC (Quick UDP Internet Connections), который построен поверх UDP. QUIC обеспечивает быструю и надежную доставку данных с меньшими задержками, т. к. каждый пакет обрабатывается независимо.

2. Установка соединения:
🔸 HTTP/1.1 и HTTP/2: для установки соединения требуется несколько этапов, включая установку TCP соединения и выполнение TLS рукопожатия.
🔸 HTTP/3: снижает задержки при установке соединения за счет одновременного выполнения рукопожатия QUIC и TLS, что позволяет начать передачу данных быстрее.

3. Управление задержками и потерями пакетов:
🔸 HTTP/1.1 и HTTP/2: при потере пакета в TCP соединении, весь поток данных останавливается до тех пор, пока потерянный пакет не будет восстановлен, что увеличивает задержки.
🔸 HTTP/3: QUIC минимизирует влияние потери пакетов, т. к. каждый поток данных внутри соединения обрабатывается независимо. Это означает, что потеря одного пакета не блокирует другие потоки данных.

4. Мультиплексирование:
🔸 HTTP/1.1: не поддерживает мультиплексирование, каждый запрос требует отдельного соединения.
🔸 HTTP/2: поддерживает мультиплексирование, позволяя отправлять несколько запросов и ответов через одно соединение.
🔸 HTTP/3: также поддерживает мультиплексирование, но делает это более эффективно благодаря особенностям QUIC.

📌 Подробнее:

🔗 Cloudflare: What is HTTP/3?
🔗 Google: HTTP/3 Explained
11👍1
💬 Как развернуть односвязный список в 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.
🔸 Использование: приложения, требующие высокой согласованности и масштабируемости.
5👍2😁1
🖼️ А как бы вы её решили?👇
Please open Telegram to view this post
VIEW IN TELEGRAM
2025/07/13 15:47:43
Back to Top
HTML Embed Code: