Pull to refresh
43
3
Артем Навроцкий @Bozaro

Программист

Send message

Надежный обход блокировок в 2024: протоколы, клиенты и настройка сервера от простого к сложному

Level of difficulty Medium
Reading time 44 min
Views 123K

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

Вы, наверняка, помните отличный цикл статей на Хабре в прошлом году от пользователя MiraclePtr, который рассказывал о разных методах блокировок, о разных методах обхода блокировок, о разных клиентах и серверах для обходов блокировок, и о разных способах их настройки (раз, два, три, четыре, пять, шесть, семь, восемь, десять, десять, и вроде были еще другие), и можете спросить, а зачем еще одна? Есть две основные причины для этого.

Читать далее
Total votes 491: ↑483 and ↓8 +475
Comments 315

Расширяем PostgreSQL с помощью Rust

Level of difficulty Medium
Reading time 5 min
Views 4.3K

Свободная система управления базами данных PostgreSQL не только предоставляет высокопроизводительный движок для выполнения запросов, но и может быть расширена с помощью расширений, которые могут добавлять новые типы данных (например, для ГИС‑расширений или астрономических координат), дополнительные типы индекса и возможности поиска (например, полнотекстовый поиск), сбор статистики, поддержку новых языков для встроенных функций и многое другое. Большой список существующих расширений может быть найден по этой ссылке. В этой статье мы рассмотрим один из возможных вариантов по созданию собственного расширения для PostgreSQL с использованием библиотеки pgx.

Читать далее
Total votes 24: ↑24 and ↓0 +24
Comments 3

Программист и энтропия

Reading time 7 min
Views 6.3K
Хаос всегда возрастает. Возрастает непрерывно и неотвратимо. Так гласит второй закон термодинамики: в любой замкнутой системе энтропия – мера хаоса – увеличивается, пока та не достигнет термодинамического равновесия – состояния полной неопределённости, когда ничего нельзя предвидеть и всё ведёт себя предельно беспорядочно. Мы, живые организмы, не являемся замкнутыми системами, и сдерживаем рост энтропии внутри себя за счёт увеличения его снаружи – пока можем. И программные проекты имеют с нами много общего: они тоже вынуждены тратить внешние ресурсы (силы разработчиков, CPU на оверхед абстракций), чтобы сдерживать непрерывно растущую энтропию – иначе в какой-то момент они теряют способность достаточно быстро адаптироваться к изменяющейся действительности и умирают.


Какаду воспринимают тезис про увеличение энтропии снаружи слишком буквально.

Что такое энтропия в контексте программного кода? Википедия приводит восемь разных определений энтропии в разных науках и все они ограниченно применимы в нашем случае, так что я не берусь дать формализованный ответ на этот вопрос. Но при принятии архитектурных решений и написании кода я всё чаще задумываюсь о последствиях в терминах энтропии, так что приглашаю и вас в свой чудный мир сомнительных аналогий.
Читать дальше →
Total votes 21: ↑19 and ↓2 +17
Comments 14

Четыре простых лайфхака при написании тестов на Go + testify

Reading time 4 min
Views 12K
Хотя язык программирования Go идёт в комплекте со встроенным тестовым фреймворком, мне сложно себе представить написание всего того количества тестов, что я написал, без testify. В этой заметке я расскажу про несколько маленьких неочевидных трюков, которым я научился в процессе.


Читать дальше →
Total votes 26: ↑25 and ↓1 +24
Comments 0

Как мы делали Warface для Денди

Reading time 31 min
Views 43K
В октябре 2020 мне написал мой друг Андрей Скочок, работающий в Mail.ru, и предложил сделать для них необычную промоакцию.

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



Читать дальше →
Total votes 246: ↑246 and ↓0 +246
Comments 40

Скрутки, клеммники и WAGO под лёгкой перегрузкой

Reading time 4 min
Views 68K


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

Здесь рассматриваются наиболее доступные способы соединить наиболее типичный для квартирной проводки медный однопроволочный провод сечением 2,5 кв.мм.
Читать дальше →
Total votes 258: ↑257 and ↓1 +256
Comments 206

Обзор стремительно развивающейся среды разработки microStudio

Reading time 7 min
Views 22K

