All streams
Search
Write a publication
Pull to refresh
603
127.7

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

Send message

Создаём своё первое USB-устройство

Level of difficultyMedium
Reading time14 min
Views23K

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

Сначала небольшое предупреждение: я не считаю себя экспертом в USB. Не рассматривайте пост как авторитетное руководство; скорее, это документация к моему небольшому проекту по созданию простейшего USB-устройства E2E. Также в нём приведены ссылки на хорошие материалы, в которых тема рассмотрена более подробно.
Читать дальше →

Спасите меня из ада данных

Level of difficultyMedium
Reading time10 min
Views6.5K

Мельбурн, 9:59 утра, 9 октября 2024 года. Солнечный свет проникает через мои окна, освещая кружащиеся по моей гостиной пылинки. В моей руке чашка с чаем. Делаю глоток и наслаждаюсь вкусом.

Я пишу другому сениор-разработчику из команды, который, в отличие от меня, работает на полную ставку: «Я готов начать в 10»; таков наш обычай.

Минутная стрелка делает шаг.

Мельбурн, 10:00 утра, 9 октября 2024 года. Солнце мгновенно гаснет и заменяется пронзительно вопящим черепом, низко висящим в леденящем небе. Я бросаю взгляд на чай, он похож на кровь. Делаю глоток и наслаждаюсь вкусом.

Я пишу другому сениор-разработчику из команды: «Ты готов отправиться в Зону мучений?»1; таков наш обычай.
Читать дальше →

Как долго можно извлекать данные из RAM после отключения компьютера?

Level of difficultyMedium
Reading time11 min
Views29K

Для обеспечения сохранности содержимого Dynamic RAM (DRAM) его необходимо периодически обновлять. Если значение какого-то бита поменяется самопроизвольно, то можно считать, что память работает не так, как должна. JEDEC (Joint Electron Device Engineering Council — организация, среди прочего, разработавшая спецификацию DDR) определяет, как часто это должно происходить для обеспечения надлежащей работы. Однако некоторых людей больше интересует, как долго данные могут сохраняться после отключения питания DRAM. В этом посте мы расскажем, как это можно измерить, а также поделимся результатами, полученными при исследовании пары протестированных платформ.
Читать дальше →

Развенчиваем популярные мифы и заблуждения о компиляторах

Level of difficultyMedium
Reading time21 min
Views16K

▍ Введение


Компиляторы всегда были окружены аурой загадочности и магии. Из-за этого многие из нас верят, что они делают то, чего они не делают, или что они не делают того, что делают1.

Эта статья станет своего рода продолжением статьи о компиляторных оптимизациях. Я перечислю некоторые заблуждения, с которыми я сталкивался за долгие годы (многие из них были моими), и постараюсь развеять все мифы. Заранее скажу, что эта статья посвящена только крупным популярным компиляторам общего назначения наподобие LLVM, GCC и ICX. Некоторые из сделанных здесь утверждений не относятся, например, к специализированным компиляторам2, а также к мелким и средним компиляторам3.
Читать дальше →

Прошивки OpenWrt: атака на цепочку поставок

Level of difficultyMedium
Reading time10 min
Views14K

Несколько дней назад я обновлял сеть своей домашней лаборатории и решил обновить OpenWrt роутера 1. Подключившись к LuCI (веб-интерфейсу OpenWrt), я заметил раздел Attended Sysupgrade и попробовал обновить прошивку с его помощью.

В описании говорилось, что он собирает новую прошивку при помощи онлайн-сервиса.


Мне стало любопытно, как это работает, так что я приступил к исследованиям.
Читать дальше →

Грязный код

Level of difficultyMedium
Reading time10 min
Views30K
Эдсгер Дейкстра: «Грязно и быстро — мне это не понравится»

«Чтобы иметь право называть себя профессионалом, вы должны писать чистый код. Нет никаких разумных оправданий тому, чтобы не стремиться к лучшему». Clean Code

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

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

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

Я программирую уже довольно давно и видел разнообразные подходы к обеспечению работоспособности ПО. Кто-то любит объектно-ориентированное программирование (я тоже), другие умные люди его ненавидят. Кому-то нравится выразительность динамических языков, кого-то она бесит. Кто-то успешно выпускает программы, строго следуя концепции Test Driven Development, другие добавляют в конце проекта несколько сквозных тестов, а многие остаются где-то посередине этих крайних точек.

Я был свидетелем проектов, выпускавших и поддерживавших успешное ПО на основе всех этих разнообразных подходов.

Поэтому повторюсь, что моя цель не убедить вас, что мой способ кодинга единственно возможный, а показать вам (и в особенности начинающим разработчикам, которых легко запугать терминами наподобие «чистого кода»), что можно иметь успешную карьеру программиста, пользуясь множеством различных подходов, и что мой — один из них.
Читать дальше →

Как устроены очереди: визуальное объяснение

Level of difficultyMedium
Reading time7 min
Views9.9K

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

В этом посте мы изучим очереди в контексте HTTP-запросов. Начнём мы с простого, и постепенно будем вводить более сложные структуры очередей.
Читать дальше →

Как поднять свой сервер TeamSpeak

Level of difficultyMedium
Reading time6 min
Views45K


TeamSpeak — известная программа для голосового общения по VoIP с текстовым чатом. Она обеспечивает отличное качество звука и самое главное — поддерживает практически неограниченное количество участников, как многоканальная рация. Многие использовали её за годы до появления Discord. А теперь приходится возвращаться обратно, потому что доступ к центральным серверам Discord затруднён, а на собственном сервере Discord поставить нельзя.

Может оно к лучшему, потому что по некоторым параметрам TeamSpeak заметно превосходит Discord: например, клиент гораздо легче, качество звука субъективно лучше (на максимальных настройках), персональные данные не утекают на чужие серверы и задержки меньше, то есть он работает с меньшим лагом (особенно если хостить сервер у себя), это чисто технологическое превосходство над Discord по аудиокодекам и протоколу передачи данных.
Читать дальше →

Как Google 15 лет создавала культуру сокрытия информации

Level of difficultyMedium
Reading time10 min
Views15K

В конце 2008 года, когда Google подверглась проверке нарушений антимонопольного законодательства из-за сделки по продаже рекламы с её конкуренткой Yahoo и столкнулась с судебными исками, связанными с претензиями о нарушении патентов, торговых марок и авторского права, высшее руководство разослало внутри компании конфиденциальный меморандум.

«Мы верим, что информация — это благо», — заявляло руководство сотрудникам компании в этом меморандуме. Но, добавляло оно, государственные регулирующие органы или конкуренты могут воспользоваться неосмотрительными беседами работников Google друг с другом.

По словам Google, чтобы минимизировать шансы того, что при рассмотрении иска могут всплыть потенциально компрометирующие комментарии, сотрудники должны воздержаться от необоснованных рассуждений и сарказма, а также «тщательно продумывать» свои слова при общении на «горячие темы». «Не оставляйте комментариев, пока вам не будут известны все факты».

Изменились и технологии внутри компании. В инструменте для мгновенного обмена сообщениями была включена настройка «адвокатская тайна». Неосторожно оброненная фраза удалялась уже на следующий день.
Читать дальше →

Создаём простой копирующий сборщик мусора

Level of difficultyMedium
Reading time14 min
Views6.8K

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

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

Почему я провалю ваше техническое собеседование

Level of difficultyMedium
Reading time17 min
Views80K

Считается, что собеседования предназначены для выбора подходящих кандидатов на должность. Соответственно, технические собеседования, предположительно, нужны для оценки кандидатов на технические роли.

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

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

Так думаю не только я: несколько лет назад Университет штата Северная Каролина совместно с компанией Microsoft пришли к таким же выводам: «Собеседования в технологическом секторе оценивают уровень стресса, а не навыки разработки ПО».

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

Реверс-инжиниринг новой функции iOS Inactivity Reboot

Level of difficultyMedium
Reading time12 min
Views9.2K

В iOS 18 появилась новая функция безопасности: перезагрузка бездействия (inactivity reboot). От чего она защищает и как работает? В этом посте мы рассмотрим все подробности вплоть до расширения ядра и Secure Enclave Processor.

Безопасность до и после первой разблокировки


А вы знали, что первый ввод пароля после включения телефона сильно отличается от его дальнейшего ввода для разблокировки телефона?

При первом вводе пароля разблокируется хранилище ключей в Secure Enclave Processor (SEP), шифрующем пользовательские данные на iPhone.

Состояние до первого ввода пароля называется Before First Unlock (BFU). Из-за шифрования пользовательских данных iPhone ведёт себя немного иначе при последующих разблокировках. Вы увидите, что Face ID и Touch ID не работают, и требуется ввод пароля. Но можно заметить и более тонкие отличия: поскольку пароли Wi-Fi зашифрованы, iPhone не будет подключаться к сетям Wi-Fi. Если SIM не защищена PIN-кодом, то iPhone сможет подключаться к сотовым сетям. Это означает, что вы сможете получать телефонные вызовы. Однако при получении вызова, даже если номер есть в контактах, имя контакта не будет отображаться, потому что контакты ещё не дешифрованы. Аналогично, при получении уведомлений о новых сообщениях вы увидите, что получили сообщения, но их предпросмотр будет недоступен. Можете попробовать сами!
Читать дальше →

Неочевидные для начинающих тонкости Postgres

Level of difficultyMedium
Reading time15 min
Views48K

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

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

За исключением… Postgres.

Не потому, что официальная документация несовершенна (она прекрасна!), просто её очень много. Если распечатать её как стандартный PDF на бумаге формата Letter, то получится 3206 страниц (для текущей версии 17)1. Разработчик-джун вряд ли сможет сесть и прочитать её с начала до конца.

1. Если печатать на бумаге A4, то получится 3024 страницы; наверно, это ещё один аргумент в пользу стандарта.

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

Надеюсь, это упростит процесс освоения для читателей моей статьи.

Стоит отметить, что многое из описанного может быть применимо и к другим системам управления базами данных (СУБД) SQL и вообще к базам данных в целом, но я слабо знакома с ними, так что не буду утверждать с уверенностью.
Читать дальше →

Датчик линейного положения, работающий по принципу электронного штангенциркуля

Level of difficultyMedium
Reading time12 min
Views17K

Вы когда-нибудь мечтали о 500-герцовой системе датчиков линейного положения? Тогда вам повезло — для этого достаточно печатной платы, простого микроконтроллера и немного математики!

См. также полный исходный код и журнал моих исследований по этому проекту.
Читать дальше →

Как мы обнаружили потенциальные атаки при помощи штрих-кодов

Level of difficultyMedium
Reading time9 min
Views7.4K

Фаззинг — одна из самых успешных методик для поиска багов безопасности, о нём постоянно говорят в статьях и на отраслевых конференциях. Он стал настолько популярным, что большинство важного ПО, казалось бы, должно подвергаться тщательному фаззингу. Но это не всегда так. В этом посте мы покажем, как фаззили библиотеку сканирования штрих-кодов ZBar, и почему, несмотря на ограниченность по времени, обнаружили в ней серьёзные баги: запись в буфер стека out-of-bounds, которая может привести к произвольному выполнению кода при помощи зловредного штрих-кода, и утечку памяти, которую можно использовать для выполнения атаки «отказ в обслуживании» (denial-of-service).

ZBar — это опенсорсная библиотека для считывания штрих-кодов, написанная на C. Она поддерживает впечатляющий набор форматов штрих-кодов, в том числе и QR-коды. Её использовал один из наших клиентов, поэтому мы решили вкратце проверить её безопасность. Учитывая огромный объём кода, вручную тестировать его мы не могли. Так как мы не нашли упоминаний о фаззинге этой библиотеки, то решили попробовать его.
Читать дальше →

Языки программирования, взорвавшие мой мозг

Level of difficultyMedium
Reading time11 min
Views31K

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

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

Анализ задачи с собеседования в Google: конь и телефонные кнопки

Level of difficultyMedium
Reading time13 min
Views27K

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

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

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

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

Автоматизация задач и резервное копирование на сервере

Level of difficultyEasy
Reading time6 min
Views5.1K


Ispmanager — одна из популярных коммерческих панелей управления веб-сервером. Это альтернатива или дополнение для командной строки. Простой и понятный GUI, который пригодится начинающим системным администраторам. По функциональности она, конечно, не сравнится с консолью, но в GUI-панелях крайне низкий порог входа, что очень полезно для виртуального хостинга, да и в принципе личных серверов как полезной услуги для каждого человека.

Посмотрим, как решаются в ispmanager некоторые типичные задачи.
Читать дальше →

Сгенерированный ИИ код сделает вас плохим программистом

Level of difficultyEasy
Reading time7 min
Views16K

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

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

На самом деле, ООП — это не так уж плохо

Level of difficultyMedium
Reading time10 min
Views13K

ООП — определённо не самая моя любимая парадигма, но я считаю, что в мейнстримном ООП со статической типизацией кое-что сделано правильно, и это очень важно для программирования.

В этом посте я хочу рассказать, что же самое важное реализовано в мейнстримных ООП-языках со статической типизацией.

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

Information

Rating
Does not participate
Works in
Registered
Activity