Pull to refresh
18
0
Вадим Вележенко @velezh

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

Send message

Эффективный поиск XSS-уязвимостей

Reading time 21 min
Views 38K


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


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


Под катом — и текст, и видео. Далее повествование идет от лица Ивана.

Total votes 23: ↑23 and ↓0 +23
Comments 4

Поддержание аккуратной истории в Git с помощью интерактивного rebase

Reading time 5 min
Views 41K

Interactive rebase — один из самых универсальных инструментов Git'а. В этой статье от автора Git-клиента Tower рассказывается, как корректировать сообщения при коммитах и исправлять свои ошибки.

Читать далее
Total votes 55: ↑54 and ↓1 +53
Comments 44

20 библиотек для эффектного iOS-приложения

Reading time 6 min
Views 15K


Из огромного количества iOS-библиотек нет особого смысла составлять какие-то рейтинги. Поэтому просто представляем двадцатку эффектных/полезных инструментов для тех, кто пишет приложения под гаджеты Apple.

Все анимации являются ссылками на свои полноразмерные версии.
Большой траффик - много гиф-анимации
Total votes 23: ↑22 and ↓1 +21
Comments 13

Современный код для выполнения HTTP запросов в Swift 5 с помощью Combine и применение их в SwiftUI. Часть 1

Reading time 27 min
Views 19K


Выполнение HTTP запросов — это один из самых важных навыков, которые необходимо получить при разработке iOS приложений. В более ранних версиях Swift (до версии 5) вне зависимости от того, формировали ли вы эти запросы «с нуля» или с использование известного фреймворка Alamofire,  вы в конечном итоге получали сложный и запутанный код с callback типа completionHandler: @escaping(Result<T, APIError>) -> Void.

Появление в Swift 5 нового фреймворка функционального реактивного программирования Combine в сочетании с уже существующими URLSession и Codable предоставляет вам все необходимые инструменты для самостоятельного написания очень компактного кода для выборки данных из интернета.

В этой статье в соответствии с концепцией Combine мы будем создавать «издателей» Publisher для выборки данных из интернета, на которые в дальнейшем сможем легко «подписаться» и использовать при проектировании UI как с помощью UIKit, так и с помощью SwiftUI.

В SwiftUI это выглядит более лаконично и более эффектно, так как действие «издателей» Publisher не ограничивается просто выборкой данных, а простирается дальше, вплоть до управления пользовательским интерфейсом (UI). Дело в том, что в SwiftUI разделение данных и View осуществляется с помощью ObservableObject классов с @Published свойствами, изменения которых SwiftUI АВТОМАТИЧЕСКИ отслеживает и полностью «перерисовывает» свои View.

В эти ObservableObject классы можно очень просто заложить определенную бизнес-логику приложения, если некоторые из этих @Published свойств являются результатом синхронных и/ или асинхронных преобразований других @Published  свойств, которые можно напрямую менять такими «активными» элементами пользовательского интерфейса (UI) как текстовые поля TextField, Picker, Stepper, Toggle и т.д.
Читать дальше →
Total votes 5: ↑5 and ↓0 +5
Comments 1

Современный код для выполнения HTTP запросов в Swift 5 с помощью Combine и применение их в SwiftUI. Часть 2. Hacker News

Reading time 15 min
Views 5.8K


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



В предыдущих статьях  на примере базы данных фильмов TMDb и агрегатора новостей NewsAPI.org была представлена стратегия применения Combine для формирования HTTP запросов и использования их во View Model для управления UI, спроектированного с помощью SwiftUI. В этой статье мы в точности воспроизведем ту же самую стратегию для разработки приложения, взаимодействующего с агрегатором новостей Hacker News, но добавим работу с «внешним» издателем Timer и для простоты исключим обработку ошибок.

Надо сказать, что выборка статей на ресурсе Hacker News имеет совершенно другую логику, чем в новостном агрегаторе NewsAPI.org, но технология, основанная на выполнении HTTP запросов с помощью Combine, прекрасно показывает свою гибкость и в этой ситуации. Кроме того, информация на сайте Hacker News очень часто обновляется и использование внешнего «издателя» Timer позволит автоматически отслеживать поступающие на сайт новые истории (Story), именно так их называют на этом ресурсе.