Здравствуйте дорогие читатели сайта! На написание этой статьи меня подтолкнул тот факт, что я не смог найти на необъятных просторах русскоязычного интернета, какой-либо подробной информации о microStudio. Можно найти небольшие заметки, на нескольких сайтах. Где совсем скромно написано про проект и о том, что он был залит на репозиторий GitHub. Даже фамилия разработчика не указана. Кроме того 19.11.2021 и 12.02.2021 вышли довольно большие обновления о которых я расскажу далее в этой статье.

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

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

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

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

Читать далее
Total votes 23: ↑21 and ↓2 +19
Comments 32

Как мы отказались от JPEG, JSON, TCP и ускорили ВКонтакте в два раза

Reading time 24 min
Views 166K

На протяжении всей жизни мне приходится экономить вычислительные и сетевые ресурсы: сначала были компьютеры с 300 кГц (кило — не гига!) и 32 Кбайт RAM, интернет по dial-up. Потом я решал олимпиадные задачки. Теперь имею дело с терабайтами трафика и 50 млрд событий в сутки. И хотя современные телефоны в 1 000 раз мощнее любого оборудования двадцатилетней давности, я до сих пор оптимизирую. Думал даже, что это со мной что-то не так. Но потом понял, что все постоянно что-нибудь оптимизируют. 

Эта статья в меньшей степени о том, почему нужно бороться за производительность, и в большей о том, на что сейчас стоит заменить устаревший стек из JPEG, JSON, gzip и TCP — и как это сделать. 

Спойлер: у нас есть решение и мы его не только показываем — ссылки на open source в конце статьи.

Читать далее
Total votes 435: ↑423 and ↓12 +411
Comments 300

Ещё 20+ игр, которые прокачивают логику, алгоритмы и радуют умный мозг [по следам комментариев на Habr]

Reading time 9 min
Views 116K
image

Я выложила вчера подборку «15 игр, которые прокачивают логику, алгоритмы, ассемблер и силу земли». И столько классных ссылок в комментарии накидали, что я чуток опухла, но сделала отдельную подборку, по горячим следам. Спасибо большое всем, кто внес свой вклад.

Еще я веду канал в Telegram: GameDEVils, делюсь там клевыми материалами (про геймдизайн, разработку и историю игр).
Читать дальше →
Total votes 83: ↑82 and ↓1 +81
Comments 59

Кросс-компиляция с Clang – это просто

Reading time 15 min
Views 19K

Разберемся с кросс-компиляцией при помощи Clang на пальцах, попутно посмотрим на CMake, не оставим без внимания Conan, соберем самый настоящий .deb пакет и конечно же - максимально контейнеризируем и автоматизируем весь процесс. Посмотрим зачем нам тут Clang, и почему иногда не обойтись без него.

Кросс-компилировать
Total votes 18: ↑17 and ↓1 +16
Comments 19

Bottom Sheet, перейдём на «ты»?

Reading time 31 min
Views 26K

Bottom Sheet представлялся мне сложным и недосягаемым. Это был вызов! Я не понимал, с чего начать. Возникало много вопросов: использовать view или view controller? Auto или manual layout? Как анимировать? Как скрывать Bottom Sheet интерактивно?

Но всё изменилось после работы над Bottom Sheet для приложения Joom, где он используется повсеместно. В том числе и в таких критических сценариях, как оплата. Так что могу точно сказать, что в этом компоненте мы уверены. Настолько уверены, что я даже рассказывал о нём на Podlodka iOS crew #7. В рамках воркшопа я показал, как сделать Bottom Sheet, который умеет подстраиваться под размер контента, интерактивно закрывается и поддерживает UINavigationController.

Стоп, но Apple же предоставила системный Bottom Sheet. Зачем писать свой? Действительно, это так, но компонент поддерживается только с iOS 15. А это значит, что полноценно его можно будет использовать только через 2-3 года. К тому же часто требования дизайнеров выходят за рамки стандартных iOS-элементов.

В рамках статьи хочу развеять туман над Bottom Sheet, ответить на вопросы, которыми задавался я сам и предложить один из вариантов реализации. Чтобы в конце вы могли добавить в резюме строчку «Профессионально делаю Bottom Sheet'ы»

Если заинтересовал, то начнём! Создадим простой Bottom Sheet и шаг за шагом его прокачаем.

1. Научимся подстраиваться под размер контента и закрывать Bottom Sheet.

2. Добавим интерактивное закрытие, учитывая контент, который скроллится.

3. Поддержим UINavigationController с навигацией внутри Bottom Sheet.

Читать далее
Total votes 19: ↑18 and ↓1 +17
Comments 10

Компиляция контейнеров — Dockerfiles, LLVM и BuildKit

Reading time 11 min
Views 11K

Как получаются контейнеры? Обычно из серии операторов, таких как RUN, FROM и COPY, которые помещаются в Dockerfile и собираются. Но как эти команды превращаются в образ, а затем в работающий контейнер? Понять это можно если пройти этапы создания образа контейнера самостоятельно. Мы создадим образ программно, а затем разработаем обычный синтаксический интерфейс и будем использовать его для создания образа.

Погружаемся
Total votes 8: ↑8 and ↓0 +8
Comments 0

YARL: как Яндекс построил распределённый Rate Limiter с нулевым влиянием на время ответа сервисов

Reading time 14 min
Views 26K

Yandex Rate Limiter (далее просто YARL) — это сервис лимитирования нагрузки для распределённых сервисов. Его особенность в том, что он способен работать с миллионами квот, имея при этом очень низкие накладные расходы на проверку квоты. Если совсем кратко, это система распределённых Leaky Bucket'ов, с помощью которых можно ограничивать разные величины, связанные со временем: скорость передачи данных по сети, запросы в секунду и т. п.



Меня зовут Денис Кореневский, я работаю в службе разработки внутреннего хранилища Яндекса, и сегодня я расскажу, как YARL устроен внутри, почему мы вообще написали своё решение и с какими трудностями нам пришлось столкнуться в процессе создания. Добро пожаловать под кат.

Читать дальше →
Total votes 80: ↑79 and ↓1 +78
Comments 26

Сборка Docker-образов для MacBook M1 под Linux

Reading time 5 min
Views 24K

Мы собираем зависимости для нашего тестового окружения в Docker-образ, что оказалось очень удобно. Но недавно у нас появился разработчик с MacBook M1, и резко встал вопрос о возможности поддержки двух платформ.

Читать далее
Total votes 20: ↑20 and ↓0 +20
Comments 11

Как сделать alter table в высоконагруженной таблице

Reading time 3 min
Views 16K

Ещё лет 5 назад на собеседованиях с backend-разработчиками был популярен вопрос: как переименовать колонку в высоконагруженной таблице (возможны вариации: как сделать любой другой alter table)?

Вопрос всё ещё часто звучит на собесах. И актуальность его выросла, так как за последние 5 лет стало намного больше масштабных проектов с высокой нагрузкой.

Читать далее
Total votes 27: ↑25 and ↓2 +23
Comments 29

Динамическая JIT компиляция С/С++ в LLVM с помощью Clang

Reading time 10 min
Views 8.7K


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

Из-за этого, я решил не откладывать перевод компилятора на использование LLVM, который планировался когда нибудь в будущем, а решил сделать это уже сейчас. И для этого нужно было научиться запускать компиляцию C++ кода с помощью библиотек Clang, но тут вылезло сразу несколько проблем.

Оказывается, интерфейс Clang меняется от версии к версии и все найденные мной примеры были старыми и не запускались в актуальной версии (Сlang 12), а стабильный C-style интерфейс предназначен для парсинга и анализа исходников и с помощью которого сгенерировать исполняемые файлы не получится*.

Дополнительная проблемой оказалось, что Clang не может анализировать файл из памяти, даже если для этого есть соответствующие классы. Из объяснений выходило, что в экземпляре компилятора проверяется, является ли ввод файлом**.

А теперь публикую результат своих изысканий в виде рабочего примера динамической компиляции С++ кода с последующей его загрузкой и выполнением скомпилированных функций. Исходники адаптированны под актуальную версию Clang 12. Пояснения к коду я перевел и дополнил перед публикацией, а ссылки на исходные материалы приведены в конце статьи.

  • *) Кажется в 14 версии планируется реализовать C интерфейс для генерации исполняемых файлов.
  • **) На самом деле, Clang может (или теперь может) компилировать файлы из оперативной памяти, поэтому в исходники я добавил и эту возможность.
Читать дальше →
Total votes 16: ↑15 and ↓1 +14
Comments 12

Генератор абсурда за пять минут с NLTK и TreeTagger

Reading time 7 min
Views 5.9K


Этот текст, при его очевидной абсурдности и лишённости смысла, мог показаться вам смутно знакомым. Это начало поэмы «Москва – Петушки», в котором слова, принадлежащие одной части речи, перемешаны между собой в случайном порядке.

Насколько сложно в наш век всеобщего проникновения машинного обучения и NLP набросать такую игрушку? О, это очень легко.
Читать дальше →
Total votes 12: ↑11 and ↓1 +10
Comments 12

Эффект Даннинга-Крюгера — не то, чем кажется или Почему деление на умных и глупых — само по себе глупость

Reading time 9 min
Views 193K
Эффект Даннинга-Крюгера — когнитивное искажение, при котором люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации. Это довольно свежее понятие — сам феномен в такой форме был описан современными психологами Дэвидом Даннингом и Джастином Крюгером только в 1999 году, которое уже набрало большую популярность в кругах образованных людей.

Рассказ Василия Шукшина «Срезал» — художественная иллюстрация эффекта Даннинга-Крюгера в действии

Ирония популярности эффекта Даннинга-Крюгера, описывающего когнитивное искажение (bias) в том, что его упоминание само по себе выражает куда более старое когнитивное искажение — склонность людей, обладающих выраженной компетентностью в какой-либо области, к интеллектуальной сегрегации — делению людей на две категории: умных и глупых (себя, разумеется, относя к первой). Основанием для распределения других по корзинкам дураков и умников они считают собственную компетентность — и активно прибегают к упоминанию «эффекта Даннинга-Крюгера», чтобы записать кого-то в невежи, не замечая, что сами при этом, используя его таким образом, демонстрируют эффект Даннинга-Крюгера в действии.

Чего не знают даже сами Даннинг и Крюгер — что их эффект вовсе не эффект, характеризующий каких-то отдельных людей (aka глупцов), а общий принцип определения границ человеческой компетентности. Иными словами, суждения каждого человека без исключения подвержены эффекту Даннинга-Крюгера в той или иной мере в тех областях, где они не могут объективно оценить пределы своей компетентности. Даже у самых образованных людей большая часть сторон их жизни находится за пределами круга их экспертизы. И тяжелее всего подвержены эффекту Даннинга-Крюгера люди, которые считают, что этот эффект их не касается, и используют его для выделения себя в отдельную от «дураков» интеллектуальную касту.
Не эффект, а универсальный принцип Даннинга-Крюгера
Total votes 118: ↑79 and ↓39 +40
Comments 229

Растения I класса опасности. Памятка по идентификации

Reading time 15 min
Views 153K
Признаю честно, я не собирался сейчас писать заметку, ибо в лавине разномастного хабр-научпопа ботанике с примесью химии конкурировать достаточно сложно. Да и все, кому интересны мои публикации давным-давно координируются телеграм-каналом, а самые активные даже patreon-ируют и влияют на создание контента. Но внезапно, после того, как аннотация заметки в фэйсбуке набрала кучу репостов, я решил вынести ее на Хабр, ибо «Знание-сила». Под катом короткая статья, про растительные сверхтоксины, которые в прямом смысле вокруг нас. Как не крути, а это надо знать всем!

Вторая часть — Токсины растений. User Stories
Третья часть — Ядовитые декоративные растения в саду и огороде. Справочник
Четвертая часть — Опасные «вкусняшки». Ядовитые лесные ягоды. Памятка для детей и взрослых


Определить сверхтоксичное растение!
Total votes 170: ↑164 and ↓6 +158
Comments 164

Ковид-пандемия: взгляд ковидоскептика

Reading time 62 min
Views 156K


Роман Левентов leventov
Довожу до вашего сведения, что я отправил ссылку на ваш пост в интернет-приемную sledcom.ru. За распространение фейков сейчас есть административная и уголовная ответственность: www.garant.ru/news/1362894. Можете считать это чем угодно, заговором, цензурой, и т. д. но надеюсь что у вас сработает инстинкт самосохранения.



Port5 Роман всё правильно сделал, респект ему.







When they say «trust the science», they really mean «don't ask questions».

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

Любые проблемы всегда выдаются за «отдельные недостатки», за «случайные инциденты». И отдельные факты действительно могут казаться такими, если не представлены в комплексе. Только общий взгляд на последовательность событий помогает выявить закономерность.

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

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

В самом начале событий мы не имели практически никакой информации и оперировали в основном догадками, но ближе к настоящему моменту ситуация прояснялась — хотя нельзя сказать, что она стала менее подозрительной, скорее даже более. Впрочем, вы сами это увидите.
Читать дальше →
Total votes 351: ↑169 and ↓182 -13
Comments 2354

Information

Rating
905-th
Location
Москва, Москва и Московская обл., Россия
Works in
Date of birth
Registered
Activity