Как стать автором
Обновить
4
0

Пользователь

Отправить сообщение

Notion – это офисный плен! Объясняю, как выбраться с помощью Obsidian

Уровень сложностиПростой
Время на прочтение6 мин
Количество просмотров38K

Полгода назад Notion ушёл из России, оставив многих пользователей без удобного инструмента для работы и ведения заметок. Использовать VPN? Не вариант — продуктивность сразу падает. Я тоже столкнулся с этой проблемой, но вместо того, чтобы искать обходные пути, я решил найти достойную замену.

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

Читать далее

Линейный криптоанализ. Как работает современное шифрование. Часть 1/2

Уровень сложностиСредний
Время на прочтение5 мин
Количество просмотров3.4K

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

В качестве изучаемого шифра возьмем сильно упрощенную версию шифра DES и AES. Шифр AES является одним из самых распространённых алгоритмов симметричного шифрования. Любой современный процессор поддерживает аппаратное ускорение алгоритма AES.

Читать далее

Ложные убеждения о нулевых указателях

Время на прочтение10 мин
Количество просмотров6.7K
В этой статье предполагается, что вы знаете, что такое неопределённое поведение, и почему его не следует провоцировать, в самом общем виде знаете, как работают процессоры, а также умеете принимать во внимание конкретный контекст, не злоупотребляя излишним обобщением частностей. Эти убеждения можно считать заблуждениями, так как они не применяются глобально, а не потому, что обратное от них действует глобально. Если вы не уверены в себе, то, возможно, от прочтения этого текста вы больше проиграете, тем самым подпортив себе навыки программной инженерии. Поэтому ничего страшного, если вы не будете знакомиться с постом, а просто почитаете комментарии на Reddit — там уже написали, что может пойти не так, если вы, несмотря ни на что, углубитесь в этот материал.

На первый взгляд нулевые указатели кажутся простыми, и именно поэтому они так опасны. По мере того, как накапливаются компиляторные оптимизации, логичные на первый взгляд, но неверные упрощения, а также причуды конкретных платформ, вы всё сильнее рискуете сделать неверное допущение. Из-за этого в коде множатся баги и уязвимости.
Читать дальше →

Как программируют народы, или взгляд программиста на современные социальные технологии

Уровень сложностиПростой
Время на прочтение16 мин
Количество просмотров8.8K

Так получилось, что я около 10 лет проработал системным аналитиком в социологических и маркетинговых агентствах. Профессиональным социологом/маркетологом я не стал. Но, длительное время формулируя детальнейшие ТЗ, регулярно общаясь с соответствующими специалистами, сложил о данной предметной области некоторое представление. Возможно, Вам будет интересно его узнать. Когнитивный диссонанс гарантирую! Поехали...

Читать далее

Использование неполных объявлений в C++

Уровень сложностиСредний
Время на прочтение15 мин
Количество просмотров5.2K


Продолжаем серию «C++, копаем вглубь». Цель этой серии — рассказать максимально подробно о разных особенностях языка, возможно довольно специальных. Это восьмая статья из серии, список предыдущих статей приведен в разделе 6.


C++ относится к языкам со статической типизацией, то есть тип переменных определяется на стадии компиляции, но в ряде случаев компилятору для компиляции без ошибок достаточно знать, что то или иное имя является именем какого-то пользовательского типа (класса, структуры, объединения, перечисления), а полное объявление типа не нужно. В этом случае можно использовать неполное объявление (incomplete declaration), называемое еще упреждающим или предваряющим (forward declaration). Типы с неполным объявлением называются неполными.


Использование неполных объявлений позволяет решить ряд проблем, традиционно свойственных коду, написанному на С++. Отметим следующие:


  1. Можно уменьшить количество включений заголовочных файлов в другие файлы проекта, что сокращает время компиляции, снижает замусоривание пространств имен неиспользуемыми именами, предупреждает потенциальные конфликты имен;
  2. Можно реализовать решения, полностью разделяющие интерфейс и реализацию (непрозрачные указатели);
  3. Можно разрывать циклические зависимости;
  4. Можно снизить использование нетипизированных указателей void*, что повышает надежность и читаемость кода.

Грамотное использование неполных объявлений — один из признаков профессионального кода.

Читать дальше →

Пишем HTTP-сервер на чистом C

Уровень сложностиПростой
Время на прочтение3 мин
Количество просмотров12K

Привет, Хабр!

Сегодня будем писать HTTP-сервер на C. Если когда-нибудь вас заставят написать сервер без libcurl, boost::asio или microhttpd, вы будете готовы.

Читать далее

Как malloc() и free() управляют памятью в C

Уровень сложностиПростой
Время на прочтение8 мин
Количество просмотров18K

Привет, Хабр!

Сегодня рассмотрим, почему free() не всегда освобождает память, как работает malloc(), когда glibc действительно возвращает память в ОС, и как избежать фрагментации хипа. А так же напишем кастомный аллокатор.

Читать далее

Лучшие Образцы Си Кода

Уровень сложностиПростой
Время на прочтение6 мин
Количество просмотров15K

Я долгое время негодовал по поводу того, что часто приходится копаться в плохо оформленном коде .

Но теперь я решил сделать рефрейминг. Отныне я коллекционирую такие куски кода! Да. Теперь каждая причудливая функция приносит мне искреннюю радость так, как пополняет ценнейшую коллекцию того, как не надо делать.

Читать далее

Психология разработки: как когнитивные искажения влияют на архитектурные решения и качество кода (часть 1)

Уровень сложностиПростой
Время на прочтение10 мин
Количество просмотров5.7K

"Это простой фикс, займет максимум час", — говорите вы в пятницу днем. В понедельник вечером вы всё ещё боретесь с тем же багом, проклиная свой оптимизм и чувствуя, как горит дедлайн.

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

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

Читать далее

О формальном доказательстве безопасной работы с памятью на основе «владения и заимствования»

Уровень сложностиСредний
Время на прочтение6 мин
Количество просмотров3K


Некоторое время назад я попробовал найти формальное доказательство безопасной работы с памятью, которое реализовано в Rust, но так и не смог его найти. После чего у меня сложилось впечатление, что доказательство в формальном виде и вовсе отсутствует, а вся концепция безопасного управления памятью на основе "владения и заимствования" формально не доказана и держится только на честном слове.


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


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

Читать дальше →

5 алгоритмов на Rust, которые должен знать каждый разработчик

Уровень сложностиПростой
Время на прочтение14 мин
Количество просмотров15K

Привет, Хабр!

Кто-то приходит в Rust ради безопасной работы с памятью, кто-то — ради скорости, а кто-то просто потому, что «все нормальные языки уже попробовал». Но что бы ни привело вас в этот уголок низкоуровневой мощи, без хорошего знания алгоритмов далеко не уедешь.

Писать код на Rust — это не просто бороться с borrow checker, но и делать его действительно эффективным. Ведь никакой язык не спасет от тормозов, если алгоритмы выбраны неудачно.

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

Читать далее

Линейная алгебра в C++ с Eigen

Время на прочтение9 мин
Количество просмотров6.6K

Привет, Хабр!

Кто хоть раз пытался работать с матрицами в C++, знает, что это удовольствие сродни написанию своего STL — возможно, но зачем? Eigen — это библиотека, которая избавит вас от ручного управления памятью, оптимизирует вычисления и позволит писать код, похожий на чистую математику. Поэтому в этой статье мы разберем эту прекрасную библиотеку.

Читать далее

Брокер сообщений на Rust

Уровень сложностиПростой
Время на прочтение7 мин
Количество просмотров4K

Всем привет.

Написал бессерверный брокер сообщений, кому интересно прошу под кат.

Читать далее

Функции, замыкания и функциональное программирование в Rust: полное руководство

Уровень сложностиСредний
Время на прочтение20 мин
Количество просмотров5.4K

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

Читать далее

Функция Кантора: «дьявольская лестница» в математическом анализе

Уровень сложностиСредний
Время на прочтение11 мин
Количество просмотров9.2K

Функция Кантора — удивительный математический объект, который бросает вызов интуиции: она непрерывна, но нигде не дифференцируема, её производная равна нулю почти всюду, но сама функция при этом возрастает от 0 до 1. В этой статье мы разберём её построение, математические свойства, связь с фракталами, теорией меры и вероятностными распределениями. Также рассмотрим неожиданные параллели с машинным обучением: от генерации разреженных данных до тестирования градиентных методов. 

Читать далее

Три мысленных эксперимента, разрушающих структуру пространства-времени

Время на прочтение4 мин
Количество просмотров49K

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

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

Три мысленных эксперимента, показывающих нефундаментальность пространства-времени, кружат голову. Один показывает, что существует минимальный масштаб длины, ниже которого никакой эксперимент не может дать результат. Другой раскрывает, что ни одно физическое свойство — длина, масса, скорость или что‑либо иное — не может быть измерено с абсолютной точностью с близкого расстояния. История научила физиков не игнорировать такие слепые пятна, потому что ситуации, которые невозможно наблюдать, могут не быть фундаментальными.

«Мы не можем полагаться на что‑то, чего фактически нет и чему нельзя операционно придать значение», — сказал Нима Аркани‑Хамед, физик из Института перспективных исследований.

Читать далее

Qucs-S: руководство по видам моделирования, часть 3

Время на прочтение9 мин
Количество просмотров2.8K

Qucs-S является программой с открытым исходным кодом для моделирования электронных схем. Qucs-S кроссплатформенный (поддерживаются Linux и Windows) и написан на С++ с использованием набора библиотек Qt. О данной программе рассказывают мои предыдущие статьи. Для работы Qucs-S рекомендуется использовать также открытый движок моделирования Ngspice. Актуальным релизом Qucs-S на текущий момент является версия 25.1.0. Статья продолжает подробное рассмотрение видов моделирования в Qucs-S, начатое в первой и второй частях.

Читать далее

[Перевод] Управление пакетами C ++ с помощью Conan: Введение

Уровень сложностиПростой
Время на прочтение5 мин
Количество просмотров4.5K

Прим. пер.: Перевод и примеры исправлены, дополнены и адаптированы с учётом современных версий Conan 2, инструментов сборки и библиотек.

Автор: Ilyas Hamadouche

Управление зависимостями C++ может оказаться непростой задачей. Зачастую разработчику приходится самостоятельно заботиться о загрузке исходных кодов, интеграции готовых к использованию двоичных файлов, сборке, установке и связывании библиотек. В этой статье я расскажу вам о Conan — менеджере пакетов C/C++ с открытым исходным кодом, который отлично справляется с этими задачами.

Conan — это свободный менеджер пакетов с открытым исходным кодом (MIT), разработанный для C и C++. Он похож на NuGet и npm для .NET и JavaScript соответственно. Он может работать в любой операционной системе, поддерживающей Python. К ним относятся Linux, Mac, а также Windows.

Читать далее

Типичные ошибки в Си: как их избежать и писать надёжный код

Уровень сложностиПростой
Время на прочтение3 мин
Количество просмотров6.2K

Типичные ошибки в Си: как их избежать и писать надёжный код

Вы устали от:
❌ Тайных утечек памяти, которые пожирают ресурсы.
❌ Загадочных падений программы без объяснения причин.
❌ Указателей-призраков, стреляющих в вас из темноты сегфолтов.

Эта статья — ваш щит и меч:
✅ Примеры кода, которые покажут, где прячутся ошибки.
✅ Практические советы для мгновенного улучшения кода.
✅ Инструменты-спасатели (Valgrind, Cppcheck).

🛠 «Если ваш код на Си работает — это чудо. Сделайте так, чтобы это было закономерностью».

Для кого:
• Начинающие разработчики, которые хотят писать код, а не баги.
• Те, кто считает, что free() — это про свободу, а не про память.
• Все, кто устал гуглить «почему Си опять вылетает».

Погружаемся

Пишем собственное симметричное шифрование

Время на прочтение6 мин
Количество просмотров3.5K

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

Читать дальше →

Информация

В рейтинге
7 175-й
Зарегистрирован
Активность