API агрегатора новостей Hacker News можно использовать совершенно свободно и не требуется никакой регистрации для аккаунта разработчика. Это здорово, потому что вы можете сразу начать работать над кодом без длительной регистрации, как мы делали это с другими public APIs.
Читать дальше →
Total votes 4: ↑4 and ↓0 +4
Comments 0

Ищем баги в PHP коде без статических анализаторов

Reading time 10 min
Views 12K

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


Пример гипотезы:


Функции strpos легко передать аргументы в неправильном порядке. 

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


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



Под катом:


  • Поиск и разбор багов в open source проектах.
  • Quick start по phpgrep.
  • Принцип работы синтаксического поиска.



Читать дальше →
Total votes 44: ↑41 and ↓3 +38
Comments 23

Ссылки в Windows, символьные и не только

Reading time 3 min
Views 389K

Предыстория


В своём топике "Впечатления от Яндекс.Субботника" хабрачеловек absolvo высказал удивление, что один из докладчиков не знал о том, что символьные ссылки есть и в Windows. Честно говоря, не знал этого и я, поэтому поинтересовался об этих ссылках в комментариях.

Думаю, то, что удалось выяснить, может показаться кому-нибудь полезным.
Читать дальше →
Total votes 57: ↑52 and ↓5 +47
Comments 108

Резистор в цепи затвора или как делать правильно

Reading time 4 min
Views 79K


Всем доброго времени суток!

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

Любому из этих случаев я буду очень рад.
Читать дальше →
Total votes 51: ↑48 and ↓3 +45
Comments 70

Максимальный постоянный ток через полевой транзистор

Reading time 6 min
Views 49K
На просторах интернета достаточно много информации о полевых транзисторах (далее ПТ) и их параметрах, но один из довольно простых, на первый взгляд, параметров, а именно – максимальный постоянный ток, который транзистор может через себя пропустить в ключевом режиме, и не сгореть – приводится в даташитах как-то размыто и неочевидно.

В статье будет рассмотрен пример расчёта максимального тока через MOSFET SQM50P03-07 (взял первый попавшийся из своей схемы), работающий в ключевом режиме, или на участке насыщения.
Читать дальше →
Total votes 56: ↑55 and ↓1 +54
Comments 45

Как реализовать язык программирования на JavaScript. Часть 2: Интерпретатор

Reading time 15 min
Views 8.8K

Здравствуйте! Представляю вам вторую часть моего перевода руководства реализации своего языка программирования на JavaScript — PL Tutorial.


От переводчика


Мы создадим свой язык программирования — λзык (в оригинале — λanguage). В процессе создания мы будем использовать достаточно много интересных техник, таких как рекурсивный спуск, стиль передачи управления, базовые техники оптимизации. Будет создано две версии интерпретатора — обычный и CPS-интерпретатор, транс-компилятор в JavaScript.


Автор оригинала — Mihai Bazon, автор известной библиотеки UglifyJS (инструмент для минимизации и форматирования JS-кода).

Читать дальше →
Total votes 13: ↑12 and ↓1 +11
Comments 8

Расширяем функционал штатной аудиосистемы

Reading time 3 min
Views 38K
Всем привет. Являюсь обладателем десятилетнего японца, в котором меня все устраивало, за исключением штатной аудиосистемы — в ней отсутствовал Bluetooth. Способов решения этой проблемы целых три:

1. Купить затычку в прикуриватель и не выпендриваться.

Минусы:

  • Качество звука
  • Управление отсутствует
  • Вывод названия песен также отсутствует

Плюсов нет.

2. Купить на разборках за немалые деньги штатный блок Bluetooth + голову поновее.

Минусы:

  • Проблемы с совместимостью разных блоков
  • Монофонический вывод звука (на некоторых блоках)
  • Цена с заменой головы и проводки практически равна нештатной магнитоле
  • Кроме латиницы поддержки нет

Плюсы:

  • Штатное оборудование

3. Сделать что-либо самому, но так, чтобы не урезать имеющийся функционал.

Минусы:

  • Нужно время
  • Денег было потрачено больше, чем если выбрать первые два варианта вместе

Плюсы:

  • Удовлетворение от проделанной работы
  • Поддержка lossless аудио
  • Поддержка кириллицы, хоть и транслитом, т.к. экран не умеет.

Как вы поняли из названия, я выбрал путь номер 3.
Total votes 57: ↑56 and ↓1 +55
Comments 94

