• История одного Crash-а, и NSLog'а его лечившего

      Лечу Crash'и NSLog'ами. Недорого. Многолетний опыт. 100% гарантия.

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

      Все началось с того, что на одном из относительно больших проектов начало стабильно вываливаться исключение при авторизации пользователя. «Ну и что тут такого? У всех бывает. Проверку на nil забыли поставить или где-то накосячили. „Тоже, мне, большое событие — crash на проекте“, — подумает большая часть программистов. В принципе — абсолютно согласен. Crash — не такое уж и редкое явление в программировании под iPhone, и с ним сталкиваешься по десять раз на день. Но этот был особенным. От него уже начало попахивать „магией“, когда мне сказали про его некоторые параметры и особенности:

      • Воспроизводимость на симуляторе: 100%
      • Воспроизводимость на устройстве: 0%
      • Путь к крэшу (после локализации крэша): ~ 40 секунд
      • Настройки оптимизации при компиляции (-O1,-O2...) не влияют на воспроизводимость
      • XIB'ы в проекте не используются


      Да выглядел он довольно безобидно:

      // Code
      UITextView * textView = [ [UITextView alloc] initWithFrame:CGRectMake(0, 150, _width, _height)];
      
      // Exception
      *** Terminating app due to uncaught exception 'CALayerInvalidGeometry', 
          reason: 'CALayer bounds contains NaN: [0 0; nan 200]'


      »Ну тут же и ежу понятно, что width — после вычисления — NaN!", — подумал я. Бегло поглядев где и как вычисляется ширина вьюхи, и не найдя ничего особого опасного, я, для утверждения своей догадки, поставил перед созданием вьюхи NSLog. А вдобавок, и точку останова на строке с созданием элемента.
      // Source:
      NSLog(@"width = %f", _width);
      
      //Output:
      width = 200
      


      «Гм», — подумал про себя я, и продолжил выполнение программы после точки останова. И крэша не произошло…

      Что было дальше? Читайте во второй части сразу под катом...
    • Как вы выбираете продукты в магазине?

        image
        Самая главная формула успеха — знание, как обращаться с людьми. Теодор Рузвельт


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


        Вы когда-нибудь задумывались о том, почему вы покупаете определенные продукты в магазинах, как выбираете среди множества аналогов? Скорее всего, четкого ответа под все возможные походы в магазин дать не получится, многие из них спонтанны. Но общая идея очевидна – при походе в магазин вы пытаетесь закрыть имеющуюся потребность (в еде, гаджетах, развлечениях, блэкджеке). В данной статье на примере продуктовых ритейлеров расскажу об имеющемся опыте, как используя некоторые базовые логические предположения и анализ сообществ в графах, можно определить, как именно покупатели выбирают товар.

        Читать дальше →
      • Проблемные личности среди разработчиков

        • Translation


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

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

        Но с такими возможностями часто приходит полное отсутствие уважения к участникам проекта других профессий. Это отсутствие уважения может оказаться настолько глубоким, что порождает в уме разработчика твёрдую уверенность, что он не только самый ценный участник программного проекта, но и необходим компании в целом. К сожалению, хотя лишь малое число разработчиков способны накапливать что-либо напоминающее богатство, многие ведут себя так, словно они следующие Марк Цукерберг, Билл Гейтс или Стив Джобс; хотя это очень далеко от истины. Это приводит к личностным проблемам, которые так же увлекательно наблюдать со стороны, как страшно созерцать в себе.
        Читать дальше →
      • Как писать на Objective-C в 2018 году. Часть 1

          Большинство iOS-проектов частично или полностью переходят на Swift. Swift — замечательный язык, и за ним будущее разработки под iOS. Но язык нераздельно связан с инструментарием, а в инструментарии Swift есть недостатки.


          В компиляторе Swift по-прежнему находятся баги, которые приводят к его падению или генерации неправильного кода. У Swift нет стабильного ABI. И, что очень важно, проекты на Swift собираются слишком долго.


          В связи с этим существующим проектам может быть выгоднее продолжать разработку на Objective-C. А Objective-C уже не тот, что был раньше!


          В этом цикле статей мы покажем полезные возможности и улучшения Objective-C, с которыми писать код становится намного приятнее. Каждый, кто пишет на Objective-C, найдет для себя что-нибудь интересное.


          Читать дальше →
        • Как оптимизировать энергопотребление в iOS

          • Tutorial

          image


          Пользователи устройств под управлением iOS часто жалуются, что аккумулятор быстро разряжается. Когда это происходит? Чаще всего при использовании GPS, но есть и другие причины ускоренного разряда батареи. Например, насыщенный обмен через разные виды приемопередатчиков (сотовая связь, bluetooth) или интенсивная отрисовка графики. Некоторые любители яблочных девайсов грешат на батарею, но часто в быстрой разрядке виноваты разработчики приложений. Пользователям важно, чтобы заряда хватало надолго, поэтому при разработке стоит избегать решений, которые повышают энергопотребление. Но зачем разработчикам вообще думать о том, как долго телефон держит заряд? Чем дольше iPhone включен, тем больше шанс, что пользователь откроет приложение и будет им пользоваться.


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

          Читать дальше →
          • +13
          • 6.3k
          • 6
        • Как стать GPU-инженером за час

            Нужно ли iOS-разработчику, не занимающемуся играми, уметь работать с GPU? Нужно ли ему вообще знать о том, что в айфоне есть GPU? Многие успешно работают в iOS-разработке, никогда не задумываясь об этой теме. Но GPU может быть полезен как для 3D-графики, так и для других задач, в ряде случаев оставляя CPU позади.

            Когда на конференции Mobius 2017 Moscow Андрей Володин (Prisma AI) рассказал об использовании GPU в iOS, его доклад стал одним из фаворитов конференции, получив высокие оценки зрителей. А теперь на основе этого доклада мы подготовили хабрапост, позволяющий получить всю ту же информацию текстом. Интересно будет даже тем, кто не работает с iOS: доклад начинается с вещей, не привязанных конкретно к этой платформе.
            Осторожно, трафик: под катом очень много изображений со слайдов.

            Читать дальше →
          • Сила воли: как устроена и как ею управлять?



              Мы бы поленились сделать этот выпуск, если бы не такая наболевшая тема. Представьте, сколько можно достичь, если сделать хотя бы половину из того, что мы откладываем из-за лени. Но правда ли, что достаточно просто побороть себя? А что если сила воли работает совсем не так, как мы привыкли думать? Не поленитесь, посмотрите об этом наш выпуск про силу воли с Ириной Якутенко и вы получите ответы. Если вам очень лень смотреть видео, то почитайте под катом расшифровку этого видео, максимально адаптированную для чтения.
              Читать дальше →
            • Swift и TensorFlow

                Я не люблю читать статьи, сразу иду на GitHub

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


                Рассказывать о том, что такое машинное обучение и искусственный интеллект, в 2017 году наверное нет необходимости. На эту тему уже написано большое количество как публицистических статей, так и серьезных научных работ. Поэтому предполагается, что читатель уже знает, что это такое. Говоря о машинном обучении, сообщество data scientist и software engineers, как правило подразумевает глубокие нейронные сети, которые приобрели большую популярность по причине своей производительности. На сегодняшний день в мире существует большое количество различных программных решений и комплексов для решения задачи искусственных нейронных сетей: Caffe, TensorFlow, Torch, Theano(rip), cuDNN etc.

                Swift


                Swift — инновационный, protocol — oriented, open source язык программирования, выращенный в стенах компании Apple Крисом Латнером (недавно покинувшим компанию Apple, после SpaceX и обосновавшимся в Google).
                В Apple’s OSs уже были различные библиотеки для работы с матрицами и векторной алгеброй: BLAS, BNNS, DSP, впоследствии объединенные под крышей одной библиотеки Accelerate.
                В 2015 появились небольшие решения для реализации математики на основе графической технологии Metal.
                В 2016 появился CoreML:
                image
                CoreML способен импортировать готовую, натренированную модель (CaffeV1, Keras, scikit-learn) и далее предоставить разработчику возможность экспортировать ее в приложение.
                То есть, вам необходимо: Собрать модель на другой платформе, на языке Python или C++, используя сторонние фреймворки. Далее обучить ее на стороннем аппаратном решении.
                И только после этого вы можете импортировать и работать на языке Swift. На мой взгляд очень нагромождено и сложно.
                Читать дальше →
                • +10
                • 10.2k
                • 7
              • Физики высказали новый аргумент, почему Вселенная не может быть компьютерной симуляцией: гравитационные аномалии


                  Художественное представление искажения пространства-времени в кристалле

                  Каков шанс, что наша Вселенная представляет собой результат компьютерной симуляции? Эта идея давно обсуждается учёными и специалистами, и они расходятся во мнениях. Ясно, что наши далёкие потомки будут обладать практически неограниченными вычислительными ресурсами и смогут создавать виртуальные миры, подобные нашему. Учитывая большое количество таких миров, остаются небольшие шансы, что именно нам повезло жить в реальном мире, а не в симуляции. Например, Илон Маск оценивает наши шансы в 0,1%, а астрофизик Нил Деграсс Тайсон — в 50%. В общем, вопрос спорный.

                  Сейчас двое теоретических физиков из Израиля и России выдвинули новый аргумент в пользу того, что наш мир не может быть компьютерной симуляцией. Некоторые свойства пространства-времени слишком сложно рассчитать на компьютере любой производительности.
                  Читать дальше →
                • Blockchain

                    Данный текст будет являться новой главой для учебного пособия по защите информации кафедры радиотехники и систем управления МФТИ (ГУ). Полностью учебник доступен на github. На хабре я же планирую выкладывать новые «большие» куски, во-первых, чтобы собрать полезные комментарии и замечания, во-вторых, дать сообществу больше обзорного материала по полезным и интересным темам.

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

                    Технология blockchain используется для организации журналов транзакций, при этом под транзакцией может пониматься что угодно: финансовая транзакция (перевод между счетами), аудит событий аутентификации и авторизации, записи о выполненных ТО и ТУ автомобилей. При этом событие считается случившимся, если запись о нём включена в журнал.

                    В таких системах есть три группы действующих лиц:

                    • источники событий (транзакций)
                    • источники блоков (фиксаторы транзакций)
                    • получатели (читатели) блоков и зафиксированных транзакций.

                    В зависимости от реализации эти группы могут пересекаться. В системах типа BitCoin, например, все участники распределённой системы могут выполнять все три функции. Хотя за создание блоков (фиксацию транзакций) обычно отвечают выделенные вычислительные мощности, а управляющими их участников называют майнерами (см. раздел про децентрализованный blockchain далее).

                    Основное требование к таким журналам таково:

                    • Невозможность модификации журнала: после добавления транзакции в журнал должно быть невозможно её оттуда удалить или изменить.
                    Читать дальше →
                  • Идиомы С++. Static visitor

                      Паттерн Visitor предлагает еще один способ отделить алгоритм обработки данных от самих данных. В этой статье я кратко опишу идею, стоящую за оригинальным паттерном, его С++ специфическую вариацию и приведу несколько простых примеров использования.
                      Читать дальше →
                    • Шаблоны проектирования в автоматном программировании


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

                        В статье рассматриваются особенности применения шаблонов Visitor/Double Dispatch и State при реализации системы на основе конечного автомата. Кроме того, статью можно рассматривать как продолжение цикла публикаций о шаблонах проектирования на Хабрахабре.

                        Читать дальше →
                      • Deep Learning, теперь и в OpenCV



                          Данная статья является кратким обзором возможностей dnn — модуля OpenCV, предназначенного для работы с нейросетями. Если вам интересно, что это такое, что оно умеет и как быстро работает, добро пожаловать под кат.
                          Читать дальше →
                        • Постквантовая криптография и закат RSA — реальная угроза или мнимое будущее?

                            RSA, эллиптические кривые, квантовый компьютер, изогении… На первый взгляд, эти слова напоминают какие-то заклинания, но все куда проще сложнее, чем кажется!

                            Необходимость перехода к криптографии, устойчивой к атаке на квантовом компьютере, уже официально анонсирована NIST и NSA, из чего вывод довольно-таки простой: пора вылезать из зоны комфорта!

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

                            Чтобы разобраться в тонкостях криптографии на эллиптических кривых, проследить новомодные веяния постквантовой криптографии и даже прикоснуться к ней с помощью библиотеки Microsoft SIDH, добро пожаловать под кат, %username%!
                            Читать дальше →
                          • Повесть о настоящем Интернете

                            • Tutorial
                            Abstract: Рассказ про устройство Интернета, как «сети сетей» в виде текста для чтения, без двоичной системы счисления и нюансов BGP. Большая часть расказа будет не про процесс общения ноутбука с точкой доступа, а о том, что происходит после того, как данные пройдут «шлюз по умолчанию». Предупреждаю, букв много.

                            Вступление


                            Маленький провокативный вброс: ни один из читателей этой статьи к Интернету не подключен. Все подключены к сети своего провайдера, и не более. Подключение к Интернету дорогое, его сложно делать, вам потребуется очень крутое оборудование, несколько договоров с несколькими операторами связи и квалифицированные сотрудники. Простому домашнему пользователю это никак и никогда не светит. Не говоря уже о том, что в Интернете может быть не больше 4 миллиардов подключившихся (а до недавнего времени было даже «не более 65536») [1]. Даже если весь Интернет перейдёт на ipv6, это число не поменяется.

                            Вот число подключившихся к Интернету [2]:

                            По оси Y — число в штуках. Штуках, штуках. И вас в этом числе не посчитали.

                            Почему?

                            Дело в том, что Internet — это, если переводить буквально, «межсетье». Сеть Сетей. И участниками Интернета являются не пользователи (их компьютеры, планшеты, микроволновки с wifi и т.д.), а сети. Сети и только сети участвуют в работе Интернета. Интернет — это то, что связывает разные сети между друг другом.
                            Читать дальше →
                          • Как компьютерные профи раскалывают хакеров



                              В последнее время, на фоне всевозможных вирусов Wanna Cry и Petya, тема кибербезопасности не сходит с первых полос СМИ. В этой связи показалась примечательной заметка найденная на одном из заморских сайтов. Под катом рассказ Роджера Краймса о том, как одни профессионалы доставляют неприятности другим и наоборот. Суть статьи сводится к тому, что если хотите познакомиться с действительно толковым хакером, поговорите со специалистом по защите от кибератак. Эти талантливые люди каждый день работают над тем, чтобы совершать киберпреступления становилось труднее и наименее прибыльно. Кстати, с удивлением узнал, что любимое развлечение специалистов по информационной безопасности, «ломать» компы соседей на профессиональных конференциях.
                              Читать дальше →
                            • Как PVS-Studio может помочь в поиске уязвимостей?


                                Уязвимость в терминах компьютерной безопасности — недостаток в системе, позволяющий намеренно нарушить её целостность или вызвать неправильную работу. Как показывает практика, даже, казалось бы, незначительный баг может являться серьёзной уязвимостью. Уязвимостей можно избежать, используя различные методики валидации и верификации программного обеспечения, в том числе — статический анализ. О том, как с задачей поиска уязвимостей справляется PVS-Studio, и пойдёт речь.
                                Читать дальше →
                                • +27
                                • 6.1k
                                • 6
                              • Потенциально опасные алгоритмы


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


                                  Без высшей математики мы бы лишились алгоритма Шора для факторизации целых чисел в квантовых компьютерах, калибровочной теории Янга-Миллса для построения Стандартной модели в физике элементарных частиц, интегрального преобразования Радона для медицинской и геофизической томографии, моделей эпидемиологии, анализов рисков в страховании, моделей стохастического ценообразования финансовых производных, шифрования RSA, дифференциальных уравнений Навье-Стокса для прогнозирования изменений движения жидкостей и всего климата, всех инженерных разработок от теории автоматического управления до методов нахождения оптимальных решений и еще миллиона других вещей, о которых даже не задумываемся.


                                  Математика стоит в основе цивилизации. Тем интереснее узнать, что с самого зарождения этого краеугольного камня в нем содержатся ошибки. Иногда ошибки математики остаются незаметными тысячелетия; порой они возникают спонтанно и быстро распространяются, проникая в наш код. Опечатка в уравнении ведет к катастрофе, но и само уравнение может быть потенциально опасно.


                                  Мы воспринимаем ошибки как нечто чуждое, но что если вокруг них и строится наша жизнь?

                                  Читать дальше →
                                • Открытый курс машинного обучения. Тема 1. Первичный анализ данных с Pandas



                                    Курс состоит из:


                                    • 10 статей на Хабре (и то же самое на Медиуме на англ.)
                                    • 10 лекций (Youtube-канал на русском + более свежие лекции на англ.), подробное описание каждой темы – в этой статье
                                    • воспроизводимых материалов (Jupyter notebooks) в репозитории mlcourse.ai и в виде Kaggle Dataset (нужен только браузер)
                                    • отличных соревнований Kaggle Inclass (не на "стаканье xgboost-ов", а на построение признаков)
                                    • домашних заданий по каждой теме (в репозитории — список демо-версий заданий)
                                    • мотивирующего рейтинга, обилия живого общения и быстрой обратной связи от авторов

                                    Текущий запуск курса – с 1 октября 2018 года на английском языке (ссылка на опрос для участия, заполняйте на английском). Следите за объявлениями в группе ВК, вступайте в сообщество OpenDataScience.

                                    Читать дальше →
                                  • Читаем бинарные файлы iOS-приложений

                                    • Tutorial

                                    На хабре есть много статей о том, как работает рантайм Swift/Objective-C, но для еще более полного понимания того, что происходит под капотом, полезно залезть на самый низкий уровень и посмотреть, как код iOS приложений укладывается в бинарные файлы. Кроме того, безусловно, под капот приходится залезать при решении реверс-инжиниринговых задач. В этой статье мы обсудим самые простые конструкции Objective-C, а о Swift и более сложных примерах поговорим в последующих статьях.


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




                                    Читать дальше →