Computer Science
8.45K subscribers
1 photo
14 links
По всем вопросам: @altmainf

Уважаемый менеджер: @altaiface
Download Telegram
7. Проверка строки на наличие только цифр
Регулярное выражение: ^\d+$
Объяснение:
^ — начало строки.
\d+ — одна или более цифр.
$ — конец строки.
Пример:
let regex = /^\d+$/;
let str = "12345";
console.log(regex.test(str)); // true


8. Поиск всех URL в тексте
Регулярное выражение: \bhttps?:\/\/\S+\b
Объяснение:
https? — соответствует "http" или "https".
:\/\/ — соответствует "://".
\S+ — соответствует одному или более не пробельным символам (весь URL).
Пример:
let regex = /\bhttps?:\/\/\S+\b/g;
let text = "Посетите сайт https://example.com или http://test.com";
console.log(text.match(regex)); // ["https://example.com", "http://test.com"]
Системы контроля версий

1. Git

Тип: Распределённая система контроля версий (DVCS).
Особенности:
• Очень популярна среди разработчиков.
• Каждый разработчик имеет полную копию репозитория, что позволяет работать автономно и эффективно.
• Поддерживает ветвление (branching) и слияние (merging), что позволяет работать над несколькими функциями или исправлениями одновременно.
• Часто используется с сервисами для хостинга репозиториев, такими как GitHub, GitLab и Bitbucket.
• Инструмент командной строки, но также существует множество графических интерфейсов и интеграций с IDE.
Популярные инструменты и сервисы:
- GitHub: Онлайн-платформа для хостинга репозиториев, совместной работы и обмена кодом.
- GitLab: Платформа для разработки и хостинга репозиториев с дополнительными функциями CI/CD.
- Bitbucket: Платформа для хостинга репозиториев, разработанная компанией Atlassian, часто используется в связке с JIRA.

2. Subversion (SVN)
Тип: Централизованная система контроля версий.
Особенности:
• Все изменения хранятся на центральном сервере, и доступ к репозиторию осуществляется через этот сервер.
• Поддерживает создание веток и слияние изменений, но не так гибко, как Git.
• Простой в освоении, поэтому используется в более традиционных и крупных компаниях для сохранения простоты процесса разработки.
• Может быть полезен для проектов, где важен строгий контроль над версионностью и доступом.
Популярные инструменты:
- Apache Subversion: Основной сервер для работы с SVN.
- TortoiseSVN: Популярный клиент для SVN на Windows, который интегрируется с проводником Windows.

3. Mercurial (Hg)
Тип: Распределённая система контроля версий.
Особенности:
• Принципиально схож с Git, но интерфейс проще и более интуитивно понятен.
• Подходит для проектов, где требуется более простая настройка и меньшее количество команд, чем в Git.
• Используется в меньших командах и для меньших проектов, однако всё ещё поддерживает ветвление и слияние.
Популярные инструменты:
- Bitbucket (также поддерживает Mercurial, хотя сейчас он больше ориентирован на Git).
- TortoiseHg: Графический клиент для Mercurial.

4. CVS (Concurrent Versions System)
Тип: Централизованная система контроля версий.
Особенности:
• Одна из старейших систем контроля версий, в настоящее время используется реже из-за своей ограниченности по сравнению с более современными СКВ.
• Хранит все данные на центральном сервере, и доступ к изменениям осуществляется через него.
• Меньше поддерживает сложные операции с ветвлением и слиянием по сравнению с Git или SVN.

5. Perforce (Helix Core)
Тип: Централизованная система контроля версий.
Особенности:
• Применяется в больших проектах с большим количеством данных, таких как видеоигры или большие программные продукты.
• Быстрая и масштабируемая, поддерживает работу с большими бинарными файлами, что делает её популярной в индустрии разработки игр.
• Предоставляет возможности для централизованного контроля версий с высокой производительностью.

6. Bazaar (bzr)
Тип: Распределённая система контроля версий.
Особенности:
• Разработана компанией Canonical (создатель Ubuntu) для работы с проектами с открытым исходным кодом.
• Поддерживает как распределённый, так и централизованный режим работы.
• Хотя она менее популярна, чем Git, её можно интегрировать с другими системами контроля версий.

7. Fossil
Тип: Распределённая система контроля версий.
Особенности:
• Меньше известна, но обладает встроенной поддержкой веб-интерфейса, отслеживания ошибок, обсуждений и управления проектом.
• Простота и гибкость делают её интересной для небольших проектов и команд.
Формальные языки и грамматики
Важные концепты в теории автоматов и теории формальных языков, которые изучают структуры, используемые для описания и анализа различных типов языков, включая языки программирования, естественные языки и другие формализованные системы.



Формальные
языки:
Множество строк (или слов), составленных из алфавита. Алфавит состоит из конечного набора символов, которые называются символами. Язык — это множество слов, построенных из этих символов.

Пример:
• Алфавит: Σ={a,b} (два символа: a и b).
Язык, состоящий из всех строк, содержащих четное количество символов a: L={ϵ,aa,abba,aabaa,…}.

Грамматики
Набор правил, которые определяют, как можно строить строки формального языка из символов алфавита. Грамматики обычно делятся на несколько типов, в зависимости от их мощности и применимости.

1. Бэкусовская форма (Context-Free Grammar, CFG)
Это один из самых популярных типов грамматик. В CFG правила состоят из замен, где левая часть состоит из одного нетерминала, а правая — из последовательности терминалов и нетерминалов.

Пример: Грамматика для арифметических выражений:
E → E + T
E → E - T
E → T
T → T * F
T → T / F
T → F
F → ( E )
F → number
Здесь:
E,T,F — нетерминалы.
+,,,/,(,),number — терминалы.
• Применяя эти правила, мы можем строить выражения, такие как number+number∗number.

2. Грамматики типа 0 (Rug grammar)
Это самая общая форма грамматик, где правила могут быть произвольными, и левые части правил могут содержать несколько символов, в том числе нетерминалы.

3. Грамматики типа 1 (Context-sensitive grammar)
Правила грамматики могут заменять строку, состоящую из нескольких символов, только если на определенной позиции в строке находится подходящий контекст.

4. Грамматики типа 2 (Context-free grammar)
В этих грамматиках правила заменяют один нетерминал на строку из терминалов и нетерминалов, не завися от контекста. Это наиболее популярный тип грамматик, применяемых в компиляторах и других системах.

5. Грамматики типа 3 (Regular grammar)
Самые простые грамматики, где правила имеют ограниченную форму. Например, они могут быть описаны с помощью регулярных выражений.
Типы формальных языков
Существует несколько типов формальных языков, каждый из которых определяется своей грамматикой:

• Регулярные языки: Их можно описать с помощью регулярных выражений или конечных автоматов. Пример: язык всех строк, содержащих хотя бы одну букву "a".

• Контекстно-свободные языки: Их можно описать с помощью контекстно-свободных грамматик. Пример: язык правильно сбалансированных скобок.

• Контекстно-зависимые языки: Языки, которые требуют контекста для замены символов в строках. Эти языки могут быть описаны с помощью контекстно-зависимых грамматик.

• Рекурсивно перечислимые языки: Это самые общие языки, которые могут быть описаны алгоритмом.
Применение формальных языков и грамматик

• Программирование: Формальные грамматики используются для определения синтаксиса языков программирования. Например, грамматика Python или C++ определяет, какие конструкции допустимы в этих языках.

• Обработка естественного языка: Формальные языки применяются в лингвистике для анализа и синтаксического разбора предложений.

• Автоматы: Формальные языки тесно связаны с теориями автоматов, такими как конечные автоматы и стековые автоматы.

• Системы компиляции: Грамматики важны для создания компиляторов, которые могут анализировать исходный код и трансформировать его в машинный код.
DevSecOps — интеграция практик безопасности в процесс разработки программного обеспечения и операционных процессов, который часто используется в рамках подхода DevOps. Термин состоит из трех частей:

Dev — разработка (Development)
Sec — безопасность (Security)
Ops — операционные процессы (Operations)

Идея DevSecOps заключается в том, чтобы обеспечивать безопасность на всех этапах разработки и эксплуатации ПО, а не только в конце, когда продукт уже готов. Это подход, который встраивает процессы безопасности в непрерывную интеграцию (CI), непрерывное развертывание (CD) и управление инфраструктурой.


Основные принципы DevSecOps:

• Интеграция безопасности с самого начала: Вместо того чтобы "добавлять" безопасность в конце процесса разработки, её рассматривают как неотъемлемую часть всего жизненного цикла разработки.

• Автоматизация процессов безопасности: Использование инструментов для автоматического тестирования и проверки кода на наличие уязвимостей.

• Обратная связь в реальном времени: Разработчики получают уведомления о потенциальных проблемах безопасности во время написания и тестирования кода, что позволяет быстро их устранять.

• Совместная работа команд: DevSecOps способствует тесному взаимодействию между командами разработчиков, специалистов по безопасности и операционными командами для обеспечения качественного и безопасного ПО.

• Постоянная защита и мониторинг: Мониторинг безопасности осуществляется на всех этапах разработки и эксплуатации.
В DevSecOps используется ряд инструментов для автоматизации и улучшения процессов обеспечения безопасности на разных этапах разработки, тестирования и эксплуатации ПО.

Здесь, (и далее в постах) основные категории инструментов, применяемые в DevSecOps:

Инструменты для статического анализа кода (SAST)

Эти инструменты анализируют исходный код программы на наличие уязвимостей до его компиляции или выполнения.

• SonarQube: Анализирует качество кода, находит ошибки, уязвимости и плохие практики программирования.

• Checkmarx: Проводит статический анализ для выявления уязвимостей на уровне исходного кода.

• Fortify: Инструмент для анализа безопасности на разных уровнях разработки, включая статический анализ кода.

• Veracode: Обеспечивает анализ безопасности на уровне исходного кода, а также на уровне скомпилированных приложений.
Инструменты для динамического анализа приложений (DAST)

Эти инструменты проверяют приложение в рабочем состоянии, имитируя атаки, чтобы выявить уязвимости.

• OWASP ZAP (Zed Attack Proxy): Один из самых популярных инструментов для динамического тестирования безопасности веб-приложений.

• Burp Suite: Мощный инструмент для тестирования безопасности веб-приложений, включая перехват запросов и сканирование на уязвимости.

• Acunetix: Инструмент для автоматического сканирования веб-приложений на наличие уязвимостей, таких как XSS или SQL-инъекции.
Инструменты для анализа инфраструктуры как кода (IaC)

Эти инструменты позволяют проверять конфигурации инфраструктуры на наличие уязвимостей до её развертывания.

• Terraform (с плагином Terraform Sentinel): Инструмент для управления инфраструктурой как кодом с возможностью интеграции политик безопасности.

• CloudFormation (с CloudFormation Guard): Инструмент AWS для работы с IaC, который позволяет проверять безопасность конфигураций.

• Checkov: Открытый инструмент для проверки безопасности конфигураций в Terraform, CloudFormation и других IaC шаблонах.

• Kics (Keeping Infrastructure as Code Secure): Открытый инструмент для сканирования шаблонов IaC на наличие уязвимостей.
Инструменты для мониторинга безопасности

Эти инструменты помогают отслеживать угрозы безопасности в реальном времени, а также анализировать логи и события.

• Splunk: Платформа для анализа данных и мониторинга безопасности, которая может обрабатывать огромные объемы логов в реальном времени.

• Prometheus + Grafana: Используются для мониторинга состояния приложений и инфраструктуры, включая выявление аномалий.

• ELK Stack (Elasticsearch, Logstash, Kibana): Система для сбора, хранения, анализа и визуализации логов, что помогает выявлять проблемы с безопасностью.

• Datadog: Обеспечивает мониторинг приложений и инфраструктуры, включая управление безопасностью и анализ логов.
Инструменты для сканирования уязвимостей контейнеров и образов

В DevSecOps важен контроль за безопасностью контейнеров и образов, так как они широко используются в процессе CI/CD.

• Aqua Security: Платформа для безопасности контейнеров, Kubernetes и облачной инфраструктуры.

• Anchore: Инструмент для анализа и проверки Docker-образов на наличие уязвимостей.

• Trivy: Инструмент для сканирования контейнеров и облачных сервисов на наличие уязвимостей.

• Clair: Проект с открытым исходным кодом для анализа безопасности Docker-образов.
Инструменты для автоматизации CI/CD с учетом безопасности

Эти инструменты интегрируют безопасность в процесс CI/CD, автоматически выявляя и устраняя уязвимости на всех этапах разработки.

• Jenkins (с плагинами безопасности): Популярный инструмент для автоматизации CI/CD, который поддерживает различные плагины для тестирования безопасности.

• GitLab CI/CD (с интеграцией безопасности): Платформа для DevOps, которая позволяет интегрировать процессы безопасности в пайплайны.

• CircleCI: Платформа для автоматизации CI/CD, которая может быть настроена для выполнения проверок безопасности.

• GitHub Actions: Инструмент для автоматизации рабочих процессов на GitHub, поддерживает интеграцию с инструментами безопасности.
Инструменты для управления "секретами" и идентификацией

Эти инструменты обеспечивают безопасность хранения и обработки секретов, таких как пароли, ключи API и другие чувствительные данные.

• HashiCorp Vault: Решение для управления секретами и чувствительными данными, позволяющее безопасно хранить и контролировать доступ к ключам и конфиденциальной информации.

• CyberArk: Платформа для управления привилегированными доступами и секретами.

• AWS Secrets Manager: Сервис для управления и автоматической смены секретов, таких как API-ключи и пароли в AWS.
Инструменты для управления уязвимостями

Эти инструменты помогают отслеживать и управлять уязвимостями на всех этапах разработки и эксплуатации.


• Snyk: Платформа для мониторинга уязвимостей в зависимостях и контейнерах, а также в инфраструктуре как код.

• Dependabot: Инструмент от GitHub, который автоматически создает pull-запросы для обновления зависимостей, когда обнаруживаются уязвимости.

• WhiteSource: Платформа для управления безопасностью open-source компонентов, включая их уязвимости и лицензионные проблемы.
Инструменты для управления политиками безопасности

Эти инструменты помогают контролировать соблюдение политик безопасности в процессе разработки и эксплуатации.

• OPA (Open Policy Agent): Открытый агент для управления политиками, который можно интегрировать в разные этапы DevOps-пайплайнов.

• Kubernetes RBAC: Управление доступом на основе ролей (Role-Based Access Control) в Kubernetes для контроля безопасности.

Эти инструменты ([1], [2], [3], [4], [5], [6], [7], [8], [9]), в сочетании с процессами DevOps и практиками безопасности, помогают создавать безопасные и надежные программные решения, снижая риски и улучшая общую безопасность на всех этапах разработки и эксплуатации.
Алгоритмы сортировок

Самая частая тема, которую спрашивают на собеседованиях. Рассмотрим, какие есть и их сложность по времени. Подробно как они работают, по ссылкам в соответствующих постах.

 1. Сортировка пузырьком 
Худшее время - O(n^2) | Лучшее время - O(n)

2. Сортировка выбором
Лучшее время O(n^2) | В cреднем - O(n^2) | Худшее время - O(n^2)

3. Сортировка подсчётом
Сложность оценивается как O(n + k), где n — количество элементов, k — диапазон значений.

4. Поразрядная сортировка
В лучшем случаи: O(n) | В худшем: O(n*k)

5. Bucket sort
Наименьшая и средняя сложность (O(n))

6.
Сортировка Шелла
В лучшем случаи: O(n) | В cреднем: O(n (logn)^2) | В худшем: O(n log^2n)

7.
Tim Sort
В лучшем случаи: O(n) | В cреднем: O(n logn) | В худшем: O(n logn)

8. Блинная сортировка
Лучший случай: O(n) | Средний случай: O(n²) | Худший случай: O(n²)

9.
Сортировка перемешиванием 
Худшее время - O(n^2) | Лучшее время - O(n)

10. Gnome Sort
В лучшем: O(n) | В худшем: O(n^2)

11. Odd-Even Sort
В лучшем: O(n)
В худшем: O(n^2)

12. Сортировка расческой 
Худшее время - O(n^2) | Лучшее время - O(n log n)

13. Сортировка вставками 
Худшее время - O(n^2) | Лучшее время - O(n) или O(1)

14. Голубиная сортировка
Время: O(n+range)

15. Циклическая сортировка
Время: O(n^2)

16. Нитевидная сортировка
В лучшем: O(n) | В худшем: O(n^2)

17. Битоническая сортировка
Время: O(log^2n)

18. Stooge Sort
Время: O(n^(log3/log1.5))

19. Бисерная сортировка
Время: O(n^2)

20. Топологическая сортировка
Время: O(V + E)

21. Быстрая сортировка 
Худшее время - O(n^2) | Лучшее время - O(n log n) 

22. Сортировка слиянием 
Худшее время - O(n log n) | Лучшее время - O(n log n) 

23. Пирамидальная сортировка 
Худшее время - O(n log n) | Лучшее время - O(n log n) или O(n)
Аппликативный порядок вычислений

Аппликативный порядок вычислений - это порядок вычислений, при котором аргументы функции вычисляются перед самой функцией. Он также называется "строгим" порядком вычислений.

Например, если есть выражение:

f(x) + g(x)

то при аппликативном порядке вычислений сначала вычисляются значения x, а затем функции f и g, после чего производится сложение. То есть, сначала выполняется f(x), затем g(x), и только после этого выполняется сложение.

Аппликативный порядок вычислений часто используется в языках программирования, таких как С или Pascal.
Библиотеки и фреймворки для ИИ в Linux

Linux предлагает широкий выбор библиотек и фреймворков для разработки ИИ:

1. TensorFlow
Один из самых популярных фреймворков для машинного обучения. Он используется для создания, тренировки и развертывания моделей ИИ, включая нейронные сети.

2. PyTorch
Используется для научных исследований и разработки ИИ-приложений. PyTorch отличается гибкостью и удобством, особенно для проектов, требующих высокой кастомизации.

3. Keras
Высокоуровневый API для нейронных сетей, работающий поверх TensorFlow, который делает разработку моделей ИИ более доступной и понятной.

4. OpenCV
Библиотека для компьютерного зрения. Используется для обработки изображений и видео в реальном времени, а также для распознавания объектов и лиц.

5. scikit-learn
Платформа для обучения алгоритмам машинного обучения, предоставляющая большое количество инструментов для анализа данных и построения моделей.
Теория информации — раздел математики и информатики, который занимается количественной оценкой информации, её передачей и кодированием. Этот раздел был основан в середине 20-го века Клодом Шенноном, чьи работы стали основой для многих современных технологий, включая телекоммуникации, сжатие данных, криптографию и многое другое.

Здесь и далее будет приведено несколько ключевых понятий и аспектов теории информации:

1. Информация и энтропия

Информация — то, что уменьшает неопределенность. В контексте теории информации информация измеряется в битах.

Энтропия (H) — мера неопределенности или неопределенности системы. В информационном контексте энтропия определяет, сколько информации нужно для того, чтобы описать выбор одного из возможных исходов. Чем больше возможных исходов, тем выше энтропия.

Энтропия для дискретного случайного события 𝑋 с вероятностями 𝑝₁, 𝑝₂, ..., 𝑝𝑛 вычисляется по формуле:
H(X) = −Σ [𝑛, ᵢ₌₁] (pᵢ log₂(pᵢ))

где 𝑝𝑖 — вероятность 𝑖-го исхода, а сумма берется по всем возможным исходам.

Энтропия измеряется в битах, если логарифм вычисляется по основанию 2. Это связано с тем, что каждый бит представляет собой двоичный выбор между двумя возможными состояниями.
Пример Энтропии, как меры неопределенности: Если мы подбрасываем честную монету, вероятность выпадения орел или решка равна 50%. Энтропия будет максимальной, так как оба исхода одинаково вероятны.

2. Канал передачи информации

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

Пример: при передаче текста через интернет могут быть потеряны некоторые символы из-за шума в сети, что приведет к искажению сообщения.