История советских кассетников: эволюция “Десны”, MK-60 made in USA и народные магнитофоны 70-х

Reading time 9 min
Views 60K
Продолжая наш цикл о советском аудио, захотелось рассказать о кассетных магнитофонах в СССР. Известно, что в Стране Советов эти устройства стали появляться несколько позже, чем на западе, а исчезли наоборот раньше (производство их было свернуто почти сразу после распада Союза).



Мне было интересно проанализировать насколько наши разработчики приблизились к коллегам из Японии, Западной Европы и США, удалось ли им догнать и перегнать, а также понять, почему советские разработки в этой области порой пользовались редким или т. н.”вынужденным” спросом, а большинство их современников стремились приобрести зарубежные образцы.

Ввиду того, что тема достаточно обширна, я разделю материал на четыре части, в первых двух я расскажу об эволюции портативных устройств, а в остальных — рассмотрю развитие и упадок стационарных дек.
Читать дальше →
Total votes 74: ↑71 and ↓3 +68
Comments 156

Самогонный аппарат — полный автомат. Часть 2. Сепаратор. Холодильник. Куб. Алгоритмы

Reading time 18 min
Views 48K
Прошло 4 года с тех пор, как я опубликовал статью «Концепт: самогонный аппарат — полный автомат». 4 года, Карл!

Идея не была заброшена. Мало того, она — как заноза в мозгу не давала покоя. И за 4 года было кое-что сделано. Методом проб и ошибок я постепенно вышел на реализацию этого проекта. По крайней мере — уже виден свет в конце тоннеля.

Красивый самогонный аппарат
КДПВ. Красивый рабочий аламбик. «Montanya distillers Co», Crested Butte, Colorado, USA.

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

2. Отказался от идеи индукционной плиты, как подсказывал vvzvlad по причине повышенной сложности управления индукционной плитой. Проверял на своей индукционной нагревательной поверхности — без ковыряния мозгов плиты управлять ей крайне сложно. Подцепиться к сенсорной панели плиты не инвазивно не удалось.

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

4. От жидкостного охлаждения холодильника в силу объективных причин (подводка, замерзание в случае двухконтурности и тому подобных проблем).

Я постараюсь рассказать обо всех решениях, к которым пришел в процессе реализации идеи.

Много тяжеловесных изображений и спойлеров.
Да, я же ждал эту статью!
Total votes 58: ↑56 and ↓2 +54
Comments 101

Вредные советы: как правильно писать техническую документацию?

Reading time 7 min
Views 11K

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


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

На этот раз под катом – руководство нашего технического писателя Андрея Старовойтова, которое поможет сделать вашу документацию для пользователей проще и понятнее (описанные приемы применяют при документировании своих продуктов Apple, Microsoft и другие компании).
Читать дальше →
Total votes 24: ↑22 and ↓2 +20
Comments 4

Конференция DEFCON 19. Взламываем MMORPG ради веселья и прибыли. Часть 1

Reading time 14 min
Views 9.8K
Меня зовут Джош Филлипс и я хочу представить вам особого гостя, которого нет в списках выступающих, его зовут Майк Доннелли. Позже я дам ему возможность представить себя. Обычно я выступаю на конференции последним, поэтому надеюсь, что наше выступление не сыграет для вас роль колыбельной. Если кто-то ещё собирается выступить после нас, я ему не завидую, но ничего не могу с этим поделать. Ну что же, давайте начнём.



Я слышал, что всем сегодняшним докладчикам не везло, потому что у них возникали проблемы с показом слайдов, но надеюсь, что у нас с всё получится. Итак, в реальной жизни я исследую вредоносное программное обеспечение в лаборатории Касперского. Я также работал аналитиком вредоносного ПО в компании Microsoft и вопреки расхожему мнению или тому, что можно найти в Википедии, название вируса Conficker не является немецким или датским эквивалентом английского слова «assfucker», это всего лишь придумана мной игра слов. Так что придумывание названия для этого компьютерного червя можно считать самым большим достижением в моей жизни. Я являюсь «золотым фармером» и в качестве хобби я написал несколько ботов для компьютерных игр, попробуйте догадаться, для каких именно. Теперь я предоставлю слово Майку, чтобы он рассказал о себе.

Майк Доннелли: я Майк Доннели, известный под ником Mercury, создавший интернет-бота Glider для игры World of Warcraft. Установлением прав собственности на этого бота, 100000 копий которого были распроданы третьей стороной за 4 миллиона долларов, занимался суд. Мне удалось обжаловать решение суда первой инстанции, и апелляционный суд постановил возместить мне, как истинному владельцу, ущерб в размере 6,5 миллионов долларов, однако в любом случае судебное дело не доставило мне особого удовольствия.

Total votes 16: ↑15 and ↓1 +14
Comments 9

Introscope: ну очень ленивое unit-тестирование

Reading time 2 min
Views 3.2K

Мы на работе пишем много часто меняющейся бизнес-логики на JS (стартап же). Даже слишком много. И всё это хочется по старой привычке тестировать, но как-нибудь побыстрее, чтобы тесты особо не мешали говнокодить, когда это нужно, и не подгонять под тесты особенно сильно структуру модулей. В какой-то момент пришла мысль, что можно это еще и автоматизировать как-то с помощью простенького babel-плагина, чтобы он для начала все приватные переменные и методы выворачивал в тестовой среде, а в продакшене не трогал. Это оказалось довольно просто и увлекательно. Так появился Introscope, которым мы теперь тестируем всё более-менее сложное.

Читать дальше →
Total votes 18: ↑17 and ↓1 +16
Comments 2

Как работать с async/await в циклах JavaScript

Reading time 3 min
Views 147K

Как запустить асинхронные циклы по порядку или параллельно в JavaScript?


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

Читать дальше →
Total votes 31: ↑24 and ↓7 +17
Comments 33

Рендеринг шрифтов с помощью масок покрытия, часть 1

Reading time 12 min
Views 5.2K
image

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

  1. Мы должны иметь возможность рендерить любой шрифт любого размера в реальном времени, чтобы адаптироваться к системным шрифтам и их размерам, выбранным пользователями Windows.
  2. Рендеринг шрифтов должен быть очень быстрым, никаких торможений при рендеринге шрифтов не допускается.
  3. В нашем UI куча плавных анимаций, поэтому текст должен иметь возможность плавно перемещаться по экрану.
  4. Он должен быть читаемым при малых размерах шрифтов.

Не будучи в то время большим специалистом в этом вопросе, я поискал информацию в Интернете и нашёл множество техник, используемых для рендеринга шрифтов. Также я пообщался с техническим директором Guerrilla Games Михилем ван дер Леу. Эта компания экспериментировала со множеством способов рендеринга шрифтов и их движок рендеринга был одним из лучших в мире. Михиль вкратце изложил мне свою идею новой техники рендеринга шрифтов. Хотя нам вполне было бы достаточно уже имевшихся техник, меня эта идея заинтриговала и я приступил к её реализации, не обращая внимания на открывшийся мне чудесный мир рендеринга шрифтов.
Читать дальше →
Total votes 12: ↑10 and ↓2 +8
Comments 4

Как усилить защищенность веб-приложений при помощи HTTP заголовков

Reading time 18 min
Views 32K
image

Это третья часть серии по веб-безопасности: вторая часть была «Web Security: введение в HTTP», первая "Как работают браузеры — введение в безопасность веб-приложений".

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

В настоящее время браузеры внедрили очень широкий спектр заголовков, связанных с безопасностью, чтобы злоумышленникам было труднее использовать уязвимости. В этой статье мы попытаемся обсудить каждый из них, объясняя, как они используются, какие атаки они предотвращают, и немного истории по каждому заголовку.
Читать дальше →
Total votes 35: ↑34 and ↓1 +33
Comments 9

Высокая доступность MySQL в GitHub

Reading time 14 min
Views 9.9K

GitHub использует MySQL в качестве основного хранилища данных для всего, что не связано с git, поэтому доступность MySQL имеет ключевое значение для нормальной работы GitHub. Сам сайт, интерфейс API на GitHub, система аутентификации и многие другие функции требуют доступа к базам данных. Мы используем несколько кластеров MySQL для обработки различных служб и задач. Они настроены по классической схеме с одним главным узлом, доступным для записи, и его репликами. Реплики (остальные узлы кластера) асинхронно воспроизводят изменения главного узла и обеспечивают доступ для чтения.


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


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


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


Читать дальше →
Total votes 25: ↑23 and ↓2 +21
Comments 4

Information

Rating
Does not participate
Location
Украина
Registered
Activity