• Xcode: наверное, лучший способ работы со сторибордами


      Этот пост является вольным переводом статьи Xcode: A Better Way to Deal with Storyboards by Stan Ostrovskiy


      Некоторые примеры кода в оригинальной статье устарели (ввиду выхода Swift 3) и в переводе были изменены.


      Советы и рекомендации по работе с Interface Builder.


      Apple серьезно улучшили Interface Builder в новом Xcode 8. Использование size classes стало более интуитивным, возможность масштабирования сториборда — очень удобной, а полное превью прям в Interface Builder — просто великолепным. Для тех у кого были сомнения насчет использования Interface Builder, это может стать хорошими плюсами.


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


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


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

      В вашем проекте есть один файл main.storyboard, который выглядит вот так?



      С точки зрения дизайнера, все хорошо: полностью видно UI и навигацию. И это именно то, для чего Interface Builder и был создан.

      Но для разработчика это несет множество проблем:

      Читать дальше →
    • Обзор курсов по Deep Learning

        Привет, Хабр! Последнее время все больше и больше достижений в области искусственного интеллекта связано с инструментами глубокого обучения или deep learning. Мы решили разобраться, где же можно научиться необходимым навыкам, чтобы стать специалистом в этой области.

        image
        Читать дальше →
      • Обучение машины — забавная штука: современное распознавание лиц с глубинным обучением

        • Translation
        Вы заметили, что Фейсбук обрёл сверхъестественную способность распознавать ваших друзей на ваших фотографиях? В старые времена Фейсбук отмечал ваших друзей на фотографиях лишь после того, как вы щёлкали соответствующее изображение и вводили через клавиатуру имя вашего друга. Сейчас после вашей загрузки фотографии Фейсбук отмечает любого для вас, что похоже на волшебство:
        Читать дальше →
      • Уведомления в iOS 10

        • Tutorial

        Уведомления в iOS 10


        Говорят, что на этом WWDC не было ничего интересного, кроме интерактивных уведомлений. Действительно, новые уведомления одна из самых интересных новых фич. Не только для разработчиков, но и для простых пользователей. В iOS 10 попытались унифицировать работу с локальными и пуш-уведомлениями и добавили для этого новый фреймворк UserNotifications.framework. Старое API теперь запрещено (deprecated), но его можно использовать до тех пор, пока вы поддерживаете iOS 9.


        Новые уведомления умеют:


        • показывать вложения (картинки и видео)
        • отображать кастомный UI
        • показывать стандартный UI в активном приложении (why so long!11)
        • удалять себя из центра уведомлений (!!1)

        В этой статье разберемся как это работает. Будет интересно не только разработчикам, но и UX проектировщикам.

        Читать дальше →
      • OpenGL ES 2.0. Один миллион частиц

        • Tutorial
        В этой статье мы рассмотрим один из вариантов реализации системы частиц на OpenGL ES 2.0. Подробно поговорим об ограничениях, опишем принципы и разберем небольшой пример.

        image
        Читать дальше →
        • +49
        • 24.3k
        • 8
      • Байесовская нейронная сеть — теперь апельсиновая (часть 2)

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



          Предлагаю, если есть возможность, пойти на кухню, взять апельсин, очистить и проверить. Если лень или нет под рукой — воспользуемся скучной математикой: объем шара мы помним из школы. Пусть, скажем, толщина кожуры равна от радиуса, тогда , ; вычтем одно из другого, поделим объем кожуры на объем апельсина… получается, что кожуры что-то около 16%. Не так уж мало, кстати.

          Как насчет апельсина в тысячемерном пространстве?

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

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

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

          Начнем с этого, пожалуй.

          Читать дальше →
        • Сказ царя Салтана о потенциале лапласиана

            «Три девицы под окном пряли поздно вечерком.»

            image

            Ну как пряли. Не пряли, конечно, а лайкали друг на друга. По условиям конкурса «мисс Салтан» девицы должны были выбрать меж собой лучшую.

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

            Вскоре «в светлицу вошел царь — стороны той государь» (показан на рисунке). «Во все время разговора...», — ну понятно в общем.
            «Собираем лайки нежности — формируем матрицу смежности», — бодро срифмовал он.
            Девицы-красавицы с именами Алена, Варвара и Софья засмущались, но лайки (из балалайки) передали.

            Вот что там было:
            • Алена получила 1 лайк от Софьи и 2 лайка от Варвары.
            • Варвара получила по лайку от Алены и Софьи.
            • А Софья получила 2 лайка от Алены и 1 от Варвары.

            Царь взял лайки, покрутил гайки, постучал по колесам, пошмыгал носом, причмокнул губами, поскрипел зубами, сгонял в палаты и объявил результаты.

            Наибольший вес лайков (7 баллов) получила Софья, но титул «мисс Салтан» достался Алене (15 баллов).

            Подробнее о матрице лайков
            Для матрицы


            вектор потенциалов равен (5, 4, 7), а вектор потоков — (15, 12, 14).

            После объявления результатов девицы бросились обратились к царю с просьбой рассказать,- откуда взялись эти странные цифры?
            Действительно - откуда?
          • Введение в Firebase: пишем простое социальное приложение на Swift

            В связи с неожиданным решением Facebook закрыть Parse, многое разработчики задались вопросом, что использовать вместо него. Сегодня практически невозможно представить полностью автономное приложение, которое было бы полезное всем. В связи с этим, iOS разработчики в своей работе пользуются инструментами и ресурсами, предоставленные Apple для доступа к данным. Backend-as-a-service, или сокращенно BaaS является потрясающим инструментом для разработчиков.

            Среди наилучших и наиболее популярных BaaSs можно выделить Firebase от компании Google. По существу, Firebase является безусловно потрясающим в исполнении, реализации и эксплуатации. Firebase служит базой данных, которая изменяется в реальном времени и хранит данные в JSON. Любые изменения в базе данных тут же синхронизируются между всеми клиентами, или девайсами, которые используют одну и ту же базу данных. Другими словами, обновление в Firebase происходят мгновенно.

            Вместе с хранилищем, Firebase также предоставляет пользовательскую аутентификацию, и поэтому все данные передаются через защищенное соединение SSL. Мы можем выбрать любую комбинацию email и пароля для аутентификации, будь то Facebook, Twitter, GitHub, Google, или что-то другое.

            В добавку к iOS SDK, у Firebase есть SDK для Android и JavaScript. Все платформы могут использовать одну базу данных.
            Сложно представить что Firebase со всеми этими функциями бюджетное решение.

            На момент написания этой статьи, в бесплатном пакете Firebase может обрабатывать до 100 одновременных соединений. Этого вполне достаточно для работы популярного приложения. За $49 в месяц ограничений на сетевую активность нет.
            Читать дальше →
            • +14
            • 139k
            • 5
          • Как я писал гитарный тюнер под iOs на Swift. А так же немного о ЦОС, стоячих волнах и как добиться точности в ±0,1Гц

              В этой статье я расскажу о том как у меня возникла идея написать свой тюнер и к чему это привело. А так же поделюсь своими скромными знаниями в области ЦОС (цифровой обработки сигналов) полученными в ВУЗе, и как они помогли мне решить некоторые проблемы. И конечно, поделюсь исходным кодом и опытом программирования на Swift который получил при реализации этого проекта.
              Читать дальше →
            • Генерация и решение лабиринта с помощью метода поиска в глубину по графу

              image

              В этой статье речь пойдет о самом простом в реализации алгоритме генерации «идеального» лабиринта и его применении для поиска пути.

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

              Заинтересовавшихся — прошу под кат.
              Читать дальше →
            • Сборка Кубика Рубика генетическим алгоритмом online без смс



                В то время пока я собирался на ланч, мой ко-воркер Дейв окликнул меня: «Хэй, Алекс, а ты не хочешь заниматься улучшениями навыков своего программирования?». Я задумался. Это было интересное предложение, но я склонялся ответить отказом: «Сейчас я занимаюсь развитем навыков говорения на языках, дружище!». Ладно, шучу. Утро началось с того, что я добрался до почты и заполучил в руки копеечный китайский Кубик, случайно заказанный на али. К обеду я проштудировал мануал сборки и обновил мышечную память, а к вечеру пришло осознание, что я наигрался. Будущее кубика было ясным: он будет пылиться на полке, раз или два в неделю может быть я буду его собирать, чтобы привести мысли в порядок или отвлечься, но не более того. Соревнование в механической скорости сборки? Non merci, уж лучше скворечники делать…

                Ситуацию, как всегда, спасли мысли об автоматизации. После недолгого изучения я узнал рекогнисцировку. Для начала, число Бога уже давно найдено и равно 20. Правда задача сборки от этого не упрощается, т.к. использовать граф кратчайших путей для всех возможных конфигураций кубика не очень спортивно и немножко накладно по ресурсам. Алгоритм Бога предполагает под собой некое разумное количество использованной памяти, и в то же время обязан обеспечить минимально возможное число модификаций. Так вот, такого алгоритма еще нет. Есть ряд алгоритмов, позволяющих заметно ускорить сборку по сравнению с традиционными шаблонными методоми, но повторять кем-то уже проложенный (математически) путь мне показалось скучным. Если кому интересно, вот хороший анализ Далее есть традиционные шаблонные методы. Идея здесь в послойной сборке снизу вверх с использованием формул. Формула — последовательность модификаций Кубика, приводящая к таким-то целевым модификациям, и таким-то побочным. Соответственно, побочные модификации почти всегда падают на еще не собранные слои. Различаются шаблонные методы уровнем детализации шаблонов. Всякого рода спидкуберы знают все мыслимые шаблоны для большого количества частных случаев, что позволяет отыграть лишнюю 0.1 секунду с каждой модификации на соревнованиях. Пример, на что еще можно потратить жизнь.

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

                Что мы знаем о Кубике? Число его состояний описывается как
                (8! × 3^7) × (12! × 2^11)/2 = 43 252 003 274 489 856 000
                .
                Читать дальше →
              • Смарт-карты. Часть 4. JavaCard

                  Привет, Гиктаймс!

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

                  Итак, смарт-карта на основе JavaCard — это карта, на которой приложения исполняются на JavaCard Virtual Machine (ограниченная версия Java Virtual Machine, адаптированная для смарт-карт) в так называемом JavaCard Runtime Environment (который с Java Runtime Environment имеет очень мало общего).

                  Что касается терминологии, то приложения называются Applets и содержатся в Packages (пакетах). Пакеты распространяются в CAP-files (вместо Jar-files). Пакеты и приложения имеют собственный AID (Application Identifier). Это необходимо для того, чтобы их можно было однозначно идентифицировать в таких командах, как: SELECT, INSTALL, DELETE, и т.д. (SELECT описывается в ISO7816-4, а JavaCard и остальные команды — в Global Platform).

                  Жизненный цикл Applets несколько отличается от привычного жизненного цикла приложений для компьютеров. Applet — это любой класс, наследующий от базового класса «Applet». При установке приложений вызывается его статический метод install. Этот метод должен создать объект соответствующего класса и вызвать на него метод register. Впоследствии объект будет сохранен в системе и получит собственный AID, который будет использован для дальнейшего общения с приложением. Объект и его поля данных сохраняются в NVM (Non-Volatile Memory). Каждый объект или массив, созданный приложением с помощью оператора «new», также будет находиться в NVM. Это означает, что, в отличие от традиционных компьютерных программ, состояние приложений JavaCard является постоянным и не теряется даже при выключении карты.
                  Читать дальше →
                • Майним Bitcoin с помощью бумаги и ручки

                  • Translation
                  В один прекрасный момент мне захотелось прикинуть, насколько быстро можно майнить биткойны вручную. Оказалось, что для майнинга используется хеширование SHA-256, а оно достаточно простое и может быть вычислено даже без компьютера. Само собой, процесс очень небыстрый и совершенно непрактичный. Но, пройдя все шаги на бумажке, можно хорошо разобраться в деталях работы алгоритма.


                  Один криптографический раунд
                  Читать дальше →
                • Система оплаты проезда общественного транспорта Москвы

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

                  RFID
                  Конечно же я начал с поиска в гугле и без особых усилий нашёл название данной — RFID (Radio Frequency IDentification) или в переводе на русский Радиочастотная Идентификация. Прочитав статью на википедии, я понял что метки (карты) делятся на 3 диапазона работы, Метки диапазона LF (125—134 кГц), Метки диапазона HF (13,56 МГц), Метки диапазона UHF (860—960 МГц). В общественном транспорте используются метки второго диапазона — HF.
                  Читать дальше →
                • Записки iOS программиста о его молотках, кувалдах и микрометрах

                    В один прекрасный момент, когда на собеседованиях меня уже убеждали, что я senior iOS developer — у меня возникло ощущение, что я уперся. Пишу похожий код, решаю задачи похожими способами и ощущение, что непонятно, куда развиваться дальше. Я думаю, с этой проблемой сталкивался не один я — нехваткой новых идей, концепций, направлений. Я бы хотел рассказать вам о тех инструментах и фреймворках, которые помогли преодолеть мне это ощущение.

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


                    Читать дальше →
                  • 300 потрясающих бесплатных сервисов

                    • Translation


                    Автор оригинальной статьи Ali Mese добавил ещё 100 новых бесплатных сервисов. Все 400 потрясающих сервисов доступны здесь. И еще подборку +500 инструментов от 10 марта 2017 г. смотрите здесь.



                    A. Бесплатные Веб-Сайты + Логотипы + Хостинг + Выставление Счета

                    • HTML5 UP: Адаптивные шаблоны HTML5 и CSS3.
                    • Bootswatch: Бесплатные темы для Bootstrap.
                    • Templated: Коллекция 845 бесплатных шаблонов CSS и HTML5.
                    • Wordpress.org | Wordpress.com: Бесплатное создание веб-сайта.
                    • Strikingly.com Domain: Конструктор веб-сайтов.
                    • Logaster: Онлайн генератор логотипов и элементов фирменного стиля (new).
                    • Withoomph: Мгновенное создание логотипов (англ.).
                    • Hipster Logo Generator: Генератор хипстерских логотипов.
                    • Squarespace Free Logo: Можно скачать бесплатную версию в маленьком разрешении.
                    • Invoice to me: Бесплатный генератор счета.
                    • Free Invoice Generator: Альтернативный бесплатный генератор счета.
                    • Slimvoice: Невероятно простой счет.

                    Читать дальше →
                  • ПО для взаимодействия ПК и смартфона

                      С момента покупки смарта на Android меня заинтересовало его функциональное наполнение. На практике оказалось, что Android способен выполнять практически любую задачу, решаемую на обычном ПK, только медленнее и не всегда удобнее. Зато дополняет ПК он прекрасно, и механизмов использования возможностей смарта на ПК и возможностей ПК на смарте — уйма.

                      Статья ориентирована в основном на формирующихся и будущих пользователей Android-смартфонов; надеюсь, что продвинутые пользователи также найдут в ней что-то новое и/или внесут свою лепту. Под катом по пунктам, в вопрос-ответном стиле.
                      Читать дальше →
                    • Профессиональная эмиграция — Часть 1 — Проблема курицы и яйца и как с ней бороться, а также развенчание мифов

                      Здравствуйте, Хабраюзеры.

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



                      Доброго времени, дорогие Хабровчане!

                      В этой статье я расскажу о том, как реализовать оффлайн карты.

                      Дисклеймер. Статья не является пиаром чего-либо. Данный вариант реализации был выбран мною как самый оптимальный и я бы хотел поведать о нем в доступной форме.
                      Спасибо!

                      Предыстория


                      При разработке гид приложения для Гонконга, возникла нужда в использовании оффлайн карт. Google карты, к сожалению, не предоставляют такой возможности, так что, из за безысходности пришлось использовать такой сервис как MapBox, точнее расширение для iOS — MapBox-ios-sdk.

                      Заинтересовавшихся прошу под кат.
                      Читать дальше →
                      • +27
                      • 17.5k
                      • 7
                    • Auto Layout и UIScrollView. Как его готовить?


                      В iOS 6 Apple представили замечательную возможность для вёрстки UI для iOS-приложений — Auto Layout. Но вот что удивительно, до сих пор очень немногие проекты используют эту возможность. А ведь это очень сильный инструмент, если с умом подойти к вёрстке UI, можно сэкономить очень много времени на подстраивании элементов для 3,5” и 4” экранов, портретно-ландшафтном расположении экрана и даже на универсальной вёрстке для iPhone и iPad.

                      И это всё не считая того, что скоро представят iPhone 6 и никто до сих пор точно не знает, какое там будет разрешение и какой экран. Лучше бы заранее подстраховаться.

                      В основном, тема Auto Layout довольно простая, и изучить её несложно. Но лично я столкнулся с большой проблемой при расположении элементов в UIScrollView. Я потратил немало времени и нервов на изучение того, как же правильно расположить элементы и указать размер контента для того чтобы ScrollView начал пролистываться.

                      Хоть и решение довольно простое, но на него не так просто выйти. В данной статье я бы хотел рассказать, как же всё-таки правильно готовить UIScrollView в Auto Layout.

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