В феврале 1977 года, во втором выпуске журнала с говорящим названием «Байт» было опубликовано письмо некоего Вернера Бухгольца, который приоткрыл тайну появления этого термина. Почему? Потому что именно он стоял у его основ и вспомнил, что первое применение термина было в далёком 1955 году, в первые дни разработки IBM 7030 Stretch. Через год из многих вариантов «стандартным» стал восьмибитный байт, но эта информация содержалась во внутренних документах для IBM 7030 Stretch и в статье «система связей», которая предназначалась для внутреннего пользования. Именно Вернер решил использовать написание byte, чтобы не допустить случайной путаницы с bit. Лишь в июне 1959 года, в статье «Обработка данных по частям», термин официально «родился» во всем привычном значении и «ввёл» Вернера Бухгольца в историю информационных технологий. Ключевую роль в этом сыграл успех и провал суперкомпьютера Stretсh.
Читать далееМетод CUPED уже давно завоевал популярность в анализе A/B-тестов, предоставляя возможность выявлять эффекты меньших размеров. В этой статье мы подробно рассмотрим применение данного подхода на этапе дизайна эксперимента. Мы исследуем, как можно сократить размеры выборок, не теряя при этом в статистической мощности теста.
Читать далееСегодня расскажем вам о нестандартном подходе к защите веб-приложений
с помощью PTAF PRO. Мы с коллегами столкнулись с интересной задачей:
как защитить уязвимое приложение от вредоносных JSON-запросов, если WAF официально не поддерживает их обработку в пользовательских правилах?
В этой статье пройдем путь от постановки проблемы до ее решения, используя регулярные выражения и нестандартные настройки PTAF PRO. Руслан Ануфренка, инженер в группе технической поддержки информационной безопасности
в К2 Кибербезопасность расскажет, как:
1. Настроить систему для работы с внешним агентом PT AF PRO;
2. Закрыть уязвимость Zero Stars в Juice Shop;
3. Создать и применить пользовательское правило с помощью регулярных выражений;
4. Оценить эффективность и ограничения такого решения.
Статья будет полезна специалистам по информационной безопасности, разработчикам и всем, кто интересуется тонкостями настройки WAF и защиты веб-приложений.
Читать далееВ начале лета 2024 года мы получили предложение от правительства Ярославской области проверить качество сервисов передачи данных, предоставляемых сотовыми операторами, на автотрассе М8 «Холмогоры». Выражаясь на профессиональном сленге – провести драйв-тест в границах области.
Рутинная задача для отдела качества сотового оператора или специализирующихся на подобных сервисах компаний, для нас стала небольшим вызовом – готового комплекса для проведения таких измерений у нас не было.
Стандартно подобный измерительный комплекс состоит из следующих компонентов:
• специализированного программного обеспечения, позволяющего собирать, синхронизировать и сохранять измерения;
• измерительного приемника – сканера, при помощи которого оценивают покрытие сотовой сети;
• измерительных терминалов, которые позволяют оценить предоставляемые сервисы – качество голосовой связи, скорость передачи данных и прочее;
• GPS-приемника, осуществляющего геопривязку измерений.
У нас в наличии не было главного – измерительного терминала. Как правило, это смартфон или сотовый модем, чаще всего определенной модели со специализированной прошивкой, совместимой с измерительным ПО. Обычно их продают те же компании, что и производят измерительное ПО. Но вот беда - после известных событий 2022 года эти компании официально ушли с российского рынка и покупка их продукции стала если и не невозможной, то очень долгой и затратной. При таких вводных предстояло придумать обходной путь, чем мы и занялись.
Читать далееКоманда Spring АйО перевела и адаптировала доклад "Endpoint versioning made simple" Бауке Найхаус (Bouke Nijhuis) с последнего Devoxx Belgium.
В докладе автор объясняет, зачем нужно версионировать API, и подробно сравнивает различные подходы к реализации этой задачи.
Читать далееSpring Data JPA считается швейцарским ножом для работы с БД в Java. Однако Spring Data JPA не заслуживает своего триумфа и вот почему...
Читать далееИспользуя данные всепланетного обзора eROSITA, астрономы создали 3D-карту низкоплотного пузыря рентгеновского излучения, состоящего из горячего газа с температурой в миллион градусов, который окружает Солнечную систему.
Исследование выявило крупномасштабный температурный градиент внутри этого т.н. местного горячего пузыря (МГП) — то есть в нём есть как горячие, так и холодные области. Команда подозревает, что этот температурный градиент мог быть вызван превращением массивных звёзд в сверхновые, что привело к повторному нагреву пузыря. Такое нагревание должно было привести к расширению кармана с газом низкой плотности.
Читать далееРазбирая очередной инцидент, связанный с атакой шифровальщика, и услышав в очередной раз вопрос «как же так, ведь у нас есть антивирус!?», мы решили поделиться с комьюнити информацией о возобновившейся активности группировки DсHelp.
В этой статье расскажем про участившиеся атаки DсHelp, рассмотрим тактики и техники данной группы, а также отметим, почему антивирус — не панацея и как легитимное ПО может быть использовано против вас.
Читать далееВ 2023 году Huawei заявили об окончательном уходе от Android и переходе на собственную HarmonyOS Next. Для разработчиков это значит, что не получится создавать нативные приложения силами одной команды. Бизнес ждут новые расходы или снижение охвата аудитории.
Меня зовут Сергей, я техлид Android-разработки в Surf. В статье расскажем, чего ожидать владельцам приложений в России, стоит ли готовиться к очередной разработке на новой ОС и как это сделать.
Читать дальшеПаттерны проектирования на языке Kotlin
Это вторая часть статьи. Первая её часть здесь.
Поведенческие паттерны
13. Chain of Responsibility (Цепочка обязанностей)
Описание: Позволяет передавать запросы последовательно по цепочке обработчиков.
Когда использовать: Когда есть более одного объекта, который может обработать запрос.
Пример кода:
abstract class Handler(private val next: Handler?) { open fun handle(request: String) { next?.handle(request) } } class AuthenticationHandler(next: Handler?) : Handler(next) { override fun handle(request: String) { if (request.contains("auth")) { println("Аутентификация прошла") super.handle(request) } else { println("Аутентификация не удалась") } } } class LoggingHandler(next: Handler?) : Handler(next) { override fun handle(request: String) { println("Логирование запроса: $request") super.handle(request) } } fun main() { val handler = AuthenticationHandler(LoggingHandler(null)) handler.handle("auth: запрос к ресурсу") }
14. Command (Команда)
Описание: Инкапсулирует запрос как объект, позволяя параметризовать клиентов с разными запросами.
Когда использовать: Когда нужно параметризовать объекты выполняемым действием.
Пример кода:
interface Command { fun execute() } class Light { fun turnOn() = println("Свет включен") fun turnOff() = println("Свет выключен") } class TurnOnCommand(private val light: Light) : Command { override fun execute() = light.turnOn() } class TurnOffCommand(private val light: Light) : Command { override fun execute() = light.turnOff() } class RemoteControl { private val commands = mutableListOf<Command>() fun addCommand(command: Command) = commands.add(command) fun executeCommands() = commands.forEach { it.execute() } } fun main() { val light = Light() val turnOn = TurnOnCommand(light) val turnOff = TurnOffCommand(light) val remote = RemoteControl() remote.addCommand(turnOn) remote.addCommand(turnOff) remote.executeCommands() }
15. Iterator (Итератор)
Описание: Предоставляет способ последовательного доступа к элементам агрегатного объекта без раскрытия его внутреннего представления.
Когда использовать: Когда нужно предоставить единый интерфейс для обхода различных коллекций.
Пример кода:
class Notification(val message: String) class NotificationCollection { private val notifications = mutableListOf<Notification>() fun addNotification(notification: Notification) = notifications.add(notification) fun iterator(): Iterator<Notification> = notifications.iterator() } fun main() { val collection = NotificationCollection() collection.addNotification(Notification("Уведомление 1")) collection.addNotification(Notification("Уведомление 2")) collection.addNotification(Notification("Уведомление 3")) val iterator = collection.iterator() while (iterator.hasNext()) { val notification = iterator.next() println(notification.message) } }
16. Mediator (Посредник)
Читать далееРассмотрим одну задачу, которая на leetcode маркирована как "medium", хотя на самом деле это невероятно сложная задача. Примечательна она тем, что допускает в разной степени оптимальные решения, самые упрощённые из которых действительно весьма просты, а самые оптимальные ещё не найдены современной наукой. В этой задаче ценно то, что на её примере можно изучать целый ряд техник программирования.
Читать далееВсё, что я делал после одобрения петиции по программе талантов EB-1A и до въезда в США в статусе резидента. Все формы, которые я заполнял. Каждый полученный ответ и каждый скриншот на пути.
Читать далееНастоящий рассвет в дизайне советских товарных знаков наступил после принятия одноименного Постановления Совета Министров СССР в 1962 году.
Читать далееНесколько лет назад я начал учить английский язык. Я стал пользоваться приложениями для запоминания слов. И вроде бы они удобные, красивые, даже почти бесплатные, но там можно было выбирать слова по группам или учить то что есть. Например выбираем категорию Медицина, а там по мимо основных базовых терминов еще и названия болезней, которые в русском языке употребляются раз в 100 лет. Не думаю что американцы или англичане сильно от нас отличаются физиологически.
И вот мне пришла мысль создать приложения для изучения слов где слова можно выбирать самому из списка. А что бы не учить всякий шлак я нагуглил в интернете список самых частых 1000 английских слов. Три месяца ушло на изучение явы и написания приложения. Хотел выложить в плей маркет, но началась война и плей маркет был закрыт.
Получилось вот так https://www.rustore.ru/catalog/app/com.example.word_1000_eng
Вот так выглядит мой список популярных слов
Читать далееВ 80% случаев к нам приходят клиенты, которые уже исчерпали ресурс сарафанного радио, попробовали вкладывать в рекламу и получили заказчиков, которые не могут сформулировать задачу и желаемый конечный результат. В результате — слитые рекламные бюджеты, неквалифицированные заказчики и неудачные проекты.
В этой статье рассказываю на примерах и кейсах, как убить двух зайцев одним неочевидным, но эффективным способом — с помощью обучающего маркетинга.
Читать далееВ этой статье мы рассмотрим ключевые аспекты расчета размера выборки для AB-тестирования, основанного на нормальном приближении. Я провожу вас через логическую цепочку планирования эксперимента, объясняя важные статистические концепции и формулы, необходимые для проведения AB-теста о равенстве средних значений численного признака. Эта информация будет особенно полезна для аналитиков, готовящихся к собеседованиям или стремящихся углубить свое понимание методологии экспериментов.
Читать далееПривет, Хабр. Меня зовут Дима Фролов. Я автор команды спецпроектов МТС Диджитал, а еще около 10 лет ремонтирую технику: от мобильных телефонов до фотокамер и телевизоров. Сегодня хочу поделиться самыми нелепыми случаями поломки техники, с которыми сталкивался. Все они произошли из-за некорректных действий пользователя, и у всех один результат: техника ушатана. Самое обидное, что если бы человек среагировал правильно, его девайс можно было бы починить быстро и с минимальными вложениями. Вместо этого или ремонтировать было уже нечего, или ремонт стоил как крыло самолета. Подробности — дальше.
Читать далееВ 1965 году Патрик Хаггерти, президент компании Texas Instruments (TI), захотел сделать новую ставку на будущее электроники. Он считал, что в этом будущем, как он часто говорил, использование электроники станет «повсеместным». За десять лет до этого он добился разработки карманного радио на транзисторах, чтобы продемонстрировать потенциал твердотельной электроники (основанной на маленьких кусочках полупроводникового материала, вырезанных из пластины, вместо пухлых электронных ламп). На очереди была новая форма электронных компонентов: интегральные схемы, в которых на одном полупроводниковом чипе размещались десятки и даже сотни компонентов. Вместе с Джеком Килби, пионером интегральных схем, а ныне одним из ведущих научных руководителей TI, Хаггерти задумал новый потребительский продукт, достойный этой новой эпохи: калькулятор, который «мог бы поместиться в кармане пальто и продаваться менее чем за 100 долларов». В то время типичный калькулятор по размеру, форме и весу напоминал печатную машинку и стоил более 1000 долларов (более 10 000 долларов в долларах 2024 года)[1].
Читать далее