Результати пошуку за запитом: начальный курс c
Як не здатися і все ж таки стати програмістом?
Автор: Дмитро Хорошилов
Вы день и ночь в поте лица изучаете синтаксис, фреймворки, решаете задачи, посещаете курсы, смотрите видеоуроки, читаете книги, но все никак не можете сдвинуться с мертвой точки — наконец-то начать программировать самостоятельно или найти первую работу.
Вы раз за разом открывает IDE, чтобы начать писать код, но потом откладываете это занятие. Потому что в данный момент вам меньше всего хочется писать код. И вы по пятому кругу читаете посты на фейсбуке, смотрите видео с котиками и глупые гифки. Вам начинает казаться, что изучать программирование - это не ваше.
Вы в очередной раз открываете важную и сложную книгу по программированию, но, как бы вы не пытались сосредоточиться, информация не откладывается в памяти. Более того, постоянно приходится по несколько раз перечитывать предложение за предложением, чтобы хоть немного понять, о чем речь.
Знакомо? Иногда, особенно в процессе изучения чего-то нового и сложного, ваш мозг начинает играть с вами в каверзные игры. Он всеми силами пытается сопротивляться обучению, вгоняя вас в состояние прокрастинации и ступора. Самым неверным в сложившейся ситуации будет сдаться и отдаться во власть отчаяния. В этом материале мы поговорим с вами, как справиться с прокрастинацией, как заставить мозг учиться и как в конечном итоге получить желаемую работу, влиться в среду профессиональных разработчиков.
Что такое прокрастинация?
На самом деле, прокрастинация — это привычка. Вы шаблонно реагируете на какой-то раздражитель, когда вам следует заниматься тем, чем вы не хотите. Как следствие, вы пытаетесь отложить «нелюбимое» дело в долгий ящик и придумываете какие угодно дела взамен, лишь бы не делать что-то важное. Но то, что приносит удовольствие на короткое время, не всегда полезно в долгосрочной перспективе. Благо, с прокрастинацией можно бороться, как и с любой другой плохой привычкой.
Как бороться с прокрастинацией?
Вот несколько советов, что стоит делать и на что необходимо обращаться внимание:
- Не тратьте силу воли на борьбу с прокрастинацией. Потому что это настолько же безрезультатно, как и бороться с пятиголовым драконом без специального оружия. Вы будете отрезать голову и усилием воли заставлять себя учиться, то есть тратить много сил, а голова будет опять вырастать. В итоге, вы в какой-то момент просто бросите эту затею и уйдете с поля битвы.
- Не оставляйте все на последнюю минуту. Представьте спортстмена, который начинает тренироваться за два дня до забега. Как думаете, как он будет себя чувствовать и в каком состоянии будут его мышцы, если он будет заниматься два дня по 10 часов каждый, вместо 2-х месяцев по часу? Как думаете, после такого у него будут шансы пробежать марафон? Очевидно, что нет. Как и с мышцами, мозг необходимо тренировать постепенно, понемногу, но постоянно. Лучше учитесь по 20 минут, но на протяжении 10 дней, чем по 10 часов, но на протяжении двух дней.
- Делайте перерывы во время учебы. Да, позволяйте себе отдыхать и хорошо высыпаться. Не зубрите дни и ночи на пролет. Подолгу сидя над учебой, вы не усвоите больше. Благодаря небольшим передышкам, наш мозг получает возможность «переварить» полученную информацию.
- Не откладывайте на потом. Чем на дольше откладываем, тем больше всего нам надо изучить. А значит, тем страшнее и больнее нам этим заняться. Парадоксально, но факт, чем лучше вы овладеваете каким-то навыком, тем больше вам нравится им заниматься.
- «Коллективная мудрость». Не бойтесь обращаться за советом к коллегам, другим студентам. Если вы занимаетесь в одиночку, найдите обязательно себе ментора, к которому сможете обращаться за советом в моменты ступора. Если у вас нет возможности найти наставника, сходите на курсы. Старайтесь больше задавать вопросов, даже если они вам кажутся чрезвычайно глупыми.
- Ориентируйтесь на процесс, а не на результат. Очень часто мы зацикливаемся на результате. И если он не достигнут, нас посещают мысли, отзывающиеся болью в мозгу, провоцируя нас прокрастинировать. Например, мы думаем: чтобы найти свою первую работу, так много еще надо всего выучить. Отпустите эти мысли, лучше сосредоточьтесь на процессе: я учу, я пишу, я делаю. И вы не заметите, как в скором времени скажете: я работаю.
В этой части мы поговорили с вами о том, как лучше учиться, как бороться с ужасной и неукротимой прокрастинацией.
Когда прокрастинация побеждена
Теперь я бы хотел дать несколько рекомендаций о том, что делать, когда вы победите своего змея.
Как только вы научитесь держать себя под контролем, ваши дела заметно пойдут вверх. Вы будете все больше получать удовольствия от процесса получения и практического применения новых знаний. В какой-то момент вам покажется, что вы готовы начать работать. Чтобы опять не попасться в капкан прокрастинации, поставьте себе цель и придумайте мотивацию.
Например, цель: я найду первую работу за 3 месяца.
Обязательно спланируйте, какие шаги вы будете предпринимать для того, чтобы найти работу:
- напишу хорошее резюме на двух языках,
- буду отслеживать вакансии и реагировать на них,
- составлю список компаний, которые подходят мне по профилю — разошлю им резюме с мотивационным письмом,
- начну готовиться к собеседованиям: подтягивать теоретические знания, подготовлю свое первое программистское «портфолио».
А вот мотивация — это очень индивидуально, но обязательно важно. Найдите что-то свое: деньги, отдых, друзья, любимые, покупки и т.д.
Надеюсь, теперь, когда вы знаете, что такое прокрастинация и как с ней бороться, вам станет намного проще двигаться по намеченному вами пути и не сбиваться с него. Главное, помните, что отдых тоже полезен. Борясь со своими чертиками, не забывайте хорошо высыпаться (это самое главное условие для хорошего усваивания знаний), отвлекаться, например, заниматься спортом, хорошо и вкусно питаться. Я уверен, что следуя этим полезным советам, вы очень скоро добьетесь успеха!
Введення в розробку програм під iOS. Частина 0.
Автор: Volodymyr Bozhek
Здравствуйте, дорогие читатели. Меня зовут Владимир.
Любая технология рано или поздно приедается и рост себя как специалиста затрудняется. Было принято решение что то кардинально поменять в своей жизни. А так как писать различные интересные проекты я просто обожаю, было принято решение начать изучение в корне другой платформы, среды разработки и языка программирования. Поиск этой платформы оказался достаточно прост для меня. Я решил, что это будет мобильная платформа.
У меня было много разных телефонов с разными операционными системами. Но свой выбор я сделал в пользу iOS, так как при железе слабее, чем у других телефонов, софт работает намного быстрее, чем на других платформах. Это не все преимущества этой платформы, но о других я рассказывать я не буду, дабы не раздувать дискуссию на эту тему. Скажу лишь одно, что телефон c iOS меня ни разу не подвел, даже в самые нужные моменты.
Разумеется, что для разработки под iOS необходим mac, и я его купил. Перед покупкой, разумеется, пробовал разработку под мобильные платформы в гибридных платформах типа Xamarin, Ionic, но на то время функционал в них был не так совершенен, как сейчас, да и пользуясь ими, я бы остался на платформе Windows, это нарушало цель, которую я перед собой поставил по поводу другой платформы.
В течение отпуска, где то за месяц я разобрался, как писать под iOS приложения и сразу начал искать проект, на котором смогу потренироваться. Друг предложил такой проект и я взялся.
За 9 месяцев написал серьезное приложение, купил учетную запись разработчика, выкладывал сборки на Test Flight, их тестировали тестировщики, прошел валидацию в App Store и выложил приложение в App Store.
А теперь по сути. Я постараюсь написать серию статей, в которых распишу простым языком, что надо делать, чтобы у вас тоже это получилось и вы таки выложили свое приложение в App Store.
Касаемо разработки под iOS, то это просто мое хобби во вне рабочее время (надо же как то развлекаться), основной хлеб приносит разработка под Windows/Web платформу с технологиями Microsoft.
Итак, приступим.
Включите свой мак, найдите на панели задач иконку App Store и нажмите на нее.
Выглядит эта иконка вот так:
Затем введите в поле поиска, текст “xcode”, вы должны увидеть следующее:
У меня Xcode уже установлен, поэтому на скриншоте отображается кнопка “Open”, у вас будет отображаться кнопка “Install”. Установите Xcode себе на компьютер, версия Xcode с которой мы будет работать с вами в этом примере, будет 8, на текущий момент это последняя версия этой среды разработки.
Язык программирования, который мы будем использовать, называется Swift, по синтаксису он больше похож на JavaScript и где-то даже на C# местами.
Синтаксис языка Swift в этих статьях мы разбирать не будем, в сети интернет есть полно руководств на эту тему. Сам синтаксис языка не сложно изучить, это делается за день, сложность как раз возникнет при попытке разработки приложения под iOS.
Вот именно эту сложность, мы с вами и постараемся одолеть.
Чтобы серия статей была как-то взаимосвязана, мы с вами напишем проект под названием “Warehouse” (склад), в котором можно будет добавлять товары, заполнять их атрибуты, редактировать и удалять товары. Данные будут сохраняться в настройки телефона.
Вы уже установили Xcode 8? Если да, тогда запускайте его, вы увидите следующее:
Нажмите кнопку “Create a new Xcode project”. Вы увидите такой экран:
Выделите проект “Single View Application” и нажмите кнопку “Next”. Вы попадете на экран задания названия проекта:
На данном скриншоте виден пример того, как заполнить название приложения. В поле “Product Name“, введите “Warehouse”, так будет называться наше приложение.
В поле “Organization Name”, введите свои имя и фамилию, или название вашей компании.
В поле “Organization Identifier”, вводится уникальный идентификатор приложения, который будет использоваться как ключ при регистрации данного приложения в iTunes, чтобы была возможность подписывать сборки и отправлять на бета сервер Test Flight для тестирования, но об этом позже. Вкратце “com” - это сокращенно “company”, “bozhek” это название компании, у вас это будет другое название.
В поле Bundle identifier видно полное название вашего приложения в iTunes.
В поле Language, оставьте Swift. В поле Devices, выберите iPhone.
Нажмите кнопку “Next”. Откроется проект, который мы создали:
Обратите внимание на красный кружок в поле Status: “Signing for Warehouse reguires a development team”. Это сообщение говорит нам о том, что приложение надо подписать сертификатом, без сертификата мы не соберем и не запустим это приложение.
Давайте это исправим. В поле Team, откройте выпадающий список и выберите в нем пункт “Add an Account...”, откроются свойства среды разработки Xcode, с предложением ввести логин и пароль от
вашей учетной записи в App Store, под которой вы устанавливаете приложения себе на телефон:
Если же у вас по каким то причинам нет этой учетной записи, создайте ее, нажав на кнопку “Create Apple ID”. Создание этой учетной записи я не буду рассматривать в данной статье, поскольку она создается очень легко и в сети интернет есть полно информации на эту тему.
Итак, вы ввели в поля Apple ID и Password свои данные, нажмите кнопку “Sign In”. После этого красный круг с ошибкой пропадет и вы увидите следующее:
Теперь вы сможете собрать и запустить свой проект.
Заметьте, я рассказываю чисто практически как и что делается, особо не вникая в детали.
Если вам нужна более подробная информация, вбейте в гугл WWDC, и посмотрите официальные видео сессии от компании Apple, в их двухчасовом видео много воды, но зато есть теория, которая будет вам нужна. Я даю только суть.
Нажмите на иконку приложения в проекте:
Выберите симулятор “iPhone 7”.
Затем нажмите на кнопку Собрать и запустить приложение:
Будет запущена сборка проекта и запущен симулятор “iPhone 7”, в котором откроется наше приложение:
Сейчас мы видим только белый экран и больше ничего, так как мы еще ничего не делали.
Чтобы выйти на рабочий стол в симуляторе, выполните сочетание клавиш Shift + Command + H, это сочетание означает нажатие кнопки Home:
Вы увидите на рабочем столе наше приложение "Warehouse".
Теперь давайте остановим выполнение приложения, для этого в Xcode нажмите кнопку:
Теперь давайте посмотрим, что у нас есть внутри проекта.
Выделите в левой панели среды разработки файл “Main.storyboard”, в этом файле содержится представление приложения.
В панели справа отображаются свойства представления.
Разработка под iOS строится через паттерн MVC (Model View Controller), файл Main.storyboard, содержит View, которые вы будете использовать в своем приложении для создания визуального
интерфейса. Теперь давайте выделим в панели свойств вкладку Class:
В поле Class , мы видим класс контроллера, привязанный к данному представлению.
Теперь выделите вкладку Size:
На данной вкладке задаются размеры представления.
Выделите вкладку Events:
На данной вкладке задаются обработчики событий в представлении с привязкой к методам в контроллере.
Теперь выберите в левой панели файл ViewController.swift :
На 9 строке подключено пространство имен UIKit.
На 11 строке объявляется класс с именем ViewController, который наследуется от базового класса контроллера UIViewController.
На 13 строке мы переопределяем метод, загрузки представления, этот метод вызывается когда представление начинает свою загрузку. В этом методе необходимо предварительно проинициализировать данные элементов управления, используемых на вашем представлении.
На строке 14, вызывается метод базового класса ViewController.
Код на строке 18 нам пока не интересен, мы его рассматривать не будем, чтобы не путаться.
На этом урок завершается.
На следующем уроке, в первой части, мы рассмотрим с вами, как пользоваться элементами управления, как привязывать к ним обработчики событий и как взаимодействовать с ними.
Основні етапи тестування мобільних додатків
Автор: Lauren Gilmore
Етап 1: Планування
Етап 2. Визначення необхідних типів тестування мобільних додатків
Етап 3: Тестові випадки та розробка сценаріїв тестування додатку
Етап 4: Ручне та автоматичне тестування
Етап 5: Тестування юзабіліті та бета-тестування
Етап 6: Тестування продуктивності
Етап 7: Атестаційне тестування та тестування безпеки програми
Етап 8: Тестування пристрою
Етап 9: Контрольний етап та резюме
Висновок
Ваш покроковий алгоритм тестування мобільних додатків
Забезпечення якості (QA, від англійської – Quality Assurance) є невід'ємною частиною життєвого циклу розробки будь-яких додатків, включаючи мобільні. На жаль, багато хто випускає з уваги критичні особливості тестування мобільних додатків, які часто призводять до збоїв, помилок у роботі додатку та поганої якості обслуговування клієнтів.
Щоб забезпечити успішну розробку будь-якого додатку, фахівець-тестувальник повинен брати участь у всіх етапах розробки: від створення концепції та аналізу вимог до створення специфікацій тестування та випуску готового продукту. Забезпечення якості також є ключовим елементом у наступних оглядах програмного продукту, які йдуть після проходження етапів розробки.
Однак часто буває складно визначити, з чого розпочати організацію процесу тестування мобільного додатку. Для безпроблемного тестування ми рекомендуємо просто виконати дев'ять наведених нижче кроків.
Давайте розглянемо особливості тестування мобільних додатків.
Цикл життя спринтів
Етап 1: Планування
Коли етап розробки додатку майже завершений, ви повинні знову поставити перед собою питання – чого ви намагаєтеся досягти розробкою цього додатку та які у вас є обмеження.
Ви повинні визначити наступне:
Чи взаємодіє ваш додаток з іншими додатками?
Наскільки функціональні всі можливості додатку?
Чи є тестований мобільний додаток нативним, Mobile-web або гібридним?
Чи обмежена задача тестування додатку тестуванням лише зовнішнього інтерфейсу?
Чи стоїть завдання на тестування бекенду?
Яка має бути сумісність із різними бездротовими мережами?
Як сильно дані додатку та вільний простір, який він займає, залежать від особливостей використання додатку?
Наскільки швидко завантажується ваш додаток, наскільки швидко відбувається серфінг по меню додатку та його функціям?
Як оброблятиметься можливе збільшення навантаження на додаток?
Чи впливають різні зміни у статусі та стані телефону на роботу мобільного додатку?
Переконайтеся, що ви домовилися з командою тестувальників про роль кожного з них та про ваші очікування від процесу тестування. Зрештою, спілкування є ключем до підтримки правильного робочого середовища в команді.
Правильне розуміння ролей і завдань також стосується і моменту прописування списку тест-кейсів. Уся команда QA повинна підтримувати та оновлювати цей документ зі звітами з тестування всіх функцій, реалізованих протягом усього процесу розробки.
Етап 2. Визначення необхідних типів тестування мобільних додатків
Перед тестуванням будь-яких мобільних додатків визначте, що саме в даному мобільному додатку ви хочете протестувати: набір функціональності, зручність використання, сумісність, продуктивність, безпека тощо. На цьому етапі має сенс обрати методи тестування мобільного додатку.
Визначте, на які цільові пристрої спрямовано цей додаток, та які вимоги до функціоналу слід перевірити.
Ви також маєте визначити, які цільові пристрої потрібно включити до списку тестування.
Ви можете зробити це наступним чином:
З'ясувати, які пристрої підтримуватиме додаток;
Визначити, яка версія операційної системи буде найбільш ранньою з тих, що підтримуються додатком;
Виявити найпопулярніші моделі мобільних пристроїв у цільової аудиторії;
Визначити набір неосновних (додаткових) пристроїв з екранами різних розмірів, які потенційно підтримуються додатком;
Вирішити, чи використовуватимете для тестування фізичні пристрої або їх емулятори.
Джерело: https://gs.statcounter.com/screen-resolution-stats/mobile/worldwide/#monthly-201804-201904-bar
Етап 3: Тестові випадки і розробка сценаріїв тестування додатку
Підготуйте документ, який описує тестові випадки (test cases) для кожної функції та функціональності, що тестується.
Крім функціональних тестових випадків, також повинні бути охоплені деякі окремі моменти (кейси):
Особливість використання батареї.
Швидкість роботи додатку.
Вимоги до даних.
Об'єм пам'яті, що використовується.
Також перед початком тестування важливо визначитися, яке поєднання ручного та автоматичного тестування ви будете застосовувати.
При необхідності підготуйте окремі набори ручних тестових випадків та сценаріїв для автоматичного тестування і адаптуйте їх відповідно до вимог проєкту.
Етап 4: Ручне та автоматичне тестування
Тепер настав час для виконання ручних та автоматизованих тестів.
Раніше, на попередніх етапах, ви вже визначили, які тести та скрипти використовувати та підготували їх. Тепер на поточному етапі ви виконуєте запуск тестів для перевірки механізмів основної функціональності, щоб переконатися у відсутності поломок.
Автоматизоване тестування мобільних додатків добре економить час та інші ресурси тестувальників.
Етап 5: Тестування юзабіліті та бета-тестування
Після того, як базовий функціонал протестований, настав час переконатися, що мобільний додаток є досить простим у використанні і забезпечує задовільний користувацький досвід. На цьому етапі необхідно підтримувати відповідність матриці кросплатформності, щоб забезпечити охоплення користувачів різних платформ, досягнуте бета-тестерами.
Приклад матриці підтримки різних версій платформи iOs
Після того, як додаток буде протестований всередині компанії, ви зможете випустити бета-версію додатку на ринок.
Тестування сумісності
Мобільні пристрої різняться залежно від платформи, моделі та версії їхньої операційної системи. Важливо обрати таку підмножину пристроїв, яка відповідатиме вашому додатку.
Тестування інтерфейсу користувача
Користувацький досвід є ключовим елементом при тестуванні додатку. Адже наша програма розробляється саме для кінцевих користувачів. Вам слід якісно перевірити зручність використання програми, навігацію її елементами та контент. Тестуйте меню, опції, кнопки, закладки, історію, налаштування та навігацію додатку.
Тестування інтерфейсу
Тестування пунктів меню, кнопок, закладок, історії, налаштувань та навігації додатком.
Тестування зовнішніх факторів
Додатки для мобільних пристроїв не будуть єдиними додатками на пристрої користувача. Разом із вашим додатком будуть встановлені програми від сторонніх розробників. Можливо, десятки таких програм. Отже вашому додатку доведеться взаємодіяти з цими сторонніми додатками і переривати роботу різних функцій пристрою, таких, як різні типи мережевих підключень, звернення до SD-картки, телефонні дзвінки та інші функції пристрою.
Тестування доступності
Мобільними пристроями можуть користуватися різні люди з обмеженими можливостями. З цієї причини важливо протестувати можливість роботи з додатком людей із дальтонізмом, порушеннями слуху, проблемами похилого віку та іншими можливими проблемами. Таке тестування є важливим складником загального тестування юзабіліті.
Етап 6: Тестування продуктивності
Мобільні пристрої надають для додатків менший об'єм пам'яті та меншу доступну потужність процесора, ніж стаціонарні комп'ютери та ноутбуки. З цієї причини в роботі мобільних додатків дуже важлива ефективність використання ресурсів, що надаються. Вам слід перевірити працездатність додатку, що тестується, змінивши з'єднання з 2G, 3G на WiFi, перевірити швидкість відгуку, споживання заряду батареї, стабільність роботи і т. д.
Рекомендується перевіряти додаток на предмет масштабованості застосування та наявності можливих проблем із продуктивністю.
В рамках цього етапу важливо пройти і тестування навантаження мобільного додатку.
Функціональне тестування
Функціональність додатку має бути повністю протестоване. Особливу увагу слід приділити встановленню, оновленням, реєстрації та входу в систему, забезпеченню, роботі зі специфічними функціями пристрою та повідомленням про помилки.
Функціональне тестування мобільного додатку, здебільшого, може бути виконане так само, як ви виконали його для будь-якого іншого типу додатку. З цієї причини ми не будемо вдаватися в подробиці цього типу тестування. Однак слід вказати області, які мають особливе значення для мобільних додатків.
Майте на увазі, що функціональне тестування повинно включати тестування всіх функцій додатку і не повинно бути надмірно зосереджено на якійсь одній функції.
В рамках функціонального тестування вам слід виконати наступні тести:
Тестування процесу встановлення.
Тестування можливості оновлень.
Експлуатаційне тестування.
Тестування процесу реєстрації та авторизації.
Тестування функцій, специфічних для пристрою.
Тестування надсилання та отримання повідомлень про помилки.
Низькорівневе тестування ресурсів: використання пам'яті, автоматичне звільнення ресурсів тощо.
Тестування сервісів: функціонування як в режимі онлайн, так і в автономному режимі.
Етап 7: Атестаційне тестування і тестування безпеки додатку
Безпека та конфіденційність даних мають величезне значення у наш час. Користувачі вимагають, щоб вся їхня інформація зберігалася безпечно та конфіденційно.
Переконайтеся, щоб програма, яка тестується, була надійно захищена. Виконайте перевірку на можливість впровадження SQL ін'єкцій, на можливість перехоплення сеансів, аналізу дампів даних, аналізу пакетів і SSL трафіку.
Дуже важливо перевірити безпеку сховища конфіденційних даних вашого мобільного додатку та його поведінку відповідно до різних схем дозволів для пристроїв.
Окрім перевірки безумовного шифрування імен користувачів та паролів, задайте собі наступні питання:
Чи має додаток сертифікати безпеки?
Чи використовує додаток безпечні мережеві протоколи?
Чи існують які-небудь обмеження, наприклад кількість спроб входу до системи блокування користувачів?
Этап 8: Тестування пристрою
Виконайте тести за тими алгоритмами, які ви раніше прописали у тестових випадках та сценаріях тестування, на всіх визначених для тестування пристроях, у хмарі та/або на фізичних пристроях.
Этап 9: Контрольний етап та резюме
Цей етап включає в себе детальне і повне тестування – від ранніх ітеративних етапів тестування до регресійних тестів, які все ще можуть знадобитися для стабілізації роботи додатку та виявлення незначних дефектів.
На цьому етапі тестування ви можете додати для перевірки нові функції та змінити налаштування на ті, яких не буде у фінальній версії.
Після завершення тестування додатку додаткові параметри та функції, додані для перевірки на цьому етапі, видаляються, і остаточна версія стає готовою до представлення громадськості.
Підсумковий звіт про тестування
Весь процес тестування мобільних додатків має бути ретельно задокументований. Перевірте двічі, чи зроблені необхідні записи, і після цього сформуйте свій остаточний звіт про тестування (test summary report).
Цей звіт повинен включати:
Важливу інформацію, виявлену в результаті проведених випробувань.
Інформацію про якість тестування, яке проводиться.
Зведену інформацію про якість тестованого мобільного додатку.
Статистику, отриману зі звітів про різні інциденти.
Інформацію про види тестування та час, витрачений на кожен із них.
Слід також зазначити у звіті, що:
цей мобільний додаток придатний для використання в тій якості, в якій заявлено;
відповідає всім критеріям прийнятності функціоналу та якості роботи.
Озброївшись зведенням, керівництво проєкту тепер може вирішити, чи готовий мобільний додаток до випуску на ринок.
Тестування мобільних додатків – складне завдання. Пристосовуючи ці етапи тестування до кожного розроблюваного додатку і ретельно виконуючи кожен крок, ви гарантовано отримаєте повнофункціональний якісний продукт.
Висновок
У цій статті ми розглянули особливості тестування мобільних додатків. Розглянуті етапи тестування важливі і для тестування андроїд додатків, і як відповідь на питання “як тестувати додатки для iPhone?”.
Важливо пам'ятати, що тестування додатків перед представленням на ринку – важливий етап розробки будь-яких додатків. І, звичайно ж, тестування мобільних додатків має свої особливості та важливі моменти.
Відповідально підходьте до питання розробки та тестування мобільних додатків, своєчасно вивчаючи та застосовуючи актуальні методики та технології. З нашого боку ми рекомендуємо для вивчення курс на ITVDN – Unit тестування для Android розробників.
За матеріалами статті.
Також Вам можуть бути цікаві:
Відео курси за спеціальністю Quality Assurance
Відео курси за спеціальністю Android Developer
Відео курси за спеціальністю iOS Developer
Роль сертифікації для компанії та співробітника
Автор: Олександр Марченко
Введение
Продолжаем с Вами знакомиться с понятием профессиональной сертификации, и в этой части поговорим о роли сертификации для компании и для сотрудника.
Большинство наших знакомых ИТ-специалистов предлагают следующие варианты обоснования целесообразности сертификации:
Требуется для компании в рамках программы развития сотрудников. (Нечто подобное в Британии сделали обязательным, ознакомьтесь с понятием Chartered IT Professional);
Рассчитываю на бонусы или повод для повышение заработной платы;
Рассчитываю на способствование карьерному росту;
Хочу подтвердить свои знания и навыки.
Каждый из нас когда-то приходил к подобным умозаключениям, но кто из нас хоть однажды задумывался о том, чего ожидает компания от сертификации? Попробуем себе представить…
Партнерские программы с вендором. Каждый вендор имеет программы Gold/Silver partner и подобные им. Так, когда заказчик видит подобное свидетельство качества, у него повышается уровень доверия и лояльности. Зачастую такие программы партнерства подразумевают не только финансовые взносы и соответствие многим параметрам оценки, но и присутствие в штате компании нужного числа сертифицированных специалистов.
«Необходимое и достаточное условие» для участия в конкурсах и тендерах, торгах и т.д. Зачастую для того, чтобы заполучить желаемого заказчика, нужно «помочь» ему составить требования к «ожидаемому» подрядчику. А что может быть еще более непредвзятым, как мнение третьей стороны, как сертификация, выданная независимым провайдером или вендором? К тому же, если у конкурента нет такого преимуществе – победа, считайте, у Вас в кармане.
Честолюбие или тщеславие. Если Вы часто бываете в крупных компаниях, особенно ИТ интеграторах, Вы видели у них стену или целый зал славы, стены в котором сплошь увешаны табличками с разными золотыми партнерскими статусами за последние N лет, наградами и почетными грамотами. А в коридорах Вы можете изучать историю сертификации доброй половины ведущих специалистов.
Отбор кандидатов. Точно также, как Вы выбираете врача для своего ребенка, сервисный центр для обслуживания автомобиля, юриста с его дипломами и наградами – также и компания в лице рекрутера выбирает себе сотрудника.
Вспомните, как часто у Вас просили ссылку на Ваш профиль на GitHub, кто-то спрашивал у Вас, как часто Вы даете советы или ответы на вопросы на StackOverflow или кто-то похвалил Вашу статью на популярной блоговой платформе для ИТ-шников?
А как часто Вы заявляли об этом в своем резюме? И как часто Вы включаете номера своих сертификатов и обновляете их на своем профиле в LinkedIn?
Думаю, Вам понятно, что сертификация — это какая-никакая гарантия качества знаний сотрудника.
В то же время, могу Вас заверить, что при активной «социальной» деятельности, которая подтверждает Ваши знания и опыт, такой как выступления на тематических конференциях, модерирование хакатонов, ведение интересных блогов, разработка курсов для начинающих разработчиков и т.д., Вам не понадобится сертификация для уверения рекрутера в Вашей надежности и соответствии требованиям проекта.
Но, если Вы начинающий специалист, которому нужно оказаться лучше, чем толпы конкурентов, задумайтесь над тем, что заставит рекрутера смотреть именно в Вашу сторону, задумайтесь сможете ли Вы дать компании то, что дорого для нее.
З чого розпочати вивчення JavaScript?
Автор: Дмитро Охріменко
JavaScript – прототипно-ориентированный язык программирования, который используется для написания сценариев, выполняемых специальным программным обеспечением. JavaScript часто используется при написании сценариев для веб приложений, но в последнее время язык начал активно применяться и в других областях разработки – в серверных приложениях (node.js), на мобильных платформах (PhoneGap) и даже для разработки приложений для Windows (Windows Store with JS). Как вы видите, язык достаточно активно используется и входит в 10 популярных языков программирования, поэтому многие начинающие разработчики и уже опытные изучают этот язык программирования. В сети можно найти самоучители, книги с примерами кода и видео уроки по JavaScript в достаточном количестве. Но проблема в том, что уроков для начинающих и других учебных материалов очень много, и у большинства возникает проблема - «что и в какой последовательности учить?». Задача данной статьи помочь вам найти правильный путь в изучении JavaScript.
Каждый для себя выбирает наиболее удобную и эффективную форму обучения – это могут быть книги по JavaScript и самоучители для самостоятельного обучения, очные курсы программирования, где тренер может ответить на вопросы, или видео уроки по JavaScript и примеры JavaScript кода. Какой бы из подходов вы ни выбрали – главное, последовательно и планомерно следовать программе обучения и максимально много практиковаться, так как без практики запомнить и научится применять большое количество разнообразных языковых конструкций достаточно тяжело.
Если вы выберите самостоятельное изучение, обязательно приобретите следующие книги по JavaScript. Настольная книга любого JavaScript разработчика – Дэвид Флэнаган «JavaScript Подробное руководство». Вторая книга, которая позволит вам правильно организовывать свой код - Стоян Стефанов «JavaScript Шаблоны», но она пригодится вам позже, когда вы разберете примеры JavaScript кода из предыдущей книги.
В изучении JavaScript можно выделить несколько этапов:
Изучение языковых конструкций: переменные, циклы, условные конструкции, функции.
Освоение объектов и массивов.
Изучив основы работы с языковыми конструкциями и основными типами данных, можно перейти к освоению главной задачи JavaScript – манипулированию DOM дерева. Вы должны научится работать с элементами, которые находятся на странице, динамически создавать новые узлы и изменять существующие.
Изучение шаблонов проектирования и кодирования, которые позволят разрабатывать понятный и сопровождаемый код.
Изучение дополнительных библиотек и фреймворков, например, jQuery.
Изучая материалы книги Дэвида Флэнагана, вы сможете пройти первые 3 этапа, а книга Стояна Стефанова поможет научиться правильно организовывать JavaScript код. В дополнение к книгам вам могут помочь видео уроки по JavaScript для начинающих и JavaScript для профессионалов.
Початок кар'єри в ІТ
Автор: Олександр Марченко
Введение
Пожалуй, все давно знают, что эра технологий уже наступила, и произошло это уже давно. На сегодняшний день невозможно создать производство чего-либо без использования информационных технологий.
Насколько целесообразным является выбор именно Информационных технологий в качестве своей профессиональной сферы, решать каждому из Вас. Но Вам будет очень трудно найти что-то более динамичное и захватывающее. Также стоит помнить, что и уровень зарплат по-прежнему сохраняет статус наиболее привлекательных, практически во всех современных экономиках развитых государств.
Что нужно знать о построении своей карьеры? Все решают Ваши знания и отношения с другими людьми. Причем, влияние этих двух аспектов абсолютно равноправное.
Если Вы отдадите должное внимание построению нужных связей и знакомств, будете постоянно пополнять свой круг общения новыми приятными и полезными знакомствами, и, главное, не забудете поддерживать старые отношения, то всегда будете оставаться в более выгодных условиях.
И наоборот, тот, кто будет разбрасываться знакомствами, ставить свои приоритеты выше других, вести себя неподобающе в современном обществе, в итоге приобретет дурную славу, которая очень быстро распространиться по локальному ИТ-сообществу и за его пределами.
Первым шагом в построении карьеры, скорее всего будет трудоустройство на первую работу. И тут придется ответить на самый страшный вопрос: «Где взять 2 года опыта?»
Порой этот вопрос звучит следующим образом: «Где я обзаведусь опытом работы в реальных проектах, если я только учусь/только что выпустился/работаю в другой сфере/не имел опыта с этой платформой?». И это абсолютно правильный вопрос, поскольку работодатель хочет нанять надежного профессионала, а не дилетанта.
Попробуем найти ответы на этот вопрос, и вот несколько вариантов:
Принимайте участие в хакатонах и OpenSource проектах
Данного рода активности позволят Вам обзавестись своими личными проектами. Их Вы сможете развивать, при этом, без сомнений, улучшите свои профессиональные навыки и обзаведетесь полезными знакомствами. Ведь они могут сыграть ключевую роль в Вашем будущем.
Анализируйте чужой код
Доступ к которому все также легко получить на OpenSource проектах. Вы не сможете стать профессионалом и создавать свои решения до тех пор, пока не сможете полностью понимать чужие. Это все равно как учиться писать, не имея навыков чтения.
Участвуйте в стажировках
Большинство крупных компаний с огромным удовольствием берут на стажировки студентов, которые проявляют потенциал. Вам никто не даст участвовать в крупных и критически важных проектах, но зато Вы сможете проявить себя в реальных условиях, да еще и сделать это под чутким руководством более опытных коллег. Дополнительным бонусом стажировок является пусть и незначительная, но возможность получения приглашения на работу. Для этого нужно постараться, но никто и не говорил, что будет легко.
Кроме всего прочего не забывайте о постоянной работе над собой. Если Вы хотите оставаться востребованным на рынке труда специалистом, Вам необходимо оставаться в курсе последних событий ИТ-мира и непрерывно совершенствоваться. Для Вас не должно быть открытием то, что работа - это рутина, а вот обучение зачастую приносит больше удовольствия. Так превратите свою работу в непрерывное развитие, и Вы не пожалеете!
З чого розпочинається створення сайтів? Спеціальність верстальник
Автор: Влад Сверчков
Кто такой верстальщик?
Языки верстки HTML & CSS
Техники верстки
Препроцессоры
Графический редактор и векторная графика
Инструмент упрощения верстки Bootstrap 4
Язык программирования JavaScript
Библиотека jQuery
Методология БЭМ
Вспомогательные инструменты
Система управления версиями Git
Английский язык
Итоги
Всем привет!
Вы когда-либо задумывались о том, как происходит полный цикл разработки современного веб-сайта? С чего все начинается и как мы приходим к такому сервису, который имеет привлекательный и гармоничный внешний вид, а также богатый функционал? Давайте разберемся с этим вопросом, а заодно поближе познакомимся с героем данной статьи.
Прежде всего стоит знать, что сегодня человек-оркестр, который мог бы осуществить полный цикл создания веб-сайта — очень редкое явление. Процесс реализации одной только клиентской стороны уже является трудом целой команды специалистов.
Если говорить о профессиональной веб-студии, то разработка несложного корпоративного веб-сайта осуществляется следующим образом. Вначале за заказчика сайта берется менеджер по продажам. Он общается с клиентом через телефон, электронную почту, при личной встрече. Обсуждает все детали возможного сотрудничества. Задача менеджера по продажам — решить все финансовые и юридические нюансы, связанные с созданием сайта.
После заключения договора и оплаты услуг наступает звездный час PM`а (менеджер проекта), который и управляет проектом. Он ответственен за координацию действий команды разработчиков: проектирование и расстановка приоритетов, планирование выполнения задач, контроль, своевременное решение проблем, согласование промежуточных и конечных этапов создания и продвижения сайта. PM является связующим звеном между заказчиком и разработчиками: он плотно сотрудничает с клиентом, выясняет его требования, желания, предпочтения, затем конвертирует всю информацию в понятный команде девелоперов вид.
После определения требований за работу берется веб-дизайнер. Данный специалист занимается графической и художественной составляющими сайта. В этой секции веб-кухни происходит создание красивого и приятного интерфейса с удобным размещением кнопок, меню и других элементов веб-сайта. На выходе получаются макеты, которые учитывают различные платформы потенциальных посетителей (стандартные и широкоформатные экраны ПК, планшеты, мобильные устройства и т. д.). Результат работы веб-дизайнера — графическая схема с указанием оттенков, отступов и других параметров веб-сайта в статическом виде, которая максимально точно отображает внешний вид будущего сайта. Фактически, это точный рисунок сайта.
Готовый макет передается в руки верстальщика. Теперь при помощи различных элементов языка разметки веб-страницы графические элементы дизайна (рисунки, шрифты, таблицы и т. д.) будут переведены в понятный для браузера формат. Можно сказать, что он создает текстовый макет того, что придумал дизайнер. После того, как страница сверстана и проверена в различных браузерах на правильность отображения, она передается в работу специалисту, который подключает необходимый клиентский функционал, используя JavaScript-фреймворки, библиотеки и сопутствующие технологии. Как правило это FrontEnd разработчик.
Затем начинается работа BackEnd разработчика, который занимается реализацией серверной стороны веб-сайта (базы данных, серверная архитектура, программная логика). Обработка пользовательских запросов, хранение и оперирование пользовательскими данными, аутентификация, оптимизация функциональных возможностей сайта и многое другое — обязанности бэкендщика.
С уже готовым сайтом работают те специалисты, которые ответственны за его наполнение и продвижение в поисковых системах: контент-менеджер, специалист по контекстной рекламе, SEO-специалист, копирайтер и другие.
Сегодня же нас интересует именно тот, кто превращает графику в узнаваемый браузером формат — верстальщик. Разберемся в специфике его работы и навыках, которыми должен обладать потенциальный кандидат на данную должность.
Кто такой верстальщик?
Сразу дадим определение терминам, которые важны для составления целостной картины. Верстальщик — это специалист, который занимается версткой интернет-страниц. Верстка — процесс создания визуальной составляющей сайта. Структура самого сайта задается языком гипертекстовой разметки HTML, а каскадная таблица стилей CSS описывает его внешний вид. Проще говоря, HTML задает каркас страницы, а CSS занимается его облагораживанием (цвет, шрифты, стили, расположение, отображение блоков и т. д.).
Если говорить о профессиональной верстке, то она происходит согласно заранее разработанному макету, который обычно создает веб-дизайнер, знающий тонкости своего ремесла. После получения графического документа от дизайнера верстальщик использует Photoshop или другие аналоги для извлечения необходимой информации (Illustrator, Sketch, Figma и другие): используемые шрифты, иконки, картинки, точные кодировки цветов, размеры элементов в пикселях, их точное расположение. Только после такой подготовительной работы герой нашей статьи может открыть среду написания кода и приступить к верстке. Давайте узнаем, каков арсенал инструментов использует верстальщик в своей работе.
Какие языки / технологии / инструменты применяет верстальщик?
HTML & CSS
Языки верстки, которые мы уже упоминали. Являются главными инструментами верстальщика. Без них не обходится создание ни одного веб-сайта. HTML определяет его структуру (костяк), а CSS — внешний вид (вся остальная надстройка).
Техники верстки
Для создания качественных веб-сайтов необходимо использовать специальные техники, которые упрощают верстку, делая код понятным и легко масштабируемым. Таким образом, выделяют три вида верстки:
фиксированная;
резиновая;
адаптивная.
Фиксированную верстку применяли еще при создании самых первых сайтов. Тогда они были простые, не требовали какой-либо оптимизации и кроссбраузерности, а потому не было потребности в разработке новых сайтостроительных техник. При фиксированной верстке ширина сайта всегда одинаковая вне зависимости от разрешения экрана. Это самый простой подход к реализации верстки, но при этом самый непопулярный, поскольку сегодня пользователи используют множество моделей компьютеров, ноутбуков, телефонов и планшетов для выхода в сеть. В связи с этим, разрешение экранов варьируется от 200 до 3000 пикселей.
Резиновая верстка способна менять размеры сайта в зависимости от размерности экрана. Таким образом, проблемы фиксированного вида решаются, однако сама процедура набора страницы усложняется. Верстальщику приходится думать о том, как растянуть картинки, чтобы они не потеряли в качестве и корректно отображались на всевозможных девайсах. Ну и о производительности не забывать. Кому нужен сайт, который будет прогружаться вечность?
Адаптивная верстка является самой сложной. Сайт помимо размеров меняет свой внешний вид в зависимости от размеров устройства, на котором воспроизводится. Ориентирована в первую очередь на мобильные устройства, оттого и имеет сегодня большой спрос.
Также, качественная верстка должна обладать следующими свойствами:
семантичность;
кроссбраузерность;
валидность.
Семантика в верстке означает соответствие тегов информации, которая находится внутри них. С ее использованием код становится чище, читабельнее и лаконичнее. Более того, поисковые системы начинают лучше воспринимать такие сайты, повышая их позиции при ранжировке.
Кроссбраузерность означает, что разработанный сайт должен качественно отображаться во всех популярных браузерах (Mozilla Firefox, Opera, Google Chrome, Safari, IE). Почему она так важна? Все дело в том, что один и тот же сайт может по-разному отображаться в разных браузерах. Не будем заглядывать за кулисы этого явления — просто подчеркнем, что современные сайты обязаны отвечать требованию кроссбраузерности.
Валидность веб-сайта означает соответствие его HTML-кода стандартам W3C (Консорциум Всемирной паутины). Валидация предусматривает соблюдение корректности кода страниц, отсутствие синтаксических ошибок, наличие вложенности тегов и т. д. Проверка HTML-кода выполняется при помощи специальной программы — валидатора кода. Она находит и фиксирует все несоответствия со стандартом, указывая на их местонахождение и формулируя, где проблемный участок и почему он должен быть исправлен.
Естественно, важным является и тот нюанс, что ваш код должен быть минимален, а интернет-страница, созданная с его помощью, должна быстро прогружаться. Ниже мы также рассмотрим вспомогательные инструменты, которые обеспечивают выполнение этих условий.
Sass/SCSS
Препроцессор, который является расширением CSS. Если современный CSS сам по себе простой и мощный инструмент, то в комбинации с препроцессором это вовсе боевая машина для качественного оформления контента на интернет-страницах. Польза Sass/SCSS особенно отчетливо ощущается в больших проектах, когда количество строчек кода кажется бесконечным. Препроцессор позволяет использовать функции, недоступные в самом CSS. Например, переменные, вложенности, миксины, наследование и другие вещи, которые упрощают и делают удобным написание CSS-кода.
Photoshop / Illustrator / Sketch / Figma / Avocode
Графический редактор, как мы уже упоминали, необходим верстальщику для извлечения необходимой информации из предварительно подготовленного макета: используемые шрифты, иконки, картинки, точные кодировки цветов, размеры элементов в пикселях, их точное расположение. Какой редактор был использован для создания макета, такой следует использовать и для изъятия необходимых данных.
SVG
Вдогонку за графическими редакторами упомянем об SVG. Это язык разметки масштабируемой векторной графики. Изображения на странице, сделанные с помощью SVG, корректно отображаются на экранах с различным разрешением не теряя при этом своего качества, в отличии от традиционных растровых .jpeg, .png и других. Верстальщик должен уметь работать с SVG, поскольку он важен для оптимизации и быстродействия сайта, а также используется для реализации анимации векторных изображений, разработки прелоадеров и других интерактивностей.
Bootstrap 4
Это HTML, CSS, JS фреймворк для разработки кроссбраузерных веб ориентированных интерфейсов. Bootstrap являет собой набор инструментов от Twitter, созданный для облегчения разработки веб-приложений и сайтов. Он использует CSS и HTML для типографии, форм, кнопок, таблиц, сеток, навигации и т. д., а также дополнительные расширения JavaScript, упрощающие работу веб-разработчика. Данные свойства позволяют коду, написанному с применением Bootstrap, быть переиспользуемым, понятным и компактным.
Основные преимущества фреймворка:
высокая скорость верстки;
кроссбраузерность и кроссплатформенность;
наличие хорошей документации, большого сообщества и огромного количества разнообразных обучающих материалов;
низкий порог вхождения (необходимо знать лишь основы HTML, CSS, JavaScript и jQuery).
JavaScript
Язык программирования, который повсеместно используется в создании сайтов, даже в реализации их серверной стороны. Становиться ниндзя JavaScript верстальщику не нужно — это задача FrontEnd разработчика, который прорабатывает логику клиентской стороны веб-приложений. Герою статьи JS необходим для реализации различных динамических элементов на странице: анимации, слайдеры, калькуляторы и т. д. Также, этот язык применяется для подключения различных библиотек и определенных взаимодействий с ними. Знание базы JavaScript необходимо для комфортного использования библиотеки jQuery, подробнее о которой пойдет далее речь.
jQuery
Небольшая, быстрая и многофункциональная JavaScript-библиотека, для работы с которой необходимо владеть HTML, CSS и JavaScript на базовом уровне. Она упрощает процесс программирования на JS и представляет объемные решения распространенных задач в виде методов, которые вызываются одной строчкой кода.
Этой особенностью jQuery приносит ощутимую пользу верстальщикам. Вместо углубления в JavaScript и написания тонны кода, можно просто использовать уже готовые решения в различных задачах.
Методология БЭМ
“Блок, Элемент, Модификатор” — методология, предусматривающая компонентный подход к разработке веб-страниц, в основе которого лежит принцип разделения интерфейса на независимые блоки. Подход БЭМ позволяет повторно использовать существующий код в создании других страниц с сохранением всех его свойств (размеры, шрифт, цвет и т. д.). Таким образом обеспечивается расширяемость и повторная используемость компонентов интерфейса. Соблюдение принципов БЭМ повышает качество, читаемость кода, увеличивает производительность и упрощает командную работу.
CMS (Wordpress / Opencart / Joomla / Bitrix)
Content Management System — система управления контентом, являющая собой движок для обеспечения и организации процесса создания, редактирования и управления контентом. В случае отсутствия CMS разработчики были бы обязаны реализовывать дополнительную функциональность для каждой новой страницы, вносить новый контент самостоятельно программным путем и т. д. Ниже приведем пример для наглядности.
Допустим, вы ведете собственный блог на специализированной платформе и у вас появилась необходимость сделать новую рубрику. Вы же не будете просить целую команду разработчиков создать новую интернет-страницу с нуля со всей функциональностью либо дорабатывать уже существующую под каждый новый пост? А в случае с интернет-магазином вы были бы вынуждены проделывать такие манипуляции для каждого нового товара. Вот для этого и существуют CMS. Они предоставляют удобную администраторскую панель вашему сайту, с которой в дальнейшем работает контент-менеджер. В профессиональной среде процесс настройки взаимодействия движка и готового шаблона сайта называется “натяжкой” шаблона на CMS.
Основные функции CMS:
предоставление инструментария для работы над контентом;
управление контентом — хранение, управление потоком документов, соблюдение режима доступа, контроль версий;
публикация контента;
представление необходимой информации в удобном для навигации и поиска виде.
Gulp / Webpack
Gulp — система сборки, которая автоматизирует рутинные задачи верстальщика. В число ее обязанностей входят: минимизация кода, оптимизация изображений, тестирование, анализ качества кода и прочее. Другими словами, она используется для сбора верстки. Webpack по сравнению с Gulp обладает более широкими настройками и функционалом. Предназначенный для удобной разработки одностраничных веб-приложений с использованием JavaScript.
Git
Самая популярная распределенная система управления версиями, которая позволяет вести историю разработки проекта с возможностью доступа к каждой сохраненной версии. Таким образом, если в процессе создания программный продукт стал неправильно функционировать, есть возможность вернуться к предыдущей рабочей версии вместо длительных поисков ошибок.
Также системы управления версиями являются неотъемлемым инструментом командной разработки, который дает возможность девелоперам работать над одним проектом одновременно, сохраняя внесенные изменения. Заодно удобно отслеживать выполнение задач каждым членом команды. Очень важный инструмент для любого IT-разработчика.
Английский язык
Знание английского языка является одним из основных требований к верстальщику, поскольку большое количество полезной информации находится именно на англоязычных сайтах. Уровень чтения технической документации будет достаточным для комфортного пользования иностранными ресурсами.
Итоги
Верстальщик — это специалист по верстке веб-страниц. Несмотря на довольно лаконичное определение, список требуемых от него знаний и навыков гораздо красноречивее. Верстальщик в 2020-м году должен владеть неплохим стеком технологий. Более того, мы привели лишь общий список инструментов. В реальности он может немного отличаться согласно направлению деятельности компании/веб-студии. Если к перечисленному добавить углубленные познания JavaScript и хорошее владение одним из фреймворков (Angular, Vue.js, React) + парочка смежных технологий, получится полноценный FrontEnd разработчик.
Отдельно отметим портфолио верстальщика. Оно должно быть в наличии у данного специалиста в обязательном порядке, иначе шансы получить job-оффер ничтожно малы (не забывайте и о конкуренции). В портфолио вам необходимо продемонстрировать все свои навыки и умения. Это может быть десяток проектов с использованием по крупице различных технологий в каждом, либо пара-тройка, но с концентрированием всех ваших умений и познаний в верстке. В этом случае пригодятся специальные ресурсы с опубликованными бесплатными макетами, которые можно брать и верстать, набивая руку и набираясь опыта.
Также, если вы заинтересованы в изучении ремесла верстальщика, ITVDN имеет для вас хорошие новости. На нашем образовательном ресурсе вы сможете освоить данную специальность за 4 месяца.
Учебная программа каждой специальности, в том числе и верстальщика, содержит:
тщательно подобранный пакет видео курсов;
план обучения с нуля до уровня специалиста, который вы можете адаптировать под свой уровень;
Интерактивный Тренажер навыков для формирования навыков написания кода;
учебные материалы, исходники программного кода, опорный конспект, презентации к урокам;
доступ к Форуму, где каждый учащийся может общаться с другими студентами, тренерами и единомышленниками;
возможность персональной консультации с тренером согласно выбранному пакету подписки;
возможность проходить тестирование для подтверждения знаний, полученных в результате прохождения видео курса;
электронный сертификат об окончании курса после успешного завершения тестирования.
Все видео курсы записываются опытными разработчиками, которые проходят соответствующую сертификацию, чем подтверждают свое мастерство владения той или иной технологией. Наши преподаватели работают в IT и в курсе всех современных тенденций в своей сфере разработки.
Знакомство со специальностью мы рекомендуем начать с просмотра бесплатных вебинаров по специальности верстальщик, в частности, с вебинара Елены Хижняк “Как стать верстальщиком?”, в котором отражены все самые актуальные тренды и требования.
Возможно, нас читают практикующие верстальщики? С удовольствием прочтем вашу точку зрения на позиции, изложенные в данной статье. Также, будем рады любым вопросам и замечаниям от всех читателей!
Ну а тем, кто решил выбрать профессию верстальщик мы желаем быть упрямыми, оптимистичными и с неугасаемым огоньком жажды знаний в глазах.Успехов и вдохновения на вашем пути!
Введення в розробку програм під iOS. Частина 7
Автор: Volodymyr Bozhek
Здравствуйте, дорогие читатели.
В этом уроке мы:
выполним рефакторинг проекта “Warehouse” под “iOS”. Создадим удобную структуру расположения модулей в проекте.
научимся пользоваться библиотекой “Alamofire”.
научимся сохранять объекты в настройки телефона и извлекать их.
реализуем функциональность для работы со всеми сервисами, созданными в данном уроке.
Откройте проект “Warehouse” под iOS, который мы делали на протяжении всех уроков.
Запросы на сервер можно отправлять синхронно и асинхронно. Основное требование Apple, чтобы приложение не зависало и большие операции выполнялись в фоновом режиме.
Представим ситуацию: у нас мобильный интернет “GPRS EDGE”, скорость соединения около 54 кб/сек. Если отправлять запрос на получение данных на сервер синхронно, мы блокируем работу приложения и пользователь вынужден ждать. Наша задача - дать пользователю выбор, ждать или нет. Поэтому лучше всего отправлять такой запрос асинхронно.
На сегодняшний день существует такая библиотека “Alamofire”, где собраны лучшие практики асинхронного программирования и все оптимизировано за нас.
Откройте браузер и перейдите по адресу: “https://github.com/Alamofire/Alamofire”. На сайте нажмите кнопку “Clone of download” и в появившемся окне нажмите “Download Zip”.
Когда скачается архив, распакуйте его.
Выделите файл “Alamofire.xcodeproj” и папку “Source” и скопируйте их в папку проекта “Warehouse”.
Перейдите в проект “Warehouse”.
В панели навигации выполните контекстное меню по папке “Warehouse” и в контекстном меню выберите “Add files to 'Warehouse'...”. В открывшемся диалоговом окне выбора файлов выберите файл “Alamofire.xcodeproj”.
Выполните в меню “Product -> Build”, чтобы собрать проект.
Затем выделите в панели навигации папку “Warehouse”, в области содержимого откроются свойства проекта. Откройте вкладку “General”, пролистайте область содержимого в самый низ.
Установите свойство “Embedded binaries”, нажмите плюсик. В появившемся диалоговом окне, выберите “Alamofire.Framework.iOS” и нажмите кнопку “Add”.
Результат должен получиться таким.
Выполните в меню “Product -> Build”, чтобы собрать проект.
Итак, что мы только что сделали. Мы подключили исходники библиотеки “Alamofire” в проект “Warehouse”. Можно было это сделать и отдельным проектом, но так проще для восприятия. Затем мы подключили сборку “Alamofire.framework.iOS” в приложение “Warehouse” для возможности обращения к классам данной библиотеки из нашего проекта.
Теперь нам надо создать модели данных, в которые мы будем сохранять JSON объекты, полученные с сервера. Также необходимо предусмотреть удобство сохранения и извлечения данных, поскольку запросы будут асинхронными и просто вернуть нужный экземпляр из метода будет проблематично.
Именно поэтому мы поступим следующим образом.
Отправляем запрос на сервер асинхронно. В метод отправки добавляем callback метод, который вызовется после того, как модель была успешно сохранена в настройки телефона.
Ждем ответа. Когда ответ пришел, десериализуем объект JSON в нужную модель данных, объявленную в приложении.
Сохраняем заполненную модель в настройки телефона.
В контроллере, из которого был отправлен запрос, в callback методе извлекаем модель из настроек телефона и инициализируем данными элементы управления.
Создайте следующую структуру папок в панели навигации.
В папку “Warehouse” были добавлены папки “Controllers”, “Protocols”, “Models”, “Services”.
В папку “Controllers” были добавлены папки “Users”, “Registration”, “Authorization”, “Supplies”.
В папке “Controllers” будут храниться модули контроллеров.
В папке “Protocols” будут храниться модули протоколов.
В папке “Models” будут храниться модули моделей данных.
В папке “Services” будут храниться модули обращения к REST сервисам.
Сейчас нам необходимо провести некоторую подготовку, перед тем как начать реализовывать приложение. Пока, давайте, добавим нужные модули. Сам по себе добавленный модуль ничего не делает.
Перетащите в папку “Controllers / Supplies” модули “SuppliesViewController.swift”, “ProductViewController.swift”.
Перетащите в папку “Controllers / Authorization” модуль “ViewController.swift”.
Добавьте в папку “Controllers / Registration” модуль “RegistrationViewController.swift”.
Добавьте в папку “Controllers / Supplies” модуль “ImageCollectionViewController.swift”.
Добавьте в папку “Controllers / Users” модули “UsersViewController.swift”, “UserItemViewController.swift”.
Добавьте в папку “Protocols” модуль “SelectedImageProtocol.swift”.
Добавьте в папку “Models” модули “ProductModel.swift”, “UserModel.swift”.
Добавьте в папку “Services” модули “UserData.swift”, “ProductData.swift”, “Services.swift”, “AuthorizationService.swift”, “ProductService.swift”, “UserService.swift”.
У вас должна получиться следующая структура.
Как видите, проект стал больше. Он станет еще больше, как только мы заполним добавленные модули.
Откройте модуль “Models / UserModel.swift”. Заполните его, как показано ниже.
В этом модуле мы создаем модель пользователя, в которую будем десериализовывать JSON объект пользователя, полученный от сервера.
В классе “UserModel” мы добавляем поля модели “_id”, “userName”, “userPwd”, “userDesc”, которые декларировали при объявлении схемы базы данных “Mongo DB” на сервере.
На 9 строке мы подключаем пространство имен “Foundation”.
На 11 строке мы объявляем класс с именем “UserModel”, который наследует класс “NSObject”, являющийся базовым классом для всех классов в iOS платформе. Наследуемся от протокола “NSCoding”, данный протокол необходимо реализовать, чтобы объект можно было сохранять в настройках телефона и извлекать оттуда.
Рассмотрим протокол “NSCoding”.
Протокол содержит метод “encode” и инициализатор.
Экземпляр класса “NSCoder” позволяет кодировать и раскодировать свойства класса, значения которых могут сохраняться в хранилище настроек телефона.
В методе “encode” данные извлекаются из свойств и кодируются в формат, нужный для сохранения в настройки телефона.
В инициализаторе данные извлекаются и раскодируются из настроек телефона, затем сохраняются в нужные свойства класса.
Вот так это работает.
Теперь вернемся и рассмотрим дальше модуль “UserModel.swift”.
На 12 строке мы объявляем поле “_id” типа “String” и инициализируем его значением по умолчанию, пустая строка.
На 13 строке мы объявляем поле “userName” типа “String” и инициализируем его значением по умолчанию, пустая строка.
На 14 строке мы объявляем поле “userPwd” типа “String” и инициализируем его значением по умолчанию, пустая строка.
На 15 строке мы объявляем поле “userDesc” типа “String” и инициализируем его значением по умолчанию, пустая строка.
На 17 строке мы переопределяем инициализатор по умолчанию для класса “NSObject”, тем самым мы говорим, что создание объекта без передачи аргументов в инициализатор будет возможно.
На 18 строке мы вызываем базовый инициализатор из класса “NSObject”.
На 21 строке мы объявляем параметризированный инициализатор. Данный инициализатор инициализирует поля класса “_id”, “userName”, “userPwd”, “userDesc” значениями, переданными в аргументы инициализатора.
На 31 строке мы реализуем конструктор протокола “NSCoding”. Ключевое слово “required” обозначает, что вызов этого инициализатора обязателен в первую очередь. Ключевое слово “convenience” гарантирует то, что после вызова этого инициализатора будут вызваны остальные инициализаторы классов, связанных с этим классом по цепочке вверх.
На 32 строке мы раскодируем из настроек телефона значение свойства “_id” путем вызова на экземпляре “aDecoder” типа “NSCoder” метода “decodeObject”, аргумент “forKey” которого принимает название поля/свойства, которое было сохранено в настройки телефона.
Этот метод возвращает значение “Any?”, т.е. неопределенный тип (аналог в C# - это Object, в Visual Basic - это Variant). Нам необходимо это значение вручную привести к нужному типу поля.
В настройках телефона содержится большой файл, который имеет древовидную структуру словаря ключ и значение.
Чтобы привести к нужному значению, мы используем конструкцию приведения к типу “as”. Причем, мы можем управлять этой конструкцией.
Например, нам надо привести тип “Any?” к типу “String”. Для этого мы используем конструкцию “as!”.
Если же нам надо привести к типу “String?” (nullable тип), тогда мы используем конструкцию “as?”. Зачем мы это делаем.
Настройки телефона разбиваются на разные файлы, для каждого приложения используется свой файл с настройками.
Когда приложения устанавливаются на macOS или iOS платформу, они устанавливаются в виде папки и имеют тип “Bundle”.
Apple довольно кардинально подошла к этому вопросу, она сделала так, что все настройки для каждого приложения хранятся внутри “Bundle” данного приложения. И когда приложение удаляется, удаляется “Bundle” со всеми настройками с диска операционной системы и не остается никаких следов после удаления.
Чего не скажешь о таких платформах, как Windows и Android, которые засоряют все пространство на диске операционной системы вокруг папки, в которую было установлено приложение, и выше. И когда приложение удаляешь, есть риск, что после этого будет необходимо еще и переустановить операционную систему.
Отчасти именно из-за этого подхода техника Apple пользуется такой популярностью и их устройства выигрывают по отказоустойчивости программного обеспечения по сравнению с конкурентами.
Если приложение обновляется, то файл настроек остается старый. Чтобы обновить его, надо выполнить запись в него, тогда старые конструкции удалятся, а новые добавятся. Представим себе ситуацию, сейчас в нашей модели “UserModel” всего 4 поля. Мы сохранили эту модель в файл настроек телефона. Отправили в магазин, пользователи скачали, установили приложение.
Вышла новая версия приложения, в которой мы добавили новое поле в эту модель с именем “userRole” типа “String”.
Разумеется, первая операция, которая будет выполнена как обычно - это запрос данных из настроек телефона, но для поля “userRole” установлено значение “nil” (аналог в C# null) и произойдет ошибка и креш приложения, так как мы не обработали эту ситуацию, а пытаемся через метод “decodeObject” получить значение этого поля и еще и явно привести его к типу “String” через, например, оператор “as!”.
Но в поле “userRole” - значение “nil” и оно не приведется к типу “String” через конструкцию “as!”, но может привестись без ошибок к типу “String?” через “as?”.
Надеюсь, я прояснил понятно, зачем нужна данная проверка. Продолжим.
На 32 строке мы проверяем, доступно ли нам значение поля “_id”. Чтобы проверить, равно ли возвращаемое значение “nil”, можно было бы использовать такую конструкцию: “aDecoder.decodeObject(..) == nil”, но такая конструкция не слишком информативна.
Поэтому мы используем конструкцию “(aDecoder.decodeObject(..) as? String) == nil”. Далее, если данная конструкция возвращает значение “true”, тогда мы через тернарный оператор присваиваем константе “_id” значение по умолчанию пустая строка, иначе присваиваем реальное значение поля “_id” из настроек телефона.
С 33 по 35 строку мы выполняем те же операции проверок для полей “userName”, “userPwd”, “userDesc”.
На 36 строке мы вызываем параметризированный конструктор и инициализируем его аргументы объявленными ранее константами.
На 47 строке объявлен вспомогательный метод “Populate”, который переносит данные из экземпляра “dictionary” типа “NSDictionary” в поля класса “UserModel”. Этот метод мы будем использовать, когда будем создавать запросы к серверу и получать ответы. В ответе содержится словарь типа “NSDictionary”, в котором находятся свойства с теми же именами, что и поля нашего класса.
С 48 по 51 строку мы инициализируем поля класса “UserModel” значениями из экземпляра “dictionary” c теми же проверками, что мы рассматривали выше.
На 53 строке объявлен вспомогательный метод “PopulateArray”, который переносит данные из экземпляра “array” типа “NSArray” в массив объектов типа “UserModel”. Этот метод мы будем использовать, когда в ответе от сервера придет массив JSON объектов типа “User”, чтобы сконвертировать массив типа “[NSDictionary]” в массив типа “[UserModel]”.
На 55 строке мы объявляем пустой массив типа “[UserModel]” c именем “result”.
На 56 строке мы выполняем цикл “foreach” по элементам массива “array”.
На 58 строке мы создаем новый экземпляр типа “UserModel” с именем “newItem”.
На 59 строке мы проверяем, содержит ли элемент массива значение “nil”.
На 60 строке мы вызываем на экземпляре “newItem” метод “Populate”, который перенесет данные из словаря типа “NSDictionary” в поля экземпляра “newItem”.
На 62 строке мы обращаемся к экземпляру “result” и вызываем у него метод “append”, чтобы добавить новый элемент в массив, и добавляем проинициализированный выше экземпляр “newItem”.
На 64 строке мы возвращаем сконвертированный массив типа “[UserModel]” из метода “PopulateArray”.
Откройте модуль “Models / ProductModel.swift”, заполните его в соответствии с содержимым ниже.
В этом модуле мы создаем модель пользователя, в которую будем десериализовывать JSON объект пользователя, полученный от сервера.
В классе “UserModel” мы добавляем поля модели “_id”, “userName”, “userPwd”, “userDesc”, которые декларировали при объявлении схемы базы данных “Mongo DB” на сервере.
На 9 строке мы подключаем пространство имен “Foundation”.
На 11 строке мы объявляем класс с именем “UserModel”, который наследует класс “NSObject”, являющийся базовым классом для всех классов в iOS платформе. Наследуемся от протокола “NSCoding”, данный протокол необходимо реализовать, чтобы объект можно было сохранять в настройках телефона и извлекать оттуда.
Рассмотрим протокол “NSCoding”.
Данный модуль не нуждается в объяснении, поскольку он по образу и подобию такой же, как и модуль “UserModel.swift”, с разницей лишь в том, что он построен на модели “Product” и содержит соответствующие поля.
Итак, модели данных мы создали, теперь мы сможем с уверенностью сохранять результаты ответа от сервера в нормальном виде и потом использовать их при инициализации элементов управления в соответствующих представлениях :)
Теперь приступаем к реализации классов для отправки запросов на сервер и сохранения/загрузки полученных данных в настройки телефона.
Откройте модуль “Services / Services.swift”, заполните его в соответствии с содержимым ниже.
На 11 строке объявлен класс с именем “Services”. Данный класс будет содержать вспомогательные свойства и методы, которые мы будем часто использовать при работе с ответом от сервера.
На 12 строке объявлено статическое свойство “host” типа “String” и мы ограничили его функциональность только одним аксессором доступа “get”. Т.е. значение свойства получить можно, но изменить нельзя. В данном свойстве содержится адрес, по которому доступен сервер.
В прошлом уроке, когда мы делали сервер, мы использовали адрес “http://localhost:3000” , внутри приложения клиента имеется свой “localhost”, именно поэтому мы используем явный IP адрес “127.0.0.1”, чтобы запрос шел именно на сервер, а не внутрь приложения.
На 18 строке объявлен статический метод “ejectJsonArray”, который принимает аргумент “data” типа “NSData?” и возвращает массив типа “NSArray?”. Данный метод конвертирует экземпляр класса “NSData” в экземпляр класса “NSArray”. В экземпляре “data” будет содержаться массив JSON объектов, полученных от сервера.
На 19 строке объявлена переменная “json” типа “NSArray?” и инициализировано значение по умолчанию “nil”.
На 20 строке мы используем конструкцию “do .. try .. catch” (аналог в C# - “try .. catch”). Символ “_” в блоке “catch” на месте аргумента используется потому, что мы не будем использовать этот аргумент в блоке “catch”.
В случае возникновения исключения мы не будем завершать аварийно приложение, а просто вернем значение “nil” по умолчанию, которое будет говорить о том, что конвертация не удалась, поскольку в NSData не содержится JSON объект.
Аналог JSON объекта в Swift - это класс “NSDictionary”.
На 21 строке мы правым операндом обращаемся к классу “JSONSerialization” и вызываем от его экземпляра статический метод “jsonObject”, который первым аргументом принимает данные типа “Data” для конвертации, вторым аргументом принимает опции конвертации.
Метод “jsonObject” возвращает экземпляр типа “Any”. Далее мы приводим это значение к нужному нам типу “NSArray?”, если приведение было проведено не успешно, будет возвращено значение “nil”.
Результат конвертации присваивается объявленной выше переменной “json”. Обратите внимание на ключевое слово “try” перед конструкцией “JSONSerialization.jsonObject(..)”, использование этого ключевого слова является обязательным, так как метод “jsonObject” имеет в своей сигнатуре ключевое слово “throws”, это означает, что данный метод может генерировать исключения и их необходимо обрабатывать.
На 23 строке в случае исключения вызванного методом “jsonObject” возвращается значение “nil”.
На 25 строке в случае успеха операции возвращается экземпляр типа “NSArray?”.
На 28 строке объвлен метод “ejectJsonDictionary” с той же сигнатурой, что и метод “ejectJsonArray”, но с разницей в возвращаемом значении.
В этом методе возвращается экземпляр типа “NSDictionary?”. Метод подразумевает, что в экземпляре “data” типа “NSData?” содержится единичный JSON объект и пытается его сконвертировать в тип “NSDictionary” , являющийся аналогом JSON объектов в Swift. Реализацию метода смысла описывать не вижу, она такая же, как и в методе “ejectJsonArray”.
Реализуем сохранение моделей данных “UserModel” и “ProductModel” в настройки телефона.
Откройте модуль “Services / UserData.swift”, заполните его в соответствии с содержимым ниже.
Модуль большой, поэтому будем разбирать его, разбив на две части по функциональности.
В первой его части будут описаны методы сохранения / извлечения единичного экземпляра типа “UserModel” и экземпляра типа массив “[UserModel]”.
Во второй его части будут описаны вспомогательные методы для обработчиков ошибок ответа от сервера и сохранения данных в настройки телефона.
Данные методы были созданы для того, чтобы не копипастить один и тот же код много раз, а стандартизировать и сделать его повторно используемым.
На 9 строке подключено пространство имен “UIKit”, необходимое для классов “UserDefaults”, “NSKeyedArchiver”, “NSKeyedUnarchiver”. В пространстве имен уже содержится подключенное пространство имен “Foundation”, поэтому нет смысла его тоже подключать для классов “NSArray”, “NSDictionary”, “NSData”.
На 10 строке подключено пространство имен “Alamofire”, необходимое для класса “DataResponse”.
На 12 строке объявлен класс с именем “UserData”.
На 13 строке объявлен метод “saveUserModel”, который принимает аргумент “userModel” типа “UserModel”. Метод будет сохранять поля модели “UserModel” в настройки телефона.
На 14 строке правым операндом мы обращаемся от экземпляра “UserDefaults” к его статическому свойству “standard”, это свойство является источником данных по отношению к файлу настроек телефона и содержит необходимые методы для сохранения / извлечения данных.
На 15 строке правым операндом мы обращаемся к экземпляру “NSKeyedArchiver” и вызываем статический метод “archivedData”. Этот метод принимает один аргумент “withRootObject” типа “Any” и возвращает экземпляр типа “Data”. Метод упаковывает экземпляр типа “UserModel” в экземпляр типа “Data” (аналог NSData) и возвращает его.
На 16 строке мы от экземпляра “userDefaults” вызываем метод “set”, который принимает два аргумента. Первый аргумент “_” типа “Any?” принимает экземпляр, который необходимо сохранить в настройках телефона. Второй аргумент “forKey” типа “String” необходим, чтобы задать название ключа в словаре настроек телефона. По этому ключу будет произведено сохранение экземпляра “UserModel”.
На 17 строке мы обращаемся к экземпляру “userDefaults”, вызываем от него метод “synchronize”. Данный метод выполняет сохранение экземпляра модели “UserModel” в настройки телефона (аналог в C#, например, 'using(StreamWriter sw = File.CreateText(“test.txt”)) { sw.Write(“some text”); sw.Flush(); }', из этого примера метод “Write” аналогичен методу “set”, а метод “Flush” аналогичен методу “synchronize”).
На 20 строке мы объявили статический метод “getUserModel”, который не принимает аргументов и возвращает экземпляр типа “UserModel”. В этом методе мы излекаем модель “UserModel” из файла настроек телефона по ключу, указанному в предыдущем методе при сохранении этой модели.
На 21 строке мы получаем экземпляр источника данных настроек телефона.
На 22 строке мы проверяем, если модель “UserModel” ранее не сохранялась в настройки телефона, тогда необходимо создать пустую модель по умолчанию.
Вызываем на экземпляре “userDefaults” метод “object”, который принимает аргумент “forKey” типа “String” и возвращает значение типа “Any?”. В качестве аргумента мы передаем ключ, под которым сохраняется данная модель в настройках телефона.
Если значение было найдено в словаре, будет возвращен экземпля , который надо будет привести у нужному типу.
Если значение не было найдено, будет возвращено значение “nil”.
На 23 строке мы создаем пустой экземпляр типа “UserModel”.
На 24 строке мы возвращаем этот экземпляр из метода.
На 26 строке код будет выполнен при наличии записи по ключу в словаре. Правым операндом мы обращаемся к экземпляру “userDefaults”, вызываем метод “object” и передаем в аргумент “forKey” ключ, по которому надо извлечь значение. Полученное значение приводим к типу “NSData”.
На 27 строке мы обращаемся к экземпляру “NSKeyedUnarchiver” и вызываем от него статический метод “unarchiveObject”, который принимает аргумент “with” типа “Data” и возвращает значение типа “Any”. Метод конвертирует экземпляр типа “Data” в экземпляр типа “Any”. Возращаемое значение метода мы явно приводим к типу “UserModel”.
На 28 строке мы возвращаем из метода полученный из словаря экземпляр типа “UserModel”.
На 31 строке объявлен метод “saveListOfUsersModel”, который принимает аргумент “listOfUsersModel” типа “[UserModel]” и ничего не возвращает. Метод сохраняет массив “[UserModel]” в файл настроек телефона. Описывать данный метод не имеет смысла, его работа аналогична методу “saveUserModel”.
На 38 строке объявлен метод “getListOfUsersModel”, который не принимает аргументов и возвращает экземпляр типа массив “[UserModel]”. Метод извлекает из настроек телефона массив типа “[UserModel]” по ключу, указанному в методе “saveListOfUsersModel”. Описывать данный метод не имеет смысла, его работа аналогична методу “getUserModel”.
Откройте модуль “ProductData.swift”, заполните его в соответствии с содержимым ниже.
В первой части описано сохранение / извлечение моделей типа “ProductModel”, “[ProductModel]” в настройки телефона. Описывать код не имеет смысла, его работа точно такая же, как и в модуле “UserData.swift”.
Во второй части описаны вспомогательные методы для обработки запросов от сервера и сохранения данных. Описывать код не имеет смысла, его работа точно такая же, как и в модуле “UserData.swift”.
Теперь, наконец то, мы можем реализовать первый класс для работы с сервисом авторизации пользователя и разобрать работу с библиотекой “Alamofire”.
Откройте модуль “Services / AuthorizationService.swift”, заполните его в соответствии с содержимым ниже.
На 12 строке объявлен класс с именем “AuthorizationService”.
На 13 строке объявлен метод “login”, который принимает три аргумента и ничего не возвращает.
Первый аргумент “userName” типа “String” - это имя пользователя (логин).
Второй аргумент “userPwd” типа “String” - это пароль пользователя.
Третий аргумент - это “callback” метод, который принимает аргумент типа “Bool” и ничего не возвращает.
Метод с такой сигнатурой, переданный в третий аргумент, будет вызван по завершению обработки ответа от сервера. В случае наличия ошибок в аргумент этого метода будет передано значение “false”. В случае успешно проведенной операции - значение “true”.
Да, можно было сделать этот аргумент другим типом, например, отдельным классом ошибок, в который можно было сохранять подробно, что за ошибка произошла.
Но это учебный пример, он итак очень большой. Я решил не усложнять этим жизнь ни себе, ни вам :)
На 14 строке правым операндом мы вызываем метод “request” из библиотеки “Alamofire”.
Метод принимает 5 аргументов и возвращает значение типа “DataRequest”.
Данный метод используется для отправки HTTP/HTTPS запросов на сервер.
Первый аргумент “_” типа “URLConvertible” принимает адрес, по которому необходимо отправить запрос. Мы его инициализируем значением “\(Services.host)/auth”, которое после подстановки свойства “host” будет выглядеть вот так: “http://127.0.0.1:3000/auth”.
Второй аргумент “method” типа “HTTPMethod” принимает HTTP глагол. Тип “HTTPMethod” является перечислением и может принимать следующие значения.
Мы инициализируем данный аргумент значением “.post” (это сокращенная запись, полная запись “HTTPMethod.post”)
Третий аргумент “parameters” типа “Parameters?”. Принимает словарь, ключ - значение, мы его заполняем теми же данными, что отправляли в прошлом уроке через утилиту “Postman”. Конкретно, мы передаем значение имени пользователя и его пароль.
Четвертый аргумент “encoding” типа “ParameterEncoding”. Этим параметром задается заголовок запроса “Content-Type”, т.е. указывается тип данных, который будет отправлен на сервер, сами данные задаются в третьем аргументе “parameters”. Мы инициализируем аргумент значением “JSONEncoding.default”, что аналогично записи “application/json”. Тип “ParameterEncoding” является протоколом и имеет следующие реализации себя в классах “URLEncoding”, “JSONEncoding”, “PropertyListEncoding”. Про эти классы вы можете почитать в официальной документации на сайте “Alamofire”.
Пятый аргумент “headers” типа “HTTPHeaders?” имеет значение по умолчанию “nil”, в нашем вызове метода он не используется. Данный аргумент задается, если вы желаете отправить в заголовках запроса на сервер какую- либо информацию, например, “cookie”. Если у вас сервер написан на Web API и вы используете для авторизации OWin , с настройкой надо использовать “cookie” как ключ авторизации пользователя. Тогда при отправке запросов вам будет необходимо заполнять этот аргумент. Пример его заполнения может выглядеть вот так:
Этот пример взят из моего приложения “Smart Payment”, написанного на Swift 2.2 c минимальной версией iOS 8.3 библиотекой “Alamofire” версии 2. Чтобы этот пример работал на Swift 3, надо заменить значение параметра “encoding” на “JSONEncoding.default”. Этот пример не относится к нашему приложению и его переписывать не нужно.
На 16 строке мы вызываем от экземпляра “r” типа “DataRequest” метод “responseJSON”. Этот метод выполняет запрос на сервер и содержит три аргумента.
Первый аргумент “queue” типа “DispatchQueue?” по умолчанию содержит значение “nil”. Используется при переопределении потока выполнения запроса.
Второй аргумент “options” типа “JSONSerialization.ReadingOptions” по умолчанию содержит значение “.allowFragments”. Используется для задания опция отправки запроса. Тип “ReadingOptions” является структурой и имеет такое объявление.
Третий аргумент “completionHandler” типа делегат “@escaping (DataResponse) -> Void”. Данная сигнатура принимает один аргумент типа “DataResponse” и ничего не возвращает. В этом аргументе содержится ответ от сервера. Сам метод вызывается после запроса, когда сервер отправил ответ на клиент.
Обратите внимание, на 16 строке, когда мы вызываем метод “responseJSON”, у нас нет круглых скобок после метода, а идут сразу фигурные скобки, это называется “closure” подход. В фигурных скобках мы объявляем лямбда метод с сигнатурой, соответствующей третьему аргументу метода “responseJSON”.
Запись “response in” означает следующее: “response” - это аргумент лямбда метода, а само тело метода начинается после ключевого слова “in”. Аргумент “response” имеет тип “DataResponse”.
На 17 строке мы проверяем, если ответ пришел с ошибкой, то это означает, что данных нет и пришло пустое значение типа “nil”. Мы обращаемся к экземпляру “response” и вызываем свойство “result” типа “Result” и от свойства “result” вызываем свойство “value” типа “Value?”. Если в свойстве “value” пришло пустое значение, значит запрос не был выполнен, возможно, по причине недоступности сервера или отсутствия подключения к интернету.
На 18 строке мы вызываем “callback” метод “completion” со значением “false”.
На 21 строке, в случае если проблем с подключением к серверу не возникло, мы правым операндом вызываем от экземпляра “Services” метод “ejectJsonDictionary”, который ранее уже подробно рассматривали. В аргумент “data” мы передаем значение свойства “data”, вызванного от экземпляра “response”. Свойство “data” имеет тип “Data?”. Левому операнду “json” присваивается экземпляр “NSDictionary”, в котором содержится JSON объект пользователя, прошедшего авторизацию, который был отправлен сервером на клиент.
На 22 строке мы проверяем, если пришел JSON объект с ошибкой, тогда возвращаем нужный флаг в “callback” методе “completion”. Помним, что в предыдущем уроке мы создавали JSON объект с ошибкой на сервере, в случае если пользователь ввел неверные данные авторизации, JSON выглядел вот так '{ “Error”: “Authorization error”}'.
У словаря “json” есть возможность получить все ключи, для этого надо вызвать свойство “allKeys”, которое имеет тип “[Any]”. Но, поскольку выполнить поиск строки в массиве объектов нельзя, мы оборачиваем массив объектов в массив типа “Array” и явно приводим его к нужному нам типу массива “[String]”. Мы это делаем, поскольку знаем наверняка, что ключи JSON объекта имеют тип “String”. Затем от полученного экземпляра типа “[String]” мы вызываем метод “contains”, в аргумент которого передает название свойства JSON объекта ошибки, значение “Error”. Если такой JSON объект пришел в ответе, значит пользователь ввел неправильные логин или пароль, или ввел несуществующего пользователя.
На 23 строке мы вызываем “callback” метод “completion” с аргументом “false”.
На 25 строке мы создаем пустой экземпляр “userModel” типа “UserModel”.
На 26 строке мы вызываем на экземпляре “userModel” метод “Populate” в аргумент “dictionary”, передаем экземпляр “json”. Метод “Populate” перенесет данные из экземпляра “json” типа “NSDictionary” в поля экземпляра “userModel”.
На 27 строке мы обращаемся к экземпляру “UserData” и вызываем статический метод “saveUserModel”, чтобы сохранить данные экземпляра “userModel” в настройки телефона. В аргумент “userModel” мы передаем экземпляр “userModel”.
На 28 строке мы вызываем “callback” метод “completion” и передаем в него результат операции “true”.
Позже в контроллере, где мы будем вызывать метод “login”, будет передан “callback” метод “completion”, объявленный в этом контроллере. Тем самым решается проблема ожидания ответа от сервера в контроллере, так как есть “callback” метод. Внутри этого метода мы проверим результат операции и затем обратимся к экземпляру “UserData” и вызовем метод “getUserModel”, который вернет нам экземпляр “UserModel”, с которым мы сможем работать на стороне контроллера.
Откройте модуль “Services / UserService.swift”, заполните его, как показано ниже.
На 12 строке объявлен класс “UserService”.
На 13 строке объявлен метод “get”, который принимает два аргумента и ничего не возвращает.
Первый аргумент “id” типа “String?” принимает идентификатор пользователя “_id”. Если передать в аргумент значение “nil”, будет возвращен весь список пользователей, если передать конкретный идентификатор, будет возвращен конкретный пользователь.
Второй аргумент “completion” типа делегат “(Bool) -> Void” используется для получения сигнала, что ответ был получен и основные операции были выполнены.
На 29 строке объявлен метод “create”, который принимает 4 аргумента и ничего не возвращает. Метод отправляет запрос на создание пользователя на сервер.
Первые три аргумента “userName”, “userPwd”, “userDesc” имеют тип “String” и содержат данные пользователя. Идентификатор пользователя в операции создания не нужен. Так как идентификатор пользователю присваивается на стороне сервера и данный метод выполняет как раз эту операцию.
Четвертый аргумент “completion” типа делегат “(Bool) -> Void” используется для получения сигнала, что ответ был получен и основные операции были выполнены.
На 37 строке объявлен метод “update”, который принимает 5 аргументов и ничего не возвращает. Данный метод отправляет запрос на обновление данных пользователя на сервер.
Первые 4 аргумента “id”, “userName”, “userPwd”, “userDesc” имеют тип “String” и содержат данные пользователя.
Пятый аргумент “completion” типа делегат “(Bool) -> Void” используется для получения сигнала, что ответ был получен и основные операции были выполнены.
На 45 строке мы объявляем метод “delete”, который принимает два аргумента. Этот метод отправляет запрос на удаление пользователя на сервер.
Первый аргумент “id” типа “String?” принимает идентификатор пользователя “_id”.
Второй аргумент “completion” типа делегат “(Bool) -> Void”, используется для получения сигнала, что ответ был получен и основные операции были выполнены.
Откройте модуль “Services / ProductService.swift”, заполните его, как показано ниже
На 12 строке объявлен класс “ProductService”.
На 13 строке объявлен метод “get”, который принимает два аргумента и ничего не возвращает.
Первый аргумент “id” типа “String?” принимает идентификатор товара “_id”. Если передать в аргумент значение “nil”, будет возвращен весь список товаров, если передать конкретный идентификатор, будет возвращен конкретный товар.
Второй аргумент “completion” типа делегат “(Bool) -> Void” используется для получения сигнала, что ответ был получен и основные операции были выполнены.
На 29 строке объявлен метод “create”, который принимает 4 аргумента и ничего не возвращает. Метод отправляет запрос на создание товара на сервер.
Первые три аргумента “productImage”, “productName”, “productDescription” имеют тип “String” и содержат данные товара. Идентификатор товара в операции создания не нужен. Так как идентификатор товару присваивается на стороне сервера и данный метод выполняет как раз эту операцию.
Четвертый аргумент “completion” типа делегат “(Bool) -> Void” используется для получения сигнала, что ответ был получен и основные операции были выполнены.
На 37 строке объявлен метод “update”, который принимает 5 аргументов и ничего не возвращает. Данный метод отправляет запрос на обновление данных товара на сервер.
Первые 4 аргумента “id”, “productImage”, “productName”, “productDescription” имеют тип “String” и содержат данные пользователя.
Пятый аргумент “completion” типа делегат “(Bool) -> Void” используется для получения сигнала, что ответ был получен и основные операции были выполнены.
На 45 строке мы объявляем метод “delete”, который принимает два аргумента. Этот метод отправляет запрос на удаление товара на сервер.
Первый аргумент “id” типа “String?” принимает идентификатор товара “_id”.
Второй аргумент “completion” типа делегат “(Bool) -> Void” используется для получения сигнала, что ответ был получен и основные операции были выполнены.
Заметьте, адреса запросов, используемых нами при отправке на сервер, совпадают с теми, что мы использовали в прошлом уроке в утилите “Postman”.
На этом урок завершен.
На следующем уроке мы продолжим разработку клиента, создадим контроллеры и представления для редактирования пользователей, подключим работу сервисов к странице входа в систему, создадим форму регистрации пользователя.
Упаковка та розпакування в .NET
Автор: Редакция ITVDN
Мы уже знаем особенности работы с памятью и доступные структуры данных в .NET приложениях, в этом посте мы разберем упаковку и распаковку, а также рассмотрим, как эти две операции влияют на производительность приложения.
Что такое упаковка и распаковка?
Зачем нам задумываться об упаковке и распаковке? Разве это не обязанность .NET-среды, которая следит за управлением данных и, соответственно, сама "выбирает" наиболее оптимальный способ их хранения?
На самом деле - нет. Что очень важно знать и понимать - так это механизм перемещения данных из области стека в кучу - и наоборот.
Помните:
Когда любой значимый тип присваивается к ссылочному типу данных, значение перемещается из области стека в кучу. Эта операция называется упаковкой.
Когда любой ссылочный тип присваивается к значимому типу данных, значение перемещается из области кучи в стек. Это называется распаковкой.
К примеру, здесь мы имеем следующий пример упаковки:
А вот состояние памяти в момент произведения операции:
Чтобы сохранить значение "123" в виде объекта, в куче создается "упаковка", куда впоследствии и перемещаются данные.
Когда же производится распаковка:
Вот что происходит с памятью:
Значение "123" было изъято из упаковки и помещено назад в область стека.
Заметьте, что когда тип данных i упаковывается внутри объекта o, в стеке хранится лишь ссылка, в то время как само значение хранится в куче. Как только производиться распаковка, данные в куче обязаны быть скопированы в стек (переменная j). В обоих случаях наша цель - это работать с тем самым значением (123).
Как вы можете себе представить, сии операции могут быть достаточно ресурсоемкими.
Давайте рассмотрим IL
Когда мы производим подобный анализ производительности, часто бывает полезно заглянуть непосредственно в Intermediate Language (IL).
Мы еще не рассматривали эту концепцию, но, как вы наверняка знаете, когда мы производим компиляцию в DLL или EXE, выходной файл на самом деле содержит IL - промежуточный код, который в последствии исполняется JIT и впоследствии - виртуальной машиной. Среда выполнения .NET обязана как-то знать, нужно ли упаковывать или распаковывать определенные переменные. Поэтому для обозначения этих операций также требуются дополнительные затраты памяти.
Давайте создадим несложное .NET консольное приложение:
Теперь скомпилируем приложение и при помощи утилитки ILSpy посмотрим его код внутри EXE.
Как только EXE-файл будет открыт в ILSpy, пронавигируемся к методу Main, выбрав "IL with C#".
Заметьте, что операция box выполняется только после присвоение ссылочному типу значения значимого. И наоборот: unbox.any - только после попытки присвоить ссылочному типу данных значимой переменной.
Это де-факто способ, которым операции упаковки и распаковки представлены в IL.
Когда стоит производить упаковку и распаковку?
Код в примере выше скорее всего вам покажется наивным, и вы можете подумать: "Эй, что за вздор! Я никогда не буду такого делать". Что же, в большинстве случаев это действительно так. Но данные в нашем приложении часто упаковываются и распаковываются, когда мы об этом даже не догадываемся.
Гетерогенные коллекции
К примеру, старая школа до сих пор может похвастаться ArrayList.
Метод добавления элемента здесь, как можно отметить, принимает object-параметр.
Таким образом, и здесь производится наша излюбленная упаковка.
Впрочем, подобное кануло в лету с приходом обобщений и обобщенных коллекций.
Конкатенация строк
Другой интересный пример в виде конкатенации строк.
Эта операция требует наличия метода String.Concat, который принимает два object-параметра.
Дабы избежать подобных ситуаций, нам достаточно просто немного изменить код, используя на переменной типа int метод ToString (и здесь стоит проигнорировать сообщение ReSharper о том, что операция бессмысленна:) ).
И все! Никакой упаковки больше нет.
Вообще, это далеко не единичные примеры для демонстрации. Но цель нашей статьи - донести четкое представление о том, что такое упаковка и распаковка и когда они применяются.
Производительность
Как мы уже говорили, упаковка и распаковка требуют определенных затрат производительности. В случае с конкатенацией строк, выигрыш от применения ToString весьма незначителен. Именно потому, как я упомянул выше, даже ReSharper не советовал нам делать подобное:
В этом случае гораздо лучше сохранить читабельность кода без ToString.
Целесообразность оптимизации появляется, как правило, тогда, когда операции упаковки и распаковки предстоит производить в цикле сотни и тысячи раз. В этом случае время выполнения кода с упаковкой может составлять порядка 150 процентов от времени исполнения кода без нее (вы можете сами создать тестовое приложение и сравнить требуемый промежуток времени).
Упакованные значения могут также требовать больше памяти, чем значения в стеке. Копирование значений в/из стека также требует своих затрат. Согласно MSDN, упаковка может занимать порядка 20 раз больше времени, нежели простое присвоение. В то время как распаковка примерно в 4 раза медленней простого присвоения.
Итак... зачем же тогда вообще нужно использовать упаковку и распаковку?
Несмотря на все недостатки в плане падения производительности .NET -приложения, концепции упаковки и распаковки были внедрены в .NET не просто так. И вот причины:
.NET-стандарт обладает общей системой типов, что позволяет представлять и ссылочные. и значимые типы схожим образом - и все это благодаря упаковке.
Коллекции можно было использовать для хранения значимых типов до появления обобщений.
Упрощения кода, вроде конкатенации строк и так далее.
Упаковка и распаковка настолько распространены, что мы не может избежать их полностью. Мы должны знать принцип их работы, чтобы минимизировать их использование, но к этому нужно подходить разумно. Не тратьте свое время на постоянную оптимизацию кода, частую проверку через IL, чтобы убедиться, дабы ни одна лишняя операция упаковки не была использована. Помните, что чистота и простота чтения кода иногда значительно более важна, нежели незаметное, мельчайшее ускорение работы программы.
Подведем итоги
В сегодняшнем уроке мы рассмотрели, что такое упаковка и распаковка, как она представлена в IL-коде, и какое влияние на производительность они имеют. Искренне надеюсь, моя статья сумела прояснить некоторые общие концепции, хотя бы чуть-чуть. :)
В грядущих статьях мы рассмотрим механизм сборки мусора. Если у вас есть идеи или пожелания касательно материала новых статьей - милости просим в комментарии!
Автор перевода: Евгений Лукашук
Источник
Паралакс для 2D гри без нервів та милиць
Автор: Дар'я Коновалова
Недавно в моей жизни начинающего разработчика игр появилась задача - сделать фон в игре, но не просто уныленький статичный бэкграунд, а параллакс. Да, эта чудо-красота применима не только в разработке сайтов, но и при создании игр. Попытка вдохновиться в гугле практически ничем не закончилась. Пришлось справляться с задачей собственными силами.
У меня получилось. Хочу поделиться с вами опытом.
Справедливо замечу, что параллакс — это не достояние веба. Еще в дремучие времена существования 8-битных игр параллакс успешно применялся для создания иллюзии объема в двухмерной игре. Коротко говоря, параллакс — это наслоение изображений, каждый слой движется со своей скоростью. Ближайший к игроку имеет самую высокую скорость, соответственно дальний (последний) — самую низкую.
Ну что, вроде, минимально в теории разобрались и даже нашли, откуда ноги растут, значит, мы готовы перейти непосредственно к практике и сотворить это чудо своими руками.
Что вам потребуется:
базовые знания Unity3D 5 (на уровне создания скриптов, добавления компонентов);
понимание С#;
3 или больше картинок в формате .png;
внимательность и желание.
Ладно, последнее не очень обязательно =)
По ссылке вы можете скачать необходимые изображения, а также уже готовый проект.
Подготовка
Запускаем Unity3D, создаем новый проект, называем его, например, Parallax2D.
Закидываем в папку Assets наши бэкграунды. Рекомендую сложить их в отдельную папку. В моем случае они лежат в Assets – StarSky.
Каждое изображение называем удобно и понятно. Я назвала их по порядку размещения (Background – задний фон, MiddleBackground – средний, TopBackground – верхний слой).
Для того, чтобы картинка перемещалась гладко, нам необходимо настроить ее в Inspector. Обратите внимание, этот этап очень важен, иначе все размажет, как звезды за иллюминатором Энтерпрайза на 3-й космической скорости.
В поле Texture Type выбираем тип Texture, во Wrap Mode отмечаем Repeat. И радостно тыкаем Apply. Без этого действия изменения не сохранятся, а потом можно долго недоумевать, почему же оно не работает. Совершаем эти телодвижения и для 2-х остальных текстур.
Подготовив картинки, переходим к этапу размещения их на сцене. Часто в этих ваших интерентах можно встретить совет - размещать их с помощью GameObject – Plane. Вы, конечно, можете потрудиться и заставить 3D объект нормально функционировать в 2D игре. Но, на самом деле, это все будет уныло, как последний эпизод «Звездных войн», а работать это чудовище будет чуть более быстро, чем аж никак. Поэтому я рекомендую долго не мучиться и использовать элемент UI – Canvas.
Canvas меняет размер фона автоматически, подстраивает его под размеры экрана гаджета, на котором запускают игру. Это избавляет нас от потребности писать скрипт, который будет отвечать за отслеживание размеров экрана и изменения размера фона.
В Hierarchy выбираем UI – Canvas. Собственно, если работать с Юнькой для вас не впервой, то вы явно знаете еще много других способов, как добавить в Hierarchy объект. Так что делайте это любым удобным способом.
Создав Canvas, добавляем чайлдами («внутрь» канвы) три Panel для 3-х наших фонов.
После добавления наша Hierarchy выглядит так:
Переименовываем Canvas и Panel, чтобы у всех были свои пароли и явки.
А теперь засучиваем рукава и беремся препарировать — подготавливать каждый компонент в Inspector.
Начнем с ParallaxBackground.
Изменяем Layer на Ignore Raycast, чтобы наш фон не реагировал на касания пальцами. Unity обязательно спросит, применить ли эти изменения ко всем «детям» — соглашаемся.
Далее переходим к компоненту Canvas.
Находим Render Mode, выбираем Screen Space – Camera. В Render Camera добавляем нашу текущую дефолтную камеру (Main Camera(Camera)).
Plane Distance ставим пока 110, но этот показатель проще отстроить во время теста. По факту — это расстояние от камеры до нашей канвы. То есть, изменяя его, мы будем получать разную глубину изображения.
Остальное не трогаем и переходим к Back.
В Rect Transform привязываем позицию к левому краю. Теперь наш фон будет всегда отстраиваться по одному краю, и мы избежим проблем с правильной позицией на разных устройствах.
Удаляем компонент Image (Script), вместо него добавляем Raw Image (Script) (напомню, Add Component – UI – Raw Image (Scriot)). В Texture добавляем картинку нашего самого последнего слоя.
Те же операции проделываем и для остальных слоев. Можно сделать немного проще, наколдовать изменения в первой Panel, дублировать (Ctrl + D), поставить в каждую свою текстуру, переименовать. Тут уже зависит от того, как вам будет удобнее.
Запускаем сцену — любуемся. Три картинки прекрасно легли друг на друга.
Немного черной магии
Теперь весь смак. Мы с вами напишем скрипт, который заставит наши картинки двигаться. Создаем новый скрипт, напомню, пишем на C#, назовем его BackgroundHelper. Он у нас будет один, поэтому нет смысла делать отдельную папку, кидаем его прямо в основную Assets. Открываем созданный скрипт и понеслась тяжкая работа на 5 строчек:
using UnityEngine;
using UnityEngine.UI; // обязательно добавляем библиотеку пользовательского интерфейса, без нее кино не будет
using System.Collections;
public class BackgroundHelper : MonoBehaviour {
public float speed = 0; //эта публичная переменная отобразится в инспекторе, там же мы ее можем и менять. Это очень удобно, чтобы настроить скорость разным слоям картинки
float pos = 0; //переменная для позиции картинки
private RawImage image; //создаем объект нашей картинки
void Start () {
image = GetComponent<RawImage>();//в старте получаем ссылку на картинку
}
void Update () {
//в апдейте прописываем как, с какой скоростью и куда мы будем двигать нашу картинку
pos += speed;
if (pos > 1.0F)
pos -= 1.0F;
image.uvRect = new Rect(pos, 0, 1, 1);
}
}
Сохраняем скрипт и добавляем его, как компонент к каждому слою.
Скорости у меня такие:
Back 0.0001
Middle 0.00015
Top 0.00024
Наслаждаемся успешной работой
Если все было сделано правильно, мы получим умопомрачительный эффект, от которого просто невозможно оторвать глаз.
У вас остались вопросы или возникли трудности? Пишите в комментариях.