Pull to refresh
1
0
Send message

Всплывай! Транзишены в iOS

Reading time8 min
Views27K

Привет, Хабр! Всем нравятся отзывчивые приложения. Ещё лучше, когда в них есть уместные анимации. В этой статье я расскажу и покажу со всем «мясом», как правильно показывать, скрывать, крутить, вертеть и делать всякое с всплывающими экранами.


Читать дальше →
Total votes 29: ↑29 and ↓0+29
Comments10

Контрибьютим в Swift

Reading time9 min
Views3.6K


Знакомо, узнали?


Каждый раз когда вы пытались объявить опциональное замыкание @escaping в Swift компилятор ругался и писал непонятную ошибку @escaping attribute only applies to function types. Мне это не нравилось, и я решил это исправить. Теперь компилятор Swift 5.3 вместо этой ошибки напишет Closure is already escaping in optional type argument.


И сегодня мы разберемся, как сделать свой вклад в развитие языка Swift.

Читать дальше →
Total votes 28: ↑28 and ↓0+28
Comments3

23 минуты. Оправдание тугодумов

Reading time3 min
Views191K
Я всегда думал, что я – тупой. Точнее, что я — тугодум.

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

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

А я, выйдя с совещания, продолжал думать над задачей. И, как говорит устойчивое идиоматическое выражение, хорошая мысля приходит опосля. Находил нормальное, иногда интересное, а бывало – что и офигенное решение. Но оно уже никому не было нужно. Типа после драки кулаками не машут.

Просто культура в тех компаниях, где я начинал работать, была модерновая. Ну, как там это бывает – «совещание должно закончиться принятием решения». Вот чего придумали на совещании, то и принимается. Даже если решение — полная фигня.
Читать дальше →
Total votes 397: ↑381 and ↓16+365
Comments334

Истинное могущество регулярных выражений

Reading time16 min
Views93K
Как частый посетитель тэга PHP на StackOverflow, я очень часто встречаю вопросы о том, как распарсить какие-то конкретные аспекты HTML, используя регулярные выражения. Самый распространённый ответ на это:
«Ты не можешь парсить HTML с помощью регулярных выражений, потому что HTML не является регулярным. Используй XML парсер, и будет тебе счастье»

Это утверждение — в контексте вопроса — находится где-то между сильно вводящим в заблуждение и абсолютно неправильным. Что я хочу попытаться продемонстрировать в этой статье, так это то, насколько могущественны современные регулярные выражения на самом деле.
Читать дальше →
Total votes 182: ↑172 and ↓10+162
Comments39

Почему тебе не нужно идеальное решение

Reading time2 min
Views17K
Перфекционизм — ласковый убийца. Он убил больше нервов, отношений и проектов, чем кухонный нож, автомат Калашникова и твой заказчик вместе взятые.

В этой статье я объясню, почему тебе не нужно идеальное решение.
Читать дальше →
Total votes 30: ↑25 and ↓5+20
Comments28

8 простых UI приёмов чтобы сделать дизайн-прототип динамичным, не прибегая к анимации

Reading time6 min
Views32K


Материал этой статьи является следствием моих дизайн-экспериментов и выводов за последний год-полтора непрерывного дизайн гринда. Я неустанно собирал ui kit’ы, экспериментировал с контентом в плейсхолдерах, стилями, тенями текстами и состояниями, чтобы понять влияет ли это на конверсию. Иначе говоря, смогу ли я увеличить продажи дизайн-продуктов для Figma, если добавлю немного визуальной динамики в статичные дизайн-макеты, чтобы сделать темплейты интереснее и функциональнее.
Читать дальше →
Total votes 43: ↑37 and ↓6+31
Comments21

Как выбрать случайное число от 1 до 10

Reading time6 min
Views41K
Представьте, что вам нужно сгенерировать равномерно распределённое случайное число от 1 до 10. То есть целое число от 1 до 10 включительно, с равной вероятностью (10%) появления каждого. Но, скажем, без доступа к монетам, компьютерам, радиоактивному материалу или другим подобным источникам (псевдо) случайных чисел. У вас есть только комната с людьми.

Предположим, что в этой комнате чуть более 8500 студентов.

Самое простое — попросить кого-нибудь: «Эй, выбери случайное число от одного до десяти!». Человек отвечает: «Семь!». Отлично! Теперь у вас есть число. Однако вы начинаете задаваться вопросом, является ли оно равномерно распределённым?
Читать дальше →
Total votes 43: ↑41 and ↓2+39
Comments77

Многопоточность (concurrency) в Swift 3. GCD и Dispatch Queues

Reading time28 min
Views320K
Надо сказать, что многопоточность (сoncurrency) в iOS всегда входит в вопросы, задаваемые на интервью разработчикам iOS приложений, а также в число топ ошибок, которые делают программисты при разработке iOS приложений. Поэтому так важно владеть этим инструментом в совершенстве.
Итак, у вас есть приложение, оно работает на main thread (главном потоке), который отвечает за выполнение кода, отображающего ваш пользовательский интерфейс (UI). Как только вы начинаете добавлять к вашему приложению такие «затратные по времени» куски кода, как загрузка данных из сети или обработка изображений на main thread (главном потоке), то работа вашего UI начинает сильно замедляться и даже может привести к полному его «замораживанию».



Как можно изменить архитектуру приложения, чтобы таких проблем не возникало? В этом случае на помощь приходит многопоточность (сoncurrency), которая позволяет одновременно выполнять две или более независимые задачи (tasks): вычисления, загрузку данных из сети или с диска, обработку изображений и т.д.
Читать дальше →
Total votes 24: ↑23 and ↓1+22
Comments14

Атомарные и неатомарные операции

Reading time8 min
Views122K


Перевод статьи Джефа Прешинга Atomic vs. Non-Atomic Operations. Оригинальная статья: http://preshing.com/20130618/atomic-vs-non-atomic-operations/

В Сети уже очень много написано об атомарных операциях, но в основном авторы рассматривают операции чтения-модификации-записи. Однако, существуют и другие атомарные операции, например, атомарные операции загрузки (load) и сохранения (store), которые не менее важны. В этой статье я сравню атомарные загрузки и сохранения с их неатомарными аналогами на уровне процессора и компилятора C/C++. По ходу статьи мы также разберемся с концепцией «состояния гонок» с точки зрения стандарта C++11.
Читать дальше →
Total votes 44: ↑43 and ↓1+42
Comments10

Преобразуем изображение в звук — что можно услышать?

Reading time5 min
Views30K
Привет Хабр.

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



Что из этого получилось, подробности и примеры файлов под катом.
Читать дальше →
Total votes 32: ↑26 and ↓6+20
Comments30

iOS Storyboards: анализ плюсов и минусов, best practices

Reading time14 min
Views21K


Apple создала Storyboards, чтобы разработчики могли визуализировать экраны iOS-приложений и связи между ними. Не всем понравился этот инструмент, и на то есть разумные причины. Я встречал много статей с критикой Storyboards, однако так и не нашел подробного и непредвзятого анализа всех плюсов и минусов с учетом best practices. В итоге я решил написать такую статью сам.
Читать дальше →
Total votes 32: ↑30 and ↓2+28
Comments11

Matrix 1.0 — релиз протокола децентрализованного обмена сообщениями

Reading time2 min
Views12K
11 июня 2019 разработчики Matrix.org Foundation объявили о релизе Matrix 1.0 — протокола для реализации федеративной сети, построенной на основе линейной истории событий (events) внутри ациклического графа (DAG). Самым распространённым способом использования протокола является реализация серверов сообщений (например, сервер Synapse, клиент Riot) и «соединение» других протоколов друг с другом посредством мостов (например, реализация на libpurple с поддержкой XMPP, Telegram, Discord и IRC).



Основным новшеством (и обязательным условием использования) сервера Synapse 1.0 — реализации протокола Matrix 1.0 — является использование TLS сертификата (бесплатный Let's Encrypt тоже подходит) для домена сервера, что обеспечивает защищенную передачу данных между серверами, участвующими в федеративной сети. Поэтому если вы используете self-signed сертификат для своего домашнего сервера — необходимо создать валидный сертификат — иначе ваш сервер перестанет взаимодействовать с другими серверами сети.
Читать дальше →
Total votes 22: ↑22 and ↓0+22
Comments12

Эффективная генерация числа в заданном интервале

Reading time16 min
Views34K
image

В подавляющем большинстве моих постов о генерации случайных чисел рассматривались в основном свойства различных схем генерации. Это может оказаться неожиданным, но производительность алгоритма рандомизации может зависеть не от выбранной схемы генерации, а от других факторов. В этом посте (на который меня вдохновила превосходная статья Дэниела Лемира) мы исследуем основные причины снижения производительности генерации случайных чисел, которые часто перевешивают производительность движка ГПСЧ.

Представьте такую ситуацию:

В качестве домашнего задания Хуан и Саша реализуют одинаковый рандомизированный алгоритм на C++, который будет выполняться на одном университетском компьютере и с одним набором данных. Их код почти идентичен и отличается только в генерации случайных чисел. Хуан торопится на свои занятия по музыке, поэтому просто выбрал вихрь Мерсенна. Саша, с другой стороны, потратил несколько лишних часов на исследования. Саша провёл бенчмарки нескольких самых быстрых ГПСЧ, о которых недавно узнал из соцсетей, и выбрал наиболее быстрый. При встрече Саше не терпелось похвастаться, и он спросил Хуана: «Какой ГПСЧ ты использовал?»

«Лично я просто взял вихрь Мерсенна — он встроен в язык и вроде неплохо работает».

«Ха!», — ответил Саша. «Я использовал jsf32. Он намного быстрее, чем старый и медленный вихрь Мерсенна! Моя программа выполняется за 3 минуты 15 секунд!».

«Хм, неплохо, а моя справляется меньше, чем за минуту», — говорит Хуан и пожимает плечами. «Ну ладно, мне пора на концерт. Пойдёшь со мной?»

«Нет», — отвечает Саша. «Мне… эээ… нужно снова взглянуть на свой код».

Эта неловкая вымышленная ситуация не особо и вымышлена; она основана на реальных результатах. Если ваш рандомизированный алгоритм выполняется не так быстро, как хотелось бы, и узким местом похоже является генерация случайных чисел, то, как это ни странно, проблема может быть и не в генераторе случайных чисел!
Читать дальше →
Total votes 31: ↑31 and ↓0+31
Comments10

Может ли разум подделать Вселенную?

Reading time8 min
Views16K

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


Софи Хебден
FQXi Awardees: Маркус Мюллер 1
18 января 2019 г.


Творение космоса.
Credit: Юрий Акурс, iStock

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

Архитектура сервиса распределённых очередей сообщений в Яндекс.Облаке

Reading time13 min
Views27K
Привет, меня зовут Василий Богонатов. Я один из тех, кто приложил руку и голову и вложил свою душу в сервис распределённых персистентных очередей сообщений Yandex Message Queue. Сервис вышел в общий доступ в конце мая, но внутри Яндекса он уже давно и активно используется в разных продуктах.

Сегодня я хочу рассказать читателям Хабра об очередях сообщений вообще и о Yandex Message Queue в частности. Сначала я хочу объяснить, что такое «распределённая персистентная очередь сообщений» и зачем она нужна. Показать её практическую ценность, механику работы с сообщениями, поговорить про API и удобство использования. Во второй половине материала мы посмотрим на техническую сторону: как в наших очередях используется Yandex Database (это надежный фундамент нашего сервиса), как выглядят наивный и улучшенный подход к построению архитектуры, какие проблемы вызывает распределённость и как их можно решить.


Читать дальше →
Total votes 57: ↑55 and ↓2+53
Comments23

Математика и игра «Сет»

Reading time2 min
Views17K
image

Кто найдет тут «сет», получит от меня шоколадку.

Сет — гениальная игра в которую мы рубились лет 5 назад. Крики, вопли, фотографирование комбинаций.

В правилах игры написано, что ее изобрела в 1991 году генетик Марша Фалко (Marsha Falco), делая пометки во время исследования эпилепсии у немецких овчарок в 1974 году. Для тех, у кого мозг достаточно изможден математикой, через какое-то время возникает подозрение, что есть тут какие-то отголоски с планиметрией и проведением прямых через точки. (Для заданных двух карт существует одна и только одна карта, входящая с ними в один сет.)
Total votes 40: ↑39 and ↓1+38
Comments17

Если вы не пишете программу, не используйте язык программирования

Reading time15 min
Views74K


Лесли Лэмпорт — автор основополагающих работ в распределённых вычислениях, а ещё вы его можете знать по буквам 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 — эта хабрастатья может сэкономить вам час времени на просмотр видео. На этом вступление закончено, мы передаём слово автору.




Когда-то давно Тони Хоар написал: «В каждой большой программе живет маленькая программа, которая пытается выбраться наружу». Я бы это перефразировал так: «В каждой большой программе живет алгоритм, который пытается выбраться наружу». Не знаю, правда, согласится ли с такой интерпретацией Тони.

Читать дальше →
Total votes 55: ↑53 and ↓2+51
Comments31

Как квантовый компьютер может взломать современные системы шифрования и снизить стоимость выработки аммиака?

Reading time11 min
Views22K
Парадоксы и загадки квантовой физики будоражат умы ученых уже давно. Сегодня на основе необычных свойств квантовых частиц строятся новые приборы и устройства, которые могут по своим характеристикам многократно превосходить классические аналоги.



С рассказом о событиях в “Квантовой отрасли” перед сотрудниками Acronis выступил научный руководитель группы «Квантовые информационные технологии» РКЦ Алексей Федоров. В этом посте мы приводим расшифровку его лекции о квантовых технологиях с дополнениями, чтобы поделиться полезными и интересными данными с подписчиками Acronis на Habrahabr.
Читать дальше →
Total votes 26: ↑24 and ↓2+22
Comments26

Внимание! Опасный баг в реализации C++ std::map::merge и std::set::merge в Visual Studio 2017

Reading time2 min
Views14K
Если Вы используете стандарт C++17 в MS Visual Studio 2017 — будьте осторожны: текущая версия содержит критический баг в реализации std::map::merge и std::set::merge. Подробности — под катом.
Читать дальше →
Total votes 41: ↑41 and ↓0+41
Comments34

Декомпозируя UICollectionViewCell

Reading time8 min
Views5.7K

После просмотра 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)

В коллекции это отрисуется следующим образом:

Читать дальше →
Total votes 20: ↑20 and ↓0+20
Comments0
1
23 ...

Information

Rating
Does not participate
Registered
Activity