• Пентест сети провайдера или почему не стоит доверять свои данные провайдерам в Узбекистане

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

      Читать далее
    • Растаможка своими силами

      • Tutorial

      В статье описывается процесс оформления и подачи таможенной декларации через онлайн сервис edata.customs.ru своими силами с минимальными финансовыми затратами (но не времени). Если давно хотите сэкономить на услугах брокеров, но не знаете с чего начать - статья для вас.

      Читать далее
    • Приёмы неблокирующего программирования: атомарные операции и частичные барьеры памяти

      • Перевод

      В первой статье цикла мы познакомились с простыми неблокирующими алгоритмами, а также рассмотрели отношение “happens before”, позволяющее их формализовать. Следующим шагом мы рассмотрим понятие «гонки данных» (data race), а также примитивы, которые позволяют избежать гонок данных. После этого познакомимся с атомарными примитивами, барьерами памяти, а также их использованием в механизме “seqcount”.


      С барьерами памяти некоторые разработчики ядра Linux уже давно знакомы. Первый документ, содержащий что-то похожее на спецификацию гарантий, предоставляемых ядром при одновременном доступе к памяти — он так и называется: memory-barriers.txt. В этом файле описывается целый зоопарк барьеров вместе с ожидаемым поведением многопоточного кода в ядре. Также там описывается понятие «парных барьеров» (barrier pairing), что похоже на пары release-acquire операций и тоже помогает упорядочивать работу потоков.


      В этой статье мы не будем закапываться так же глубоко, как memory-barriers.txt. Вместо этого мы сравним барьеры с моделью acquire и release-операций и рассмотрим, как они упрощают (или, можно сказать, делают возможной) реализацию примитива “seqcount”. К сожалению, даже если ограничиться лишь наиболее популярными применениями барьеров — это слишком обширная тема, поэтому о полных барьерах памяти мы поговорим в следующий раз.

      Читать дальше →
      • +11
      • 5,8k
      • 3
    • GraphQL на Rust

      • Перевод
      • Tutorial

      В этой статье я покажу как создать GraphQL сервер, используя Rust и его экосистему; будут приведены примеры реализации наиболее часто встречающихся задач при разработке GraphQL API. В итоге API трёх микросервисов будут объединены в единую точку доступа с помощью Apollo Server и Apollo Federation. Это позволит клиентам запрашивать данные одновременно из нескольких источников без необходимости знать какие данные приходят из какого сервиса.

      Читать далее
    • Язык моделирования Alloy и приключения с параллельными запросами к базе данных

      • Перевод

      Данная статья описывает небольшой пример того, как использование языка моделирования Alloy может помочь при разработке программного обеспечения.



      О качестве программного обеспечения и инструментарии


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


      1. Анализ и создание спецификаций
      2. Устранение простых ошибок с использованием системы типов Haskell
      3. Стандартные юнит-тесты и интеграционные тесты
      4. Непрерывная интеграция
      5. Обязательные ревью кода
      6. Тестирование на стендах, проводимое QA инженерами
        (мы используем Octopod для оптимизации процесса разработки и QA)
      7. Тестирование в pre-production среде
      8. Ведение логов и контроль ошибок на этапе эксплуатации

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

      Читать дальше →
    • Почему накопители SSD ускоряются после очистки и насколько важен размер кэша — бенчмарки популярных моделей PCIe 4.0

        Почему накопители SSD ускоряются после очистки и насколько важен размер кэша — бенчмарки популярных моделей PCIe 4.0



        В прошлом году SSD впервые в истории обогнали HDD по объёму продаж. В отличие от винчестеров, здесь сумасшедший технический прогресс. За несколько лет рынок меняется кардинально: интерфейс NVMe вместо SATA, память SLC→MLC→TLC→QLC…

        Замена системного диска с HDD на SSD — иногда самый мощный апгрейд, который можно сделать с компьютером. Главный прирост в отклике системы и софта даёт скорость случайного доступа, которая даже у самых дешёвых SSD на пару порядков быстрее, чем у HDD. А современные SSD практически не уступают по скорости оперативной памяти. Основная проблема — живучесть. При интенсивной эксплуатации они слишком быстро выходят из строя.

        Давайте посмотрим, что произошло на рынке потребительских SSD за последние десять лет. И как выбор конкретных технологий влияет на производительность.
        Читать дальше →
      • Внедрение зависимостей в GO

          Источник изображения

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

          Читать далее
        • Погружаемся в логово ржавчины. Как работает компилятор rust

            В моей предыдущей статье о rust я попытался рассказать об истории языка, и показать откуда он пришёл. В статье было сделано множество упрощений. Просто нереальное множество. Народу не понравилось. Но в опросе, в конце статьи вы сказали, что надо бы показать кишки компилятора.

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

            Ну, Fe2+mH2O + 2OH- = mH2O + Fe(OH)2↓
          • Снова про шаблоны C++ в микроконтроллерах

            Идея использования шаблонов языка C++ для программирования контроллеров не является чем-то новым, в сети доступно большое количество материалов. Кратко напомню основные преимущества: перенос значительной части ошибок из runtime в compile-time за счет строгого контроля типов, а также приближение к объектно-ориентированному подходу, близкий и удобный многим, без необходимости хранения полей в статическом классе (все поля являются шаблонными параметрами). Однако стоит заметить, что практически все авторы по большому счету ограничиваются в своих работах примерами на работу с регистрами и портами ввода-вывода. В своей статье я хочу продолжить эти идеи.

            Читать далее
          • Заметки о Unix: системный вызов write(), на самом деле, не такой уж и атомарный

            • Перевод


            Недавно я читал материал Эвана Джонса «Устойчивое хранение данных и файловые API Linux». Я полагаю, что автор этой довольно хорошей статьи ошибается, говоря о том, чего можно ожидать от команды write() (и в том виде, в каком она описана в стандарте POSIX, и на практике). Начну с цитаты из статьи:

            Системный вызов write() определён в стандарте IEEE POSIX как попытка записи данных в файловый дескриптор. После успешного завершения работы write() операции чтения данных должны возвращать именно те байты, которые были до этого записаны, делая это даже в том случае, если к данным обращаются из других процессов или потоков (вот соответствующий раздел стандарта POSIX). Здесь, в разделе, посвящённом взаимодействию потоков с обычными файловыми операциями, имеется примечание, в котором говорится, что если каждый из двух потоков вызывает эти функции, то каждый вызов должен видеть либо все обозначенные последствия, к которым приводит выполнение другого вызова, либо не видеть вообще никаких последствий. Это позволяет сделать вывод о том, что все файловые операции ввода/вывода должны удерживать блокировку ресурса, с которым работают.

            Означает ли это, что операция write() является атомарной? С технической точки зрения — да. Операции чтения данных должны возвращать либо всё, либо ничего из того, что было записано с помощью write(). […].
            Читать дальше →
            • +36
            • 6,1k
            • 7
          • Как я изучал структуры данных и алгоритмы для собеседования в FAANG

            • Перевод
            Продолжая тему устройства в FAANG, которую уже мы поднимали в нашем блоге, и специально к старту нового потока нашего курса по алгоритмам сегодня делюсь описанием пути Эско Обонга, старшего инженера-программиста Uber.

            Эта история началась в 2015 году, когда стартап, к которому я присоединился как «сотрудник-основатель», закрылся через шесть месяцев после первого раунда инвестиций, и я искал новую работу. Первое моё собеседование было с  Codecademy, где на этапе телефонного разговора меня заверили: «Не волнуйтесь, мы не задаём сумасшедших вопросов об алгоритмах или что-то в этом роде». И я им поверил…


            Приятного чтения!
          • Как самому разработать систему обнаружения компьютерных атак на основе машинного обучения

            • Tutorial

            На фото – Arthur Lee Samuel, пионер машинного обучения, демонстрирует возможности искусственного интеллекта и играет в шашки с собственной программой Checkers-Playing, одной из первых самообучающихся программ в мире. 1962 год.

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

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

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

            Читать далее
          • Ржавеем дальше. Как появился Rust и можно ли на нём WEB?

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

              В комментариях я встретил много вопросов типа «А можно ли использовать rust для WEB?» Лаконичный ответ таков: «Можно». Можно и brainfuck использовать, если хочется. Нужно ли? Скажем так, brainfuck для WEB использовать категорически не стоит. А вот rust – тут надо понимать что именно делает rust и каковы его цели. Для того чтобы это понять мы должны погрузиться в компилятор и разобраться в устройстве процессоров. Под катом вы найдёте глубокий заныр в историю того как появился rust и поймёте что это такое и когда его нужно использовать а когда можно и на «ноде запилить».

              Ржавеем дальше и глубже...
            • Как я сдавал Certified Kubernetes Security

                Всем привет.

                Хочу поделиться своим опытом успешной сдачи экзамена Certified Kubernetes Security (CKS) от Linux Foundation. Данный экзамен, как нетрудно догадаться, проверяет наши способности настраивать различные аспекты безопасности кластера Kubernetes и приложений, работающих в нем. Экзамен мне понравился, он рассматривает безопасность с различных точек зрения, а также использует очень полезные внешние инструменты, такие как Falco, Trivy, kube-bench, Open Policy Agent, gVisor и др. Сам экзамен мне показался умеренно сложным, в отличие от CKA, который больше ориентирован на новичков в Kubernetes.

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

                На текущий момент существует всего два экзамена по безопасности Kubernetes - это, собственно, сам CKS, а также Red Hat Certified Specialist in Security: Containers and OpenShift, имеющий дело с безопасностью OpenShift. Эти два экзамена во многом пересекаются, однако по Опеншифту я считаю экзамен все же сложнее (его я благополучно завалил).

                Экзамен отдельно стоит стоит 300$, официальный курс Kubernetes Security Fundamentals (LFS260) стоит 299$, можно купить курс и экзамен вместе за 499$. Я купил курс и экзамен вместе за 200$ на традиционной предновогодней распродаже от Linux Foundation.

                Необходимым условием для сдачи CKS является наличие действующего сертификата CKA (Certified Kubernetes Administrator). Вы можете купить CKS, но не сможете назначить экзамен, пока не получите CKA. Звучит логично, поскольку экзамен CKS является гораздо более сложным чем CKA.

                Но ближе к делу. Для подготовки я использовал два курса:

                Читать далее
              • HDTree: настраиваемое дерево решений на Python

                • Перевод

                Представляем настраиваемую и интерактивную структуру дерева решений, написанную на Python. Эта реализация подходит для извлечение знаний из данных, проверки интуитивного представления, улучшения понимание внутренней работы деревьев решений, а также изучение альтернативных причинно-следственных связей в отношении вашей проблемы обучения. Она может использоваться в качестве части более сложных алгоритмов, визуализации и отчётов, для любых исследовательских целей, а также как доступная платформа, чтобы легко проверить ваши идеи алгоритмов дерева решений.
                Добро пожаловать под кат!
              • Пишем макет 16-битного ядра на C/C++

                • Перевод


                В первой и второй статьях я лишь коротко представил процесс написания загрузчика на ассемблере и C. Для меня это было хоть и непросто, но в то же время интересно, так что я остался доволен. Однако создания загрузчика мне показалось мало, и я увлекся идеей его расширения дополнительной функциональностью. Но так как в итоге размер готовой программы превысил 512 байт, то при попытке запуска системы с несущего ее загрузочного диска я столкнулся с проблемой “This is not a bootable disk”.
                Читать дальше →
              • Что вас ждет на курсе Алгоритмов в Яндекс.Практикуме

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

                  Хотите такое ощутить? Тогда велкам в Яндекс.Практикум на курс «Алгоритмы для разработчиков».

                  Читать далее
                • Пытаясь композировать некомпозируемое: монады

                    Сколько раз вы слышали эту мантру "монады не композируются"? Я потратил достаточно много времени, чтобы попробовать опровергнуть это утверждение, пытаясь решить проблему в лоб. Но как и многие вещи в математике, порой, чтобы попробовать что-то понять, иногда стоит сменить масштаб.

                    Читать далее
                  • История про возврат денег (11 450 евро) от Lufthansa, RyanAir, Booking и других

                      История о том, как я не вернул более 10 000 евро от Ryanair, Lufthansa, Booking и частного агентства недвижимости

                      Содержание статьи:

                      1.       Введение – как мне удалось вернуть 11 450 евро.

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

                      3.       Откуда образовался "кредит" на более чем в 10 000 евро.

                      4.       "Маклер и его банкротство."

                      5.       Обращение к адвокатам.

                      6.       Возврат денег через банковскую процедуру «Charge Back».

                      7.       Зачисление 9500 евро долговых обязательств за проживание на мой расчетный счет.

                      8.       Возврат средств от Lufthansa.

                      9.       Возврат средств от Ryanair.

                      10.   Возврат средств от Booking.

                      11.   Заключение.

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

                      Читать далее
                    • Профессионализм разработчика — на шаг ближе к счастью

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

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

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