Привет, Хабр! Всем нравятся отзывчивые приложения. Ещё лучше, когда в них есть уместные анимации. В этой статье я расскажу и покажу со всем «мясом», как правильно показывать, скрывать, крутить, вертеть и делать всякое с всплывающими экранами.
User
Контрибьютим в Swift
Знакомо, узнали?
Каждый раз когда вы пытались объявить опциональное замыкание @escaping
в Swift компилятор ругался и писал непонятную ошибку @escaping attribute only applies to function types
. Мне это не нравилось, и я решил это исправить. Теперь компилятор Swift 5.3 вместо этой ошибки напишет Closure is already escaping in optional type argument
.
И сегодня мы разберемся, как сделать свой вклад в развитие языка Swift.
23 минуты. Оправдание тугодумов
Проявлялось это просто: на совещаниях и обсуждениях я не мог быстро придумывать решение задачи. Все чего-то говорят, иногда умное, а я – сижу и молчу. Даже как-то неудобно было.
Все остальные тоже думали, что я тупой. Поэтому меня перестали звать на совещания. Звали тех, кто что-то говорит без промедления.
А я, выйдя с совещания, продолжал думать над задачей. И, как говорит устойчивое идиоматическое выражение, хорошая мысля приходит опосля. Находил нормальное, иногда интересное, а бывало – что и офигенное решение. Но оно уже никому не было нужно. Типа после драки кулаками не машут.
Просто культура в тех компаниях, где я начинал работать, была модерновая. Ну, как там это бывает – «совещание должно закончиться принятием решения». Вот чего придумали на совещании, то и принимается. Даже если решение — полная фигня.
Истинное могущество регулярных выражений
«Ты не можешь парсить HTML с помощью регулярных выражений, потому что HTML не является регулярным. Используй XML парсер, и будет тебе счастье»
Это утверждение — в контексте вопроса — находится где-то между сильно вводящим в заблуждение и абсолютно неправильным. Что я хочу попытаться продемонстрировать в этой статье, так это то, насколько могущественны современные регулярные выражения на самом деле.
Почему тебе не нужно идеальное решение
В этой статье я объясню, почему тебе не нужно идеальное решение.
8 простых UI приёмов чтобы сделать дизайн-прототип динамичным, не прибегая к анимации
Материал этой статьи является следствием моих дизайн-экспериментов и выводов за последний год-полтора непрерывного дизайн гринда. Я неустанно собирал ui kit’ы, экспериментировал с контентом в плейсхолдерах, стилями, тенями текстами и состояниями, чтобы понять влияет ли это на конверсию. Иначе говоря, смогу ли я увеличить продажи дизайн-продуктов для Figma, если добавлю немного визуальной динамики в статичные дизайн-макеты, чтобы сделать темплейты интереснее и функциональнее.
Как выбрать случайное число от 1 до 10
Предположим, что в этой комнате чуть более 8500 студентов.
Самое простое — попросить кого-нибудь: «Эй, выбери случайное число от одного до десяти!». Человек отвечает: «Семь!». Отлично! Теперь у вас есть число. Однако вы начинаете задаваться вопросом, является ли оно равномерно распределённым?
Многопоточность (concurrency) в Swift 3. GCD и Dispatch Queues
Итак, у вас есть приложение, оно работает на
main thread
(главном потоке), который отвечает за выполнение кода, отображающего ваш пользовательский интерфейс (UI
). Как только вы начинаете добавлять к вашему приложению такие «затратные по времени» куски кода, как загрузка данных из сети или обработка изображений на main thread
(главном потоке), то работа вашего UI
начинает сильно замедляться и даже может привести к полному его «замораживанию». Как можно изменить архитектуру приложения, чтобы таких проблем не возникало? В этом случае на помощь приходит многопоточность (
сoncurrency
), которая позволяет одновременно выполнять две или более независимые задачи (tasks
): вычисления, загрузку данных из сети или с диска, обработку изображений и т.д.Атомарные и неатомарные операции
Перевод статьи Джефа Прешинга Atomic vs. Non-Atomic Operations. Оригинальная статья: http://preshing.com/20130618/atomic-vs-non-atomic-operations/
В Сети уже очень много написано об атомарных операциях, но в основном авторы рассматривают операции чтения-модификации-записи. Однако, существуют и другие атомарные операции, например, атомарные операции загрузки (load) и сохранения (store), которые не менее важны. В этой статье я сравню атомарные загрузки и сохранения с их неатомарными аналогами на уровне процессора и компилятора C/C++. По ходу статьи мы также разберемся с концепцией «состояния гонок» с точки зрения стандарта C++11.
Преобразуем изображение в звук — что можно услышать?
В недавней публикации здесь на сайте описывалось устройство, позволяющее незрячим людям «видеть» изображение, преобразуя его с помощью звуковых волн. С технической точки зрения, в той статье не было никаких деталей вообще (
Что из этого получилось, подробности и примеры файлов под катом.
iOS Storyboards: анализ плюсов и минусов, best practices
Apple создала Storyboards, чтобы разработчики могли визуализировать экраны iOS-приложений и связи между ними. Не всем понравился этот инструмент, и на то есть разумные причины. Я встречал много статей с критикой Storyboards, однако так и не нашел подробного и непредвзятого анализа всех плюсов и минусов с учетом best practices. В итоге я решил написать такую статью сам.
Matrix 1.0 — релиз протокола децентрализованного обмена сообщениями
Основным новшеством (и обязательным условием использования) сервера Synapse 1.0 — реализации протокола Matrix 1.0 — является использование TLS сертификата (бесплатный Let's Encrypt тоже подходит) для домена сервера, что обеспечивает защищенную передачу данных между серверами, участвующими в федеративной сети. Поэтому если вы используете self-signed сертификат для своего домашнего сервера — необходимо создать валидный сертификат — иначе ваш сервер перестанет взаимодействовать с другими серверами сети.
Эффективная генерация числа в заданном интервале
В подавляющем большинстве моих постов о генерации случайных чисел рассматривались в основном свойства различных схем генерации. Это может оказаться неожиданным, но производительность алгоритма рандомизации может зависеть не от выбранной схемы генерации, а от других факторов. В этом посте (на который меня вдохновила превосходная статья Дэниела Лемира) мы исследуем основные причины снижения производительности генерации случайных чисел, которые часто перевешивают производительность движка ГПСЧ.
Представьте такую ситуацию:
В качестве домашнего задания Хуан и Саша реализуют одинаковый рандомизированный алгоритм на C++, который будет выполняться на одном университетском компьютере и с одним набором данных. Их код почти идентичен и отличается только в генерации случайных чисел. Хуан торопится на свои занятия по музыке, поэтому просто выбрал вихрь Мерсенна. Саша, с другой стороны, потратил несколько лишних часов на исследования. Саша провёл бенчмарки нескольких самых быстрых ГПСЧ, о которых недавно узнал из соцсетей, и выбрал наиболее быстрый. При встрече Саше не терпелось похвастаться, и он спросил Хуана: «Какой ГПСЧ ты использовал?»
«Лично я просто взял вихрь Мерсенна — он встроен в язык и вроде неплохо работает».
«Ха!», — ответил Саша. «Я использовал
jsf32
. Он намного быстрее, чем старый и медленный вихрь Мерсенна! Моя программа выполняется за 3 минуты 15 секунд!».«Хм, неплохо, а моя справляется меньше, чем за минуту», — говорит Хуан и пожимает плечами. «Ну ладно, мне пора на концерт. Пойдёшь со мной?»
«Нет», — отвечает Саша. «Мне… эээ… нужно снова взглянуть на свой код».
Эта неловкая вымышленная ситуация не особо и вымышлена; она основана на реальных результатах. Если ваш рандомизированный алгоритм выполняется не так быстро, как хотелось бы, и узким местом похоже является генерация случайных чисел, то, как это ни странно, проблема может быть и не в генераторе случайных чисел!
Может ли разум подделать Вселенную?
Объективная реальность и сами законы физики возникают из наших наблюдений в соответствии с новой концепцией, которая переворачивает с ног на голову то, что мы считаем фундаментальным.
Софи Хебден
FQXi Awardees: Маркус Мюллер 1
18 января 2019 г.
Творение космоса.
Credit: Юрий Акурс, iStock
Архитектура сервиса распределённых очередей сообщений в Яндекс.Облаке
Сегодня я хочу рассказать читателям Хабра об очередях сообщений вообще и о Yandex Message Queue в частности. Сначала я хочу объяснить, что такое «распределённая персистентная очередь сообщений» и зачем она нужна. Показать её практическую ценность, механику работы с сообщениями, поговорить про API и удобство использования. Во второй половине материала мы посмотрим на техническую сторону: как в наших очередях используется Yandex Database (это надежный фундамент нашего сервиса), как выглядят наивный и улучшенный подход к построению архитектуры, какие проблемы вызывает распределённость и как их можно решить.
Математика и игра «Сет»
Кто найдет тут «сет», получит от меня шоколадку.
Сет — гениальная игра в которую мы рубились лет 5 назад. Крики, вопли, фотографирование комбинаций.
В правилах игры написано, что ее изобрела в 1991 году генетик Марша Фалко (Marsha Falco), делая пометки во время исследования эпилепсии у немецких овчарок в 1974 году. Для тех, у кого мозг достаточно изможден математикой, через какое-то время возникает подозрение, что есть тут какие-то отголоски с планиметрией и проведением прямых через точки. (Для заданных двух карт существует одна и только одна карта, входящая с ними в один сет.)
Если вы не пишете программу, не используйте язык программирования
Лесли Лэмпорт — автор основополагающих работ в распределённых вычислениях, а ещё вы его можете знать по буквам La в слове LaTeX — «Lamport TeX». Это он впервые, ещё в 1979 году, ввёл понятие последовательной согласованности, а его статья «How to Make a Multiprocessor Computer That Correctly Executes Multiprocess Programs» получила премию Дейкстры (точней, в 2000 году премия называлась по-старому: «PODC Influential Paper Award»). Про него есть статья в Википедии, где можно добыть ещё несколько интересных ссылок. Если вы в восторге от решения задач на happens-before или проблемы византийских генералов (BFT), то должны понимать, что за всем этим стоит Лэмпорт.
Эта хабрастатья — перевод доклада Лесли на Heidelberg Laureate Forum в 2018 году. В докладе пойдёт речь о формальных методах, применяемых в разработке сложных и критичных систем вроде космического зонда Rosetta или движков Amazon Web Services. Просмотр этого доклада является обязательным для посещения сессии вопросов и ответов, которую проведет Лесли на конференции Hydra — эта хабрастатья может сэкономить вам час времени на просмотр видео. На этом вступление закончено, мы передаём слово автору.
Когда-то давно Тони Хоар написал: «В каждой большой программе живет маленькая программа, которая пытается выбраться наружу». Я бы это перефразировал так: «В каждой большой программе живет алгоритм, который пытается выбраться наружу». Не знаю, правда, согласится ли с такой интерпретацией Тони.
Как квантовый компьютер может взломать современные системы шифрования и снизить стоимость выработки аммиака?
С рассказом о событиях в “Квантовой отрасли” перед сотрудниками Acronis выступил научный руководитель группы «Квантовые информационные технологии» РКЦ Алексей Федоров. В этом посте мы приводим расшифровку его лекции о квантовых технологиях с дополнениями, чтобы поделиться полезными и интересными данными с подписчиками Acronis на Habrahabr.
Внимание! Опасный баг в реализации C++ std::map::merge и std::set::merge в Visual Studio 2017
Декомпозируя UICollectionViewCell
После просмотра Keynote WWDC 2019 и знакомства с SwiftUI, предназначенного для декларативного описания UI в коде, хочется порассуждать о том, как можно декларативно наполнять таблички и коллекции. Например, вот так:
enum Builder {
static func widgets(objects: Objects) -> [Widget] {
let header = [
Spacing(height: 25).widget,
Header(string: "Выберите страну").widget,
Spacing(height: 10, separator: .bottom).widget
]
let body = objects
.flatMap({ (object: Object) -> [Widgets] in
return [
Title(object: object).widget,
Spacing(height: 1, separator: .bottom).widget
]
})
return header + body
}
}
let objects: [Object] = ...
Builder
.widgets(objects: objects)
.bind(to: collectionView)
В коллекции это отрисуется следующим образом:
Information
- Rating
- Does not participate
- Registered
- Activity