Результати пошуку за запитом: начальный курс c
Алгоритми та структури даних 2014
Автор: Олександр Петрик
Відео курс "Алгоритми та структури даних" призначений для розробників, які володіють мовою С# на рівні вище середнього та бажають зрозуміти, як писати ефективний та зрозумілий код. Пройшовши цей курс, ви отримаєте досвід роботи з великими масивами програмного коду, навчитеся комбінувати прості конструкції для побудови складних алгоритмів.
Каким должен быть успешный QA в 2026 году?
Автор: Редакция ITVDN
Рынок тестирования программного обеспечения окончательно перестал быть «легким входом в IT». В 2026 году пропасть между рядовым тестировщиком и настоящим QA-инженером стала глубокой как никогда. Базируясь на опыте Олексы Мащица, мы выделили ключевые векторы развития, которые определяют успех в профессии сегодня.
Олекса Мащиць — QA-инженер с 13+ годами опыта. Специализация — крупные Enterprise-проекты со сложной бизнес-логикой. Основатель сообщества «QA Украина» и автор образовательных программ. Олекса также является организатором крупнейшей в Украине онлайн-конференции тестировщиков «Бетльгейзе».
1. Кризис «поверхностного тестирования» и возвращение к истокам
Время, когда достаточно было быть просто «адвокатом пользователя» и проверять только интерфейс, прошло. Сегодня компаниям нужны люди, которые понимают архитектуру системы.
«Сейчас многие специалисты, пока работают в компании, кажутся востребованными. Но как только выходят на рынок — оказывается, что они застряли в старых процессах.
Требования рынка растут, точнее — становится все меньше вакансий с низкими требованиями. Раньше был образ тестировщика "адвоката пользователя", который не очень технический. Сейчас все смещается в сторону того, что вас будут ценить, чем больше вы технический специалист. Даже без опыта: если вы выпускник Computer Science — вас заберут сразу на хорошие деньги.
Чем больше вы приближаетесь к уровню инженера со знаниями фундаментальных наук, тем больше вас хотят».
Фундаментальные знания (работа сетей, баз данных, памяти компьютера) делают «черный ящик» продукта прозрачным. Это позволяет видеть тестовые области, которые закрыты для тех, кто не имеет технической базы.
2. От симптомов к причинам: Работа с Root Cause
Успешный QA в 2026 году — это детектив, который не просто фиксирует ошибку, а пытается найти ее корень. Это критично для сложных Enterprise-проектов, где каждая минута разработчика стоит дорого.
«Разработчикам было бы классно, чтобы мы приближались к причине... Если мы выдаем четыре разных бага за один, разработчик отвлекается каждый раз, открывает их и приходит к выводу, что это одна и та же причина. Это отрывает нас от разработчиков, они говорят: "Он вообще ничего не шарит"».
Если вы находите несколько багов в одной тестовой области, не спешите создавать десяток отчетов. Проанализируйте их — возможно, это разные проявления одной архитектурной ошибки.
3. Ловушка искусственного интеллекта для новичков
AI стал стандартом индустрии, но важно не допускать чрезмерного увлечения инструментами без понимания сути процесса. Для начинающего AI может стать не помощником, а препятствием для профессионального роста, создавая иллюзию знаний.
«Использование языковой модели должно стать для вас рутиной. Но внимательно: не может быть рутиной то, чего вы не знаете... Если вы не писали тест-кейсы и не знаете, как они создаются, как вы можете проверить то, что выдал ChatGPT?»
В 2026 году ценится не умение писать промпты, а способность брать на себя ответственность за покрытие и качество, которую ни одна языковая модель гарантировать не может.
4. Майндсет и софт-скиллы: Рабочая этика вместо «токсичности»
Обсуждение софт-скиллов часто становится слишком размытым. Вместо этого стоит фокусироваться на конкретных принципах взаимодействия и этике профессионального поведения.
«Я к софт-скиллам отношусь критично... Их сделали вульгарными и начали использовать как палку: "Ты некритично мыслишь, у тебя нет софт-скиллов". Я отдельно выделяю рабочую этику: как мы общаемся, с уважением ли, понимаем ли мы эмпатию не как инструкцию, а как реакцию на человека».
Софт-скиллы субъективны. Успех заключается в том, чтобы интегрироваться в культуру конкретной команды. Кто-то ищет сосредоточенных одиночек для глубоких технических задач, а кто-то — активных коммуникаторов для живого Scrum.
5. Образовательный путь: Как не «законсервироваться»?
Комфорт и высокая зарплата на начальных этапах могут стать ловушкой, которая останавливает развитие специалиста на годы.
«Первые шесть лет я должен был бы лучше развиться, но я там "законсервировался", потому что мне было комфортно по деньгам... Не бойтесь учиться. Если вы чувствуете, что проект простой и вы не растете — это риск».
Рекомендации для профессионального роста:
Учебники по информатике: Для понимания фундаментальных принципов обработки данных и архитектуры ПК.
Основы программирования: Без понимания функций, переменных и операций невозможно профессионально тестировать современный сложный софт.
"Практическое руководство по дизайну тестов" Ли Коупленда. Классика тест-дизайна. «Если этот код в начале книги вам страшен — значит, вам не хватает фундаментальных знаний».
Формула успеха
Для тех, кто хочет не просто «войти в IT», а стать востребованным инженером, существует простая формула:
«Найдите в себе хотя бы 10-20% любви к профессии. Вы не можете с нулем любви развиваться. Если вы действительно что-то любите, вы начинаете автоматически притягивать информацию. И будьте готовы инвестировать время: минимум 2 часа в день ежедневно в течение года — это порог для формирования эксперта».
В 2026 году выиграет тот, кто имеет прочный инженерный фундамент и не боится признавать свои пробелы в знаниях, постоянно их заполняя.
Материал подготовлен на основе вебинара «Успешный QA-инженер 2026: Ключевые навыки и требования к тестировщикам ПО».
RxJS: розбір Subject`ів
Автор: Nicholas Jamieson
Я был свидетелем многих вопросов, связанных с Subject`ами на Stack Overflow. Недавно я увидел одного разработчика, который интересовался, как, собственно говоря, работает AsyncSubject. Вопрос заставил меня написать эту статью, чтобы показать, почему необходимо использовать различные типы Subject`ов и как их использовать.
Когда мы используем Subject`ы?
В своей статье Бен Леш утверждал, что:
… [мультикастинг] является основной причиной использования Subject`ов в RxJS.
Что касательно мультикастинга, мы рассмотрим его более подробно немного позже. Сейчас же нам достаточно знать, что он позволяет принимать оповещения от одной «наблюдаемости» и отправлять их другим «наблюдателям».
Подобная связь «наблюдаемости» с «наблюдаемыми» и есть сутью Subject`ов. Причина этого заключается в том, что де-факто Subject`ы являются одновременно «наблюдаемостью» и «наблюдателями».
Как они могут быть использованы?
В качестве примера давайте рассмотрим компонент Angular awesome-component. Наш компонент выполняет определенную работу и содержит в себе внутреннюю «наблюдаемость», что производит определенное значение при работе с ней пользователя.
Чтобы позволить родительским компонентам получить доступ к «наблюдаемости», awesome-component принимает «наблюдателя», что вводит свойство и что подписывается, в свою очередь, на «наблюдаемость». Это значит, что отныне родитель может соединиться с «наблюдаемостью» при помощи спецификации «наблюдателя» - что-то наподобие этого:
Так как теперь «наблюдатель» «обвязан», родитель соединен и получает значения от awesome-component. Впрочем по сути это то же самое, как если бы awesome-component производил значения через подписанные события. Так почему же мы здесь не используем события?
Дело в том, что «наблюдаемостями» проще управлять. К примеру, чтобы добавить фильтры, нам необходимо использовать лишь несколько операторов. Но немаловажный нюанс: родительский компонент имеет «наблюдателя» – не «наблюдаемость», так как в таком случае мы можем применять операторы?
Subject`ы - это одновременно и «наблюдаемости», и «наблюдатели», поэтому, когда мы создаем Subject, он может быть использован по отношению к awesome-component в качестве «наблюдателя» или работать с компонентом как с «наблюдаемостью». Что-то наподобие этого:
Subject соединяет «наблюдателя» по принципу «делай-все-что-хочешь-со-значением» с «наблюдаемостью» в виде awesome-component. Но здесь применяется набор операторов родителей компонента.
Композиция различных «наблюдаемостей»
При помощи Subject`а для композиции «наблюдаемости» awesome-component может быть использован в разных целях разными компонентами. К примеру, другой компонент может быть заинтересован только в последнем сгенерированном значении. Для этого нужно использовать last-оператор:
Что интересно, это не единственный способ получения последнего значения: мы просто можем использовать другой Subject. К примеру, при помощи AsyncSubject код будет выглядеть следующим образом, так как он производит только последнее полученное значение:
Но, если использование AsyncSubject равнозначно композиции «наблюдаемости» при помощи использования Subject и last-оператора, зачем усложнять RxJS лишним классом?
Ну, в основном потому что Subject`ты предназначены для мультикастинга.
В данном случае два способа эквивалентны, потому что здесь есть только один подписчик. В ситуации с применением мультикастинга здесь было бы несколько подписчиков и применять оператор last здесь было бы нецелесообразно.
Теперь же давайте рассмотрим мультикастинг более детально.
Как Subject`ы используются непосредственно в RxJS?
Ядро инфраструктуры мультикастинга RxJS исполняется при помощи оператора multicast. Multicast вообще применяется к ключевым «наблюдаемостям», принимает Subject и возвращает полученную из Subject`а «наблюдаемость».
Оператор multicast чем-то похож на awesome-component. Мы можем принимать «наблюдаемость», чье поведение зависит от принимаемого Subject`а.
Ситуации, когда базовый Subject передается multicast:
Подписчики мультикаст-«наблюдаемости» принимают оповещения типа next, error, complete.
«Поздние» подписчики , другими словами, те, которые подписались после оповещений error, complete, – так же в свою очередь принимают эти оповещения.
Важно отметить, что пока мультикастинг не передал factory, «поздние» подписчики не работают с другими подписками на источник.
Чтоы произвести композицию по отношению к мультикаст-«наблюдаемости», что передает последнее оповещение next ко всем подписчикам, недостаточно просто применить last-оператор к «наблюдаемости», созданной при помощи Subject. «Поздние» подписчики подобной «наблюдаемости» не получат последнее next-оповещение. Они получат только complete.
Специально для этого оповещения должны храниться в состоянии Subject`а. Именно это делает класс AsyncSubject и именно для этого мы используем AsyncSubject в подобной ситуации.
Что касательно других классов Subject`ов?
Существует двое других вариантов Subject`ов: BehaviorSubject и ReplaySubject.
Чтобы понимать BehaviorSubject лучше, давайте рассмотрим пример:
Здесь родительский компонент соединяется с awesome-component при помощи Subject и применяет оператор startWith. Этот оператор обеспечивает надежный прием значения “awesome” вместе со значениями, сгенерированными awesome-component – в случае, конечно, если они таки были сгенерированы.
Подобно тому, как AsyncSubject используется вместо обычного Subject`а и оператора last, BehaviorSubject может заменить собой оператора startWith и Subject`а – так как его конструктор принимает значение, которое было бы в противном случае направлено к startWith.
В случае с использованием BehaviorSubject все подписчики получат начальное значение. Это возможно потому, что BehaviorSubject хранит значение переменной в своем состоянии.
По той причине, что концепция «переигрывания» уже полученных оповещений внедрена в мульти-подписку, аналогии с единым подписчиком для ReplaySubject просто не существует. Так же, как и BehaviorSubject, переменные хранятся в состоянии Subject`а.
Итак, как мы используем эти Subject`ы?
Мы увидели, какие бывают Subject`ы и для чего они используются. Но как они должны быть использованы? Что ж, как бы это ни было парадоксально, но класс Subject – это тот класс, который вам, вероятно, никогда не придётся использовать.
Subject работает прекрасно при связывании «наблюдателя» с «наблюдаемостью». Но для ситуаций с мультикастингом существуют альтернативы.
RxJS содержит операторы мультикастинга, которые используют различные Subject – классы, причем точно так же, как я могу использовать генераторы «наблюдаемостей» RxJS (fromEvent) над вызовами Observable.create. Но для ситуаций с мультикастингом я все же предпочитаю использовать следующие операторы:
Publish или share могут быть использованы вместо Subject;
publishBehavior может быть использован вместо BehaviorSubject;
publishLast может быть использован вместо AsyncSubject;
publicReplay или shareReplay могут быть использованы вместо ReplaySubject.
Автор перевода: Евгений Лукашук
Источник
Як я побудував проект на Django, Django REST Framework, Angular 1.1.x та Webpack
Автор: Редакція ITVDN
Моя идея состояла в том, чтобы построить простой репликабельный проект на Angular с бэкэндом на Django. Я искал и не смог найти нужных решений, пришлось во всем разбираться самому. В итоге я разобрался и решил сам написать гайд для всех, кого может заинтересовать данная проблема.
Данная статья поможет вам построить простое приложение Angular с бэкэндом на Django, организованного с помощью Webpack.
Проблема
Я хочу настроить проект на Angular 1.1.x и скормить ему данные с сервера Django. Мне бы хотелось использовать Django REST Framework (DRF), чтобы пострить RESTful API. Я также хочу сбандлить JS ассеты. Сейчас я собираюсь запустить сайт на одном сервере.
Предварительные требования
Python 2.x
Django 1.9.x
npm 2.15.8+
Webpack 1.13.x (sudo npm i -g webpack)
ESLint 2.13.1+ (sudo npm i -g eslint)
NodeJS 4.4.7+
Содержание
Скаффолдинг проекта. Создайте свои начальные директории.
Скаффолдинг проекта на Django.
Настрока переменных среды, нужных для запуска сервера Django.
Установка Django REST Framework и настройка Django с использованием переменных среды.
Создание API.
Запуск Django сервера с использованием dev settings.
Инициализация npm-пакета и установка front-end JS зависимостей.
Создание Angular entry-point и загрузка начальных зависимостей.
Настройка Webpack'а.
Дайте команду Django загрузить приложение.
Создайте шаблон базы приложения Angular.
Напишите компонент home.
Напишите Angular роуты, ведущие к вашему компоненту home и странице 404.
Добавьте директивы ангуляр-маршрутизатора к шаблону входной точки приложения.
Проверьте ваше REST API в приложении Angular. Шпаргалка.
Итак, начнем!
0. Настройте среду для Python.
mkvirtualenv mysite
1. Скаффолдинг проекта на Django. Создайте начальные директории.
Мы хотим сфокусироваться на модулярности в ходе разработки. Следовательно, существует множество директорий в конечном итоге использования. Мы хотим, чтобы наше дерево изначально выглядело так:
mysite
├── backend
│ ├── docs
│ ├── requirements
└── frontend
├── app
│ ├── components
│ └── shared
├── assets
│ ├── css
│ ├── img
│ ├── js
│ └── libs
├── config
├── dist
└── js
Сделайте следующее:
mkdir mysite && cd mysite
mkdir -p backend/docs/ backend/requirements/ \
frontend/app/shared/ \
frontend/app/components/ \
frontend/config \
frontend/assets/img/ frontend/assets/css/ \
frontend/assets/js/ frontend/assets/libs/ \
frontend/dist/js/
*Примечание: Структура этого проекта была навеяна опытом с несколькими другими проектами. Я считаю эту организацию идеальной, но вам не обязательно ей следовать. Но, пока вы читаете этот гайд, вы должны придерживаться этой структуры.
2. Скаффолдинг проекта на Django.
В директории backend/ создайте Django проект:
python django-admin.py startproject mysite
Также создайте requirements.txt:
pip freeze > requirements/requirements.txt
В директории (вашего проекта) backend/mysite/ произведите скаффолдинг директории, той, где будет жить ваше API:
mkdir -p applications/api/v1/
touch applications/__init__.py applications/api/__init__.py \
applications/api/v1/__init__.py applications/api/v1/routes.py \
applications/api/v1/serializers.py applications/api/v1/viewsets.py
Теперь создайте структуру директории настроек:
mkdir -p configlord/settings/
touch configlord/settings/__init__.py \
configlord/settings/base.py configlord/settings/dev.py configlord/settings/prod.py \
configlord/dev.env configlord/prod.en
3. Настройте переменные окружения, которые нужны для запуска сервера Django.
На этом этапе я предпочитаю пользоваться django-environ для работы с переменными окружения. Существует множество способов сделать это, но пакет django-environ чрезвычайно упрощает этот процесс, поэтому я использую его во всех своих проектах.
Установите django-environ:
pip install django-environ
В mysite/dev.env добавьте следующее:
DATABASE_URL=sqlite:///mysite.db
DEBUG=True
FRONTEND_ROOT=path/to/mysite/frontend/
SECRET_KEY=_some_secret_key
Мы собираемся использовать эти переменные среды в наших настройках. Выгода от использования наших переменных окружения в отдельных файлах состоит в основном в том, что такая настройка позволяет облегчить переключение между средами. В нашем случае файл the dev.env является списком переменных, которые мы бы использовали в локальной среде разработки.
*Примечание: SECRET_KEY можно взять из settings.py, который был сгенерирован django-admin.py startproject.
4. Установите Django REST Framework и настройте Django, используя переменные среды.
Установка DRF:
pip install djangorestframework
Наполните settings/base.py следующим:
Укажите, где искать переменные окружения.
import environ
project_root = environ.Path(__file__) - 3
env = environ.Env(DEBUG=(bool, False),)
CURRENT_ENV = 'dev' # 'dev' is the default environment
# read the .env file associated with the settings that're loaded
env.read_env('./mysite/{}.env'.format(CURRENT_ENV))
Установите базу данных. В данном случае мы собираемся использовать встроенные в django-environ настройки SQLite.
DATABASES = {
'default': env.db()
}
Установите SECRET_KEY ,а также debug.
SECRET_KEY = env('SECRET_KEY')
DEBUG = env('DEBUG')
Добавьте DRF в пул приложений, которые Django должен использовать.
# Application definition
INSTALLED_APPS = [
...
# Django Packages
'rest_framework',
]
Ссылки будут «жить» в специальном URL модуле, созданном с помощью базы проекта.
ROOT_URLCONF = 'mysite.urls'
Укажите Django, где искать все шаблоны и другие статические ассеты.
STATIC_URL = '/static/'
STATICFILES_FINDERS = [
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
]
STATICFILES_DIRS = [
env('FRONTEND_ROOT')
]
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [env('FRONTEND_ROOT')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
В соответствии с настройкой TEMPLATES Django должен будет искать шаблоны внутри frontend/ directory. Это то, где Angular приложение будет жить. Мы используем только Django, чтобы обслужить шаблон, внутри которого Angular приложение будет загружаться, которое будет выполнено через entry-point директиву. Если вы не знаете, о чем я, продолжайте чтение...
Наполните settings/dev.py:
from mysite.settings.base import *
CURRENT_ENV = 'dev'
Здесь мы указываем, что этот файл настроек унаследывает настройки из base.py и переопределяет строку CURRENT_ENV, найденную в base.py. Мы говорим: «Используй это значение вместо значения, найденного в наследуемом модуле».
5. Создайте API.
Нам нужно нечто, с помощью чего мы сможем протестировать службы Angular, поэтому давайте создадим небольшое API. Этот шаг можно пропустить, но я не советовал бы делать этого. Нам важно знание того, что настройки приложения Angular работают исключительно с точки зрения его потенциала, чтобы облегчить HTTP запросы.
Сгенерируйте приложение.
manage.py startapp games
Создайте модель в games/models.py.
class Game(models.model):
title = models.CharField(max_length=255)
description = models.CharField(max_length=750)
Создайте DRF сериализатор для модели игры в applications/api/v1/serializers.py.
from rest_framework.serializers import ModelSerializer
from applications.games.models import Game
class GameSerializer(ModelSerializer):
class Meta:
model = Game
Создайте DRF viewset для модели в приложениях applications/api/v1/viewsets.py.
from rest_framework import viewsets
from applications.games.models import Game
from applications.api.v1.serializers import GameSerializer
class GameViewSet(viewsets.ModelViewSet):
queryset = Game.objects.all()
serializer_class = GameSerializer
В applications/api/v1/routes.py зарегистрируйте роуты, используя DRF's router registration features.
from rest_framework import routers
from applications.api.v1.viewsets import GameViewSet
api_router = routers.SimpleRouter()
api_router.register('games', GameViewSet)
Обозначьте ссылки для зарегистрированного DRF роута внутри mysite/urls.py:
from django.contrib import admin
from django.conf.urls import include, url
from applications.api.v1.routes import api_router
urlpatterns = [
url(r'^admin/', admin.site.urls),
# API:V1
url(r'^api/v1/', include(api_router.urls)),
]
6. Запустите сервер Django, используя dev settings.
manage.py runserver --DJANGO_SETTINGS_MODULE=mysite.settings.dev
Впуская DJANGO_SETTINGS_MODULE в runserver, мы «говорим» - работать используя специфические параметры.
Если все работает, у вас появится возможность открыть localhost:8000/api/v1/games и увидеть ответ от DRF. Если все работает – самое время заняться построением приложения Angular. Если нет – направьте автору проблему. Если вы застряли на этом этапе – оставьте комментарий автору под оригиналом публикации.
7. Инициализируйте npm-пакет и установите front-end JS зависимости.
Приложение Angular не будет работать так, как мы хотим, если правильные зависимости не будут установленны. Самое время установить базовые пакеты, которые понадобятся.
Инициализируйте npm-пакет. Прямо из frontend/ запустите
npm init --yes
By passing the --yes flag into init, you're telling NPM to generate a package.json using NPM defaults. Otherwise, if you don't pass that in, you'll have to answer questions... Boring.
Установите dev dependencies.
npm install --save-dev eslint eslint-loader
Установите общие зависимости.
npm install --save eslint eslint-loader angular angular-resource angular-route json-loader mustache-loader lodash
Файл package.json file во frontend/ должен выглядеть приблизительно следующим образом:
{
"name": "my-app",
"version": "0.0.1",
"description": "This is my first angular app.",
"main": "app.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"eslint": "^3.1.1",
"eslint-loader": "^1.4.1"
},
"dependencies": {
"angular": "^1.5.8",
"angular-resource": "^1.5.8",
"angular-route": "^1.5.8",
"eslint": "^3.1.1",
"eslint-loader": "^1.4.1",
"json-loader": "^0.5.4",
"lodash": "^4.13.1",
"mustache-loader": "^0.3.1"
}
}
Здесь то, что мы только что установили:
eslint – отличный линтер, благодаря которому код JavaScript будет в порядке (последователен).
eslint-loader – для запуска eslint через Webpack. Чуть позже я объясню концепцию «загрузчиков».
angular - MVC фреймворк. Если вы не знали об этом, стоит подумать о том, чтобы закрыть эту страничку прямо сейчас.
angular-resource - (Angular) HTTP библиотека выбора. Это абстракция $http.
json-loader - загрузчик (снова, используемый Webpack) для распаковки JSON из .json файлов с помощью require() во время работы нашего приложения.
mustache-loader – загрузчик, который мы будем использовать, чтобы парсить наши mustache шаблоны. Mustache шаблоны – это веселье.
Я могу спокойно предположить, что вы не знаете, как все эти пакеты заиграют вместе.
Не переживайте, братишки.
8. Создайте entry-point в Angular, объявите начальные зависимости, объявите первоначальные глобальные переменные.
В frontend/app/app.js добавьте следующее:
/* Libs */
require("angular/angular");
require("angular-route/angular-route");
require("angular-resource/angular-resource");
/* Globals */
_ = require("lodash");
_urlPrefixes = {
API: "api/v1/",
TEMPLATES: "static/app/"
};
/* Components */
/* App Dependencies */
angular.module("myApp", [
"ngResource",
"ngRoute",
]);
/* Config Vars */
// @TODO in Step 13.
/* App Config */
angular.module("myApp").config(routesConfig);
app.js это то, где Webpack будет искать модули, чтобы бандлить их вместе. Лично я ценю такую организацию и методику вызовов, но такой порядок не обязателен. Существует 6 секций:
Libs – главные библиотеки, используемые на протяжении работы Angular приложения;
Globals – зарезервированные глобальные переменные, которые мы можем использовать во время работы приложения;
Components (Компоненты) – особенные модули проекта;
App Dependencies (Зависимости приложения) – объявление входной точки приложения и его зависимостей;
Config Vars – переменные, где хранятся настройки, такие как route config;
App Config - вводит configs (настройки) в приложение, используя сохраненные из предыдущей секции.
Для того, чтобы globals работали, вам следует указать ESLint на то, какие из переменных - глобальные.
В config/eslint.json добавляем следующее:
{
"env": {
"node": true
},
"extends": "eslint:recommended",
"rules": {
"indent": [
"error",
2
],
"linebreak-style": [
"error",
"unix"
],
"quotes": [
"error",
"double"
],
"semi": [
"error",
"always"
],
"no-console": 0
},
"globals": {
"_": true,
"_urlPrefixes": true,
"angular": true,
"inject": true,
"window": true
},
"colors": true
}
Ниже несколько переменных, о которых мы предупредили ESLint:
_ представить lodash.
_urlPrefixes – объект, который мы будем использовать в приложении для гиперссылок. Я расскажу об этом позже.
angular, чтобы представить AngularJS object driving our entire application.
inject, который будет использоваться для ввода зависимостей Angular.
window, которая просто представляет объекты окон в JavaScript, является представителем DOM.
9. Настройка Webpack.
Теперь, когда мы выложили большинство наших зависимостей приложения, мы можем построить config file для Webpack. Webpack будет консолидировать все зависимости, а также модули для приложений, которые мы создаем в один файл. В bundle.
В frontend/webpack.config.js добавляем следующее.
module.exports = {
entry: "./app/app.js",
output: {
path: "./dist/js/",
filename: "bundle.js",
sourceMapFilename: "bundle.js.map",
},
watch: true,
// eslint config
eslint: {
configFile: './config/eslint.json'
},
module: {
preLoaders: [{
test: /\.js$/,
exclude: /node_modules/,
loader: "eslint-loader"
}],
loaders: [
{ test: /\.css$/, loader: "style!css" },
{ test: /\.html$/, loader: "mustache-loader" },
{ test: /\.json$/, loader: "json-loader" }]
},
resolve: {
extensions: ['', '.js']
}
};
Для того, чтобы Webpack бандлил все наши статические зависимости, нам нужно указать ему, где их брать, какие зависимости обрабатывать и как управлять ими до банлинга.
Давайте посмотрим на то, что указывает Webpack с помощью webpack.config.js:
Entry - это путь к тому, что Webpack'у нужно для старта бандлинга. Это можеть быть полный путь или путь, относительный тому, где webpack.config.js располагается. В данном случае мы говорим о последнем варианте.
output - это объект, содержащий в себе path, который является директорией, в которую связанные зависимости будут помещаться; filename - это название бандла; и, в данном случае, мы решили использовать sourceMapFilename, чтобы обозначить, что наша() source map будет вызван(а).
watch указывает Webpack следить за изменениями в файле, пока он выполняется. Если это не настроено как true, Webpack прогонит процесс бандлинга единожды и остановится.
eslint содержит в себе специфические ESLint настройки, используемые eslint-loader.
module указывает Webpack'у, что делать с модулями, с которыми он работает.
module.preLoaders «говорит», что делать перед бандлингом. В данном случае мы хотим запустить модули (исключив модули установленные npm) через eslint.
module.loaders - это то, где указана последовательность загрузчика. В нашем случае мы просто настраиваем test и loader, где test указывает Webpack’у, какие модули запускать в загрузчике (по соответствию с паттерном regex), и loader говорит Webpack’y, какой загрузчик использовать в модулях, которые соответствуют regex паттерну в test. Каждый загрузчик указан в строке и разделен восклицательным знаком. Ex: loader!another_loader!yet_another_loader
module.preLoaders указывает, какие preLoaders'у запускать модули. Используемые настройки такие же точно, какие мы использовали в module.loaders.
Но, Грег, какая разница между preLoaders и loaders? Я рад, что ты спросил, мой дорогой друг!!
A loader указывает Webpack'у, как бандлить требуемые файлы. Loader смотрит на модуль и говорт: «Эй, так как вы упаковываете это в один файл как строку – это то, как оно должно быть преобразованно для bundle'а».
A preLoader обрабатывает код перед loaders, например, чтобы слинтить JavaScript модули.
A postLoader является плагином Webpack'а, который обрабатывает код после бандинга. Мы не специфицировали ни один postLoader ради простоты.
10. Укажите Django загрузить приложение.
Прямо сейчас все, что нужно сделать – указать Webpack’у что создавать, как создавать и что должно быть создано. (На данном этапе я бы очень удивился, если вы попробуете запустить его и он заработает без ошибок. Если так и есть, я чертов мужик.)
Так как Django использует свой собственный URL процессор в нашем приложении, мы можем быть рады тому, как любезно Django управляет всем тем, что введено в строку браузера пользователя. Как бы то ни было, мы бандлим одностраничное приложение, используя абсолютно другой фреймворк, и хотим, чтобы у приложения был полный контроль над тем, что пользователь вводит. Все, что нам нужно – обслуживать одну страничку, в которой работает SPA. Следовательно...
В backend/mysite/mysite/urls.py добавляем в список urlpatterns следующее:
# Web App Entry
url(r'^$', TemplateView.as_view(template_name="app/index.html"), name='index'),
Это значит, что когда пользователь открывает mysite.com/, env('FRONTEND_ROOT') + app/index.html будет находить STATICFILES_FINDERS в порядке рендера HTML шаблона.
11. Создайте шаблон базы приложения Angular.
frontend/app/components/app/index.html шаблон должен выглядеть как обычный шаблон Django.
В frontend/app/index.html добавляем следующее:
{% load staticfiles %}
<html ng-app="myApp">
<head>
<title>My Sitetitle>
<script src="{% static 'dist/js/bundle.js' %}">script>
head>
<body>
body>
html>
В таком случае вам удастся запустить Webpack. Если вы запустите Django сервер и откроете localhost:8000,вы увидите пустую страничку. Если нет – дайте знать автору.
12. Напишите home component.
Давайте напишем наш первый компонент. Он отобразит текст на страничке, пока пользователь открывает localhost:8000.
Создайте директорию для компонента и базовые файлы. В frontend/app/components/:
mkdir home && touch home/home-controller.js home/home.js home/home.html
В frontend/app/components/home/home.html добавляем следующее:
<div ng-controller="HomeController as ctrl">
<div>
<h1>Home!h1>
div>
div>
Теперь добавим следующее в frontend/app/components/home/home-controller.js:
function HomeController() {
var that = this;
that.foo = "Foo!";
console.log(that); // should print out the controller object
}
angular.module("Home")
.controller("HomeController", [
HomeController
])
Определение модуля Angular должно быть объявлено в home.js:
angular.module("Home", []);
require("./home-controller");
Теперь мы можем сослаться на "Home" в области зависимости определения модуля. Давайте сделаем это!
В app/app.js добавьте следующее:
/* Components */
require("./components/home/home");
/* App Dependencies */
angular.module("myApp", [
"Home", // this is our component
"ngResource",
"ngRoute"
]);
13. Пропишите пути Angular'а, ведущие к home component и страничке 404.
Нам нужно настроить первый путь. Когда пользователь попадает на localhost:8000, Angular должен взять контроль над загрузкой отрендеренного шаблона. Чтобы сделать это, нам потребуется использовать angular-router.
В frontend/app/routes.js пишем следующее:
function routesConfig($routeProvider) {
$routeProvider
.when("/", {
templateUrl: _urlPrefixes.TEMPLATES + "components/home/home.html",
label: "Home"
})
.otherwise({
templateUrl: _urlPrefixes.TEMPLATES + "404.html"
});
}
routesConfig.$inject = ["$routeProvider"];
module.exports = routesConfig;
Если мы не добавим _urlPrefixes.TEMPLATES, angular-router предположит, что components/home/home.html является действительной ссылкой, которую узнает сервер. Так как STATIC_URL в настройках предполагает неправильную работу localhost:8000/components/home/home.html.
Также, если вы еще не заметили, вы увидите otherwise({...}) в коде роутов. Это то, как будут реализованы страницы 404.
В frontend/app/404.html добавляем следующее:
<h1>NOT FOUNDh1>
И в завершении добавляем frontend/app/app.js:
/* Config Vars */
var routesConfig = require("./routes");
14. Добавьте директивы angular-router к шаблону точки входа приложения.
А теперь нам нужно указать Angular, где будет происходить переключение отображаемого, когда пользователь пользуется навигацией. Чтобы сделать это, мы используем всю силу angular-router.
В тэг
в frontend/app/index.html добавляем:
<base href="/">
Теперь в тэг
добавляем:
<div ng-view>div>
Ваш index.html теперь должен выглядеть так:
{% load staticfiles %}
<html ng-app="myApp">
<head>
<title>My Sitetitle>
<script src="{% static 'dist/js/bundle.js' %}" >script>
<base href="/">
head>
<body>
<div>
<div ng-view>div>
div>
body>
html>
Запустите Webpack. Откройте localhost:8000. Вы должны увидеть, что произошло в home/home.html. (Если ничего, отправьте эти данные автору J ).
15. Проверьте REST API в приложении Angular.
Если все сделано, у вас появится возможность написать angular службы для Django API. Давайте создадим небольшой компонент, чтобы увидеть, можем ли мы это сделать. Этот компонент должен перечислять игры. Я предполагаю, что вы уже заполнили базы данных, следовательно запрос HTTP к localhost:8000/api/v1/games вернет список игр.
Создайте скаффолд компонент в frontend/app/components/:
mkdir -p game/list/ && touch game/list/game-list-controller.js game/list/game-list-controller_test.js game/game-service.js game/game.js game/game.html
Этот компонент будет перечислять игры.
Этот компонент должен перечислять игры. Я предполагаю, что вы уже заполнили базы данных, следовательно запрос HTTP к localhost:8000/api/v1/games вернет список игр.
В game/game-service.js:
function GameService($resource) {
/**
* @name GameService
*
* @description
* A service providing game data.
*/
var that = this;
/**
* A resource for retrieving game data.
*/
that.GameResource = $resource(_urlPrefixes.API + "games/:game_id/");
/**
* A convenience method for retrieving Game objects.
* Retrieval is done via a GET request to the ../games/ endpoint.
* @param {object} params - the query string object used for a GET request to ../games/ endpoint
* @returns {object} $promise - a promise containing game-related data
*/
that.getGames = function(params) {
return that.GameResource.query(params).$promise;
};
}
angular.module("Game")
.service("GameService", ["$resource", GameService]);
Обратите внимание на ссылку $resource, которую мы используем для того, чтобы настроить механизмы HTTP в нашей службе.
В game/list/game-list-controller.js:
function GameListController(GameService) {
var that = this;
/* Stored game objects. */
that.games = [];
/**
* Initialize the game list controller.
*/
that.init = function() {
return GameService.getGames().then(function(games) {
that.games = games;
});
};
}
angular.module("Game")
.controller("GameListController", [
"GameService",
GameListController
]);
В game/game.html:
<div ng-controller="GameListController as ctrl" ng-init="ctrl.init()">
<div>
<h1>Gamesh1>
<ul>
<li ng-repeat="game in ctrl.games">{{ game.title }}li>
ul>
div>
div>
В game/game.js:
angular.module("Game", []);
require("./list/game-list-controller");
require("./game-service");
Затем обратимся к компоненту в app.js:
/* Components */
require("./components/game/game");
/* App Dependencies */
angular.module("myApp", [
"Home",
"Game",
"ngResource",
"ngRoute"
]);
В конце концов, мы собираемся настроить роуты для списка игр, поэтому в frontend/app/routes.js добавьте следующее в объект $routeProvider:
.when("/game", {
templateUrl: _urlPrefixes.TEMPLATES + "components/game/list/game-list.html",
label: "Games"
})
Запустите Webpack снова. Все должно верно скомпилироваться. Если нет – дайте знать автору.
Откройте localhost:8000/#/games. Вы увидите список игр.
Сделано!
Это все.
Сомнения/Мысли
Но есть некоторые сомнения:
Глобальные переменные могут конкретно подставить вас, если вы не знаете, как с ними работать. Их локальное поведение не гарантирует того же на продакшене. Насколько я помню, их можно заставить работать, если правильно описан метод. Ваше приложение на Angular тесно связанно с Django. Поэтому ваше приложение не будет просто слиянием back- и фронтенда. Если ваш Django-RIP давно устарел, значит поменялись и маршруты, следовательно сконфигурируете ваш бэкенд согласно тому, как должны вести себя статические файлы. Так же вам будет необходимо заменить index.html с точкой входа Angular. Маленькие проекты не дадут вам особо попотеть, а вот большие явно заставят понервничать. Совет: единственное место, где должны сопрягаться приложение на Angular и Django сервер - это одна точка входа.
Деплоймент должен быть выполнен так же, как любой обычный деплоймент приложения.
Это все. Если у вас есть какие-либо вопросы и вы испытываете трудности, пожалуйста, оставьте их в комментариях в исходной статье!
Чит!
Автор пообещал выложить на гитхабе репозиторий со всем кодом.
Оригинальная статья на английском языке.
SVG animation
Автор: Дмитро Івченко
Обзор
SVG графика может быть анимирована с использованием анимационных тегов. Они были описаны в спецификации Animation SMIL.
Рассмотрим эти теги:
позволяет анимировать свойства в течение времени.
это удобное сокращение, которое полезно для присвоения значений анимационных нечисловых атрибутов и свойств, таких как свойства opacity.
который двигает вдоль траектории движения path.
которая модифицирует значение цвета отдельных атрибутов или свойств с течением времени.
В дополнение к элементам, определенных в SMIL, SVG включает расширения, совместимые с SMIL анимацией спецификации.
Эти расширения включают в себя атрибуты, которые расширяют функционал элемента.
Расширения SVG включают в себя:
- дает возможность анимировать один из SVG атрибутов в течение промежутка времени, например, в качестве атрибута преобразования нового центра фигуры или преобразование фигуры и использование поворота вокруг одной из осей (Х, Y, Z).
path(attr) - позволяет анимировать вдоль определенного пути.
- используется в сочетании с animateMotion элемента для ссылки на траекторию движения, которая должна быть использована в качестве пути для движения. Элемент mpath входит внутрь animateMotion элемента перед закрывающим тегом.
keypoints (attr) - задается в качестве атрибута для animateMotion, обеспечивая точный контроль скорости траектории движения анимации.
rotate(attr) - используется в качестве атрибута для animateMotion для того, чтобы контролировать поворот относительно оси поворота.
SVG анимации могут быть похожи на CSS анимации. Ключевые кадры создаются, объекты движутся. Но они могут сделать нечто, что CSS анимации не делает.
Применение SVG Анимации
SVG элементы можно стилизовать и анимировать и с помощью CSS. В принципе, любое преобразование или анимации перехода, которые могут быть применены к HTML элементу, также могут быть применены к SVG. Но существуют некоторые SVG свойства, которые не могут быть сделаны через CSS. Векторная версия путь, например, поставляется с набором данных path, который определяет траекторию этому пути. Эти данные могут быть изменены и анимированных через SMIL, но не CSS. Это потому, что SVG элементы описаны набором атрибутов, известных как SVG атрибуты представления.
Если вы предпочитаете использовать JavaScript, я рекомендую использовать snap.svg, который описан как "в JQuery в SVG".
Вот коллекция примеров.
http://snapsvg.io/demos/
Если вы предпочитаете декларативный подход анимации, вы можете применять элементы SVG анимации, о которых я расскажу.
Еще одно преимущество SMIL над JS анимацией в том, что JS анимации не работают, когда SVG встроен в качестве IMG или используется в качестве фона изображения в CSS. SMIL анимации работают в обоих случаях. Это большое преимущество, на мой взгляд.
Поддержка браузеров
Поддержка браузеров для SMIL анимации довольно приличная. Они воспроизводятся во всех браузерах, кроме IE. Подробный обзор поддержки браузеров вы можете посмотреть в таблице совместимости на caniuseit.
Если вам нужно обеспечить альтернативный вариант для SMIL анимации, вы можете проверить поддержки браузера на лету, используя Modernizr. Если SMIL не поддерживается, вы можете предоставить какой-то запасной вариант (анимации JavaScript, например).
Анимация атрибутов элемента из одного значения к другому в течение произвольного времени с указанием конечного состояния: from, by, to, dur и fill.
Давайте рассмотрим с перемещением круга из одного положения в новое. Это можно сделать, изменив значение его атрибута сх (который определяет х - положение его центра).
Мы собираемся использовать элемент, чтобы сделать это. Атрибуты, которым устанавливают числовые значения и цвета, как правило, анимированные с помощью . Для получения списка атрибутов, которые могут быть анимированными, обратитесь к этой таблице:
http://www.w3.org/TR/SVG2/animate.html#AnimationAttributesAndProperties
Чтобы изменить значение на другое в течение времени используются from, by, to, dur и fill. В дополнение к этому, вы также хотите указать, когда анимация должна начинаться с атрибутом начала.
В приведенном примере, я определил круг, а затем вызываю анимацию на этом круге. Центр окружности перемещается из исходного положения - 500 единиц, до 1750 единиц вдоль оси х.
Начальное значение установлено на кнопку мыши. Это означает, что круг будет двигаться, когда она нажата. Вы можете установить это значение к значению времени, а также. Например, начинают = "0s" начнет анимацию, как только страница загружена. Вы можете задержать анимацию, установив положительное значение времени. Например, начать = "6s" запустит анимацию через шесть секунды после нагрузки.
Атрибут Dur похож на анимации-импульса в CSS.
from - to атрибуты похожи на from to ключевых кадров в keyframe блока анимации в CSS:
Повторяющиеся анимации с Repeat-Count
Когда вы хотите воспроизвести анимацию несколько раз, вы можете сделать это с использованием атрибута RepeatCount. Можно указать, сколько раз вы хотите повторить или использовать ключевое слово, чтобы он без конца повторять. Так что, если мы должны были повторить анимацию вида круга в течение двух раз, код будет выглядеть так:
Управление значениями ключевых кадров анимации: keyTimes и values. В CSS, мы можем задать значения, которые мы хотим, чтобы взять в определенные рамки во время анимации.
0%, 40 % , 80 % и 100% являются кадрами анимации.
Анимация вдоль определенных путей:
Хорошие примеры таких анимаций можно посмотреть здесь
http://codepen.io/mileselam/pen/kprKm
http://codepen.io/rossfenrick/pen/gpzJzz
http://codepen.io/tmrDevelops/pen/yyveKv
Так же более подробный пример есть на хабре
http://habrahabr.ru/post/207908/
Функция прохода анимации
Еще один важный элемент — это функция по которой будет проходить анимация. Среди всем известных функций анимации мы знаем ease, ease-in, ease-out, linear. Но если Вы хотите создать свою функцию прохождения анимации, то вам сюда
http://cubic-bezier.com/
И напоследок лучший пример, от которого просто невозможно оторвать глаз
http://codepen.io/thiennhat/pen/BNByzJ?editors=001
Пробуйте и у вас все получится!
Логування проекту за допомогою NLog Framework
Автор: Богдан Ромашко
Введение
Многие начинающие разработчики при создании своих проектов не задумываются о такой вещи, как создание журнала события. Мол, проект у меня нормальный, и так сойдет. Но не забываем, что наше приложение мы пишем не для себя самих, а для клиента.
Всем нужна статистика и слежение за проектами. Итак, что же насчет логирования, так это процесс записи всех сведений о проекте, а именно: информации о работе тех или иных элементах приложения, предупреждение о критической нагрузке, всяческие ошибки и т.д. Для .NET приложений был разработан очень удобный фреймворк под название NLog, с его помощью можно вести учет о состоянии всего приложения. Есть поддержка записи в файл, в базу данных.
Настройка данной платформы очень удобна и легка, есть два способа:
через конфигурационный файл;
через конфигурационный объект LoggingConfiguration;
Первый способ самый простой, так как зондирование проекта уже встроено в саму библиотеку NLog. Вся работа основа на объекте Logger – парне, который занимается ведением учета состояния нашего проекта.
Для того чтобы продемонстрировать работу NLog, создадим проект по шаблону консольного приложения и назовем его NLogUnderstanding. Изначально наш проект выглядит следующим образом:
using System;
namespace NLogUnderstanding
{
class Program
{
static void Main(string[] args)
{
}
}
}
Чтобы начать работу данного фреймворка в нашем проекте, нужно установить следующие библиотеки через Package Manager Console (или же через сам менеджер расширений):
После установки NLog выбираем подход, по которому будем строить процесс слежения за состоянием приложение.
Настройка через конфигурационный файл:
Первое, что нужно сделать- это установить данный пакет:
После это у нас в проекте появится указанный файлик NLog.config:
Начальное содержимое файла выглядеть будет примерно так:
xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<targets>
targets>
<rules>
rules>
nlog>
Все, после того как мы подготовили данную библиотеку, начинаем настройку объекта Logger. Первое, что мы должны сделать, это указать ему, куда мы будем писать те или иные сообщения. Все эти файлы указываются в разделе <targets>. Первое, что мы добавим, так это все возможные записи, которые мы сможем проводить:
<targets>
<target xsi:type="File" name="file" fileName="${basedir}/logs/${shortdate}.log"
layout="${longdate} | ${uppercase:${level}} | ${logger} | ${message}" />
targets>
Шесть возможных вариантов ведения учета:
Информация о состоянии элементов;
Информация, запущенная в режиме debug для отладки проекта (можно применять в тестах);
Всяческие предупреждения (например, связанные с нагрузкой);
Информация об исключениях;
Информация об ошибках, которые привели к критическому завершению приложения.
Для каждого сообщения присутствует свой метод все в том же объекте Logger, который мы чуть позже будем разбирать. Основные атрибуты, которые нужно заполнить, это:
name – название файла, нам оно понадобиться для организации правил, по которым мы будем писать именно в этот файл;
fileName – указываем файл и путь к файлу, в который будем писать наши логи;
layout – шаблон, по которому будет заполнятся наш файл.
Как Вы уже заметили, заполнение значений атрибутов ведется в характерной манере регулярных выражений. То есть, мы используем заранее подготовленные в библиотеке маркеры подстановки для ведения учета наших сообщений в разные файлы. Основные, которые мы использовали, это:
${basedir} – вернет базовую директорию вашего приложения. При компиляции этот маркер вернет изначальный путь (папку bin);
${shortdate} / ${longdate} – маркеры подстановки устанавливают текущую дату и время в зависимости от маркера (полную дату и время или же только дату);
${uppercase:${level}} – интересное использование вложения маркеров. Как Вы поняли, маркер ${level} будет указываться уровень сообщения (мы их перечислили ранее), приводим в верхний регистр;
${message} – под данный маркер подставляется сообщение, указанное в аргументных скобках методов (об этом далее);
${logger} – название класса, от которого поступило сообщение.
После настройки целей для записи наших сообщений мы приступаем к организации правил, по которым будем заполнять наши файлы:
<rules>
<logger name="*" minlevel="Trace" writeTo="file" />
rules>
Тут все намного проще, единственное, что нужно заполнить - это основные атрибуты, т.к. minlevel (минимальный уровень заполнения файла, имя которого указанного в атрибуте writeTo). После того как настроили конфигурационный файл, приступаем к работе с проектом и нашим Logger. Первое, что нужно - это создать экземпляр Logger. Это можно сделать двумя способами:
Создать через первый фабричный метод LogManager.GetLogger("Example"), в аргументах указываем название логгера, менее эффективный способ, т.к. всегда нужно указывать название класса, в котором происходит запись в журнал;
Создание через второй фабричный метод LogManager.GetCurrentClassLogger(), пользуясь данным методом, мы предоставляем возможность экземпляру логгера самому узнать полное квалификационное название класса, в котором произошла запись в журнал.
Теперь привнесем изменения в наш созданный проект:
using System;
using NLog;
namespace NLogUnderstanding
{
class Program
{
static void Main()
{
Logger logger = LogManager.GetCurrentClassLogger();
log.Trace("trace message");
log.Debug("debug message");
log.Info("info message");
log.Warn("warn message");
log.Error("error message");
log.Fatal("fatal message");
}
}
}
После компиляции проекта у нас создается файл с текущей датой и в него внесутся следующий записи:
2015-05-06 14:33:46.0911 | TRACE | NLogUnderstanding.Program | trace message
2015-05-06 14:33:46.1380 | DEBUG | NLogUnderstanding.Program | debug message
2015-05-06 14:33:46.1380 | INFO | NLogUnderstanding.Program | info message
2015-05-06 14:33:46.1536 | WARN | NLogUnderstanding.Program | warn message
2015-05-06 14:33:46.1536 | ERROR | NLogUnderstanding.Program | error message
2015-05-06 14:33:46.1693 | FATAL | NLogUnderstanding.Program | fatal message
Теперь можно приступать к внедрению NLog в Ваш проект, и отслеживать состояние ваших объектов.
P.S. Если вы планируете применять слежение за состоянием вашего проекта, то экземпляр логгера нужно будет создавать в нужных для отладки классах. В следующей части я опишу, как применять логгирование в веб проектах на основе ASP.NET MVC.
Як стати тестувальником
Автор: Влад Сверчков
Всем привет!
Вы знаете, как создаются программы и информационные сервисы, которыми все мы пользуемся? Какие специалисты нужны, чтобы появился новый Фейсбук, Вайбер, Инстаграм, новый Windows или какая-то крутая видеоигра?
За разработкой программного обеспечения (ПО) стои́т целая команда профессионалов — и далеко не все из них умеют программировать.
Типичная команда будет включать в себя таких специалистов, как:
бизнес-аналитик — проводит анализ бизнес-проблемы, формирует требования к разрабатываемому продукту;
PM (Project Manager) — управляет всеми, кто вовлечен в работу над проектом;
тимлид (Team Leader) — управляет командой разработчиков;
UX/UI дизайнер — создает приятный дизайн приложения (UI) с хорошим пользовательским опытом (UX);
разработчики/программисты — занимаются написанием кода, являются ядром команды;
QA специалист — тестирует приложение на каждом этапе его разработки для обеспечения высокого качества продукта.
Если ПО не предназначено для использования только внутри компании, а нацелено на внешнюю аудиторию, то еще добавляется маркетинг-команда, которая работает с целевыми потребителями: исследует рынок, определяет клиентуру, привлекает ее внимание, подогревает интерес к продукту и многое другое.
Таким образом, в IT найдется хорошая работа даже для тех, кто не любит программировать. И сегодня речь пойдет о таком специалисте, как QA. Чуть выше вы уже узнали, что это, фактически, тестировщик, следящий за качеством ПО на каждом этапе его разработки. В чём специфика данной профессии, чем занимаются эти специалисты, насколько легко стать QA инженером и какие технологии должен знать потенциальный претендент на данную должность — это мы и раскроем в нашей статье. Устраивайтесь поудобней, мы начинаем!
Тестировщик, QC Engineer, QA Engineer
Очень часто термин “тестировщик” применяется ко всем специалистам, которые так или иначе связаны с проверкой ПО на качество. Тем не менее, в данной сфере существует формальное разделение профессий на три ветви: Tester, QC и QA. Давайте выясним, что означает каждая из них.
Тестировщик — специалист, который фокусируется на проведении непосредственных тестов над уже созданным ПО (составление тест-кейсов и баг-репортов, локализация дефектов и другое). Специалист проверяет, все ли работает согласно заявленным требованиям, производит сбор статистических данных и фиксирует их в соответствующих документах.
Тестировщик внимательно пользуется разработанным ПО, воспроизводит все возможные действия пользователя, работает с приложением на различных операционных системах, в различных браузерах (если это веб-приложение), на различных мобильных платформах (если это мобильное приложение); помимо ошибок он ищет еще и уязвимости.
Что-то вроде техосмотра транспортного средства. Отчеты об ошибках затем направляются разработчикам, которые ответственны за дальнейшее исправление багов.
QC (Quality Control) Engineer — специалист, который обеспечивает не только соответствие разрабатываемого ПО заявленным требованиям, но и его соответствие заранее определенным критериям качества продукта в целом. Также, он ответственен за определение готовности продукта к выпуску в продакшн. Цель Quality Control специалиста — формирование объективной картины состояния качества ПО на различных этапах разработки. Можно сказать, что специальность тестировщика является подмножеством специальности QC Engineer.
QA (Quality Assurance) Engineer — специалист, который обеспечивает контроль качества разрабатываемого ПО на всех этапах его планирования, проектирования и создания. Работа на этой должности является проактивной и носит превентивный характер, поскольку QA инженер уделяет внимание качеству продукта еще до того, как тот будет создан. Здесь на первый план выходят комплексы мероприятий, процессы и средства обеспечения качества ПО на каждом витке разработки. Непосредственно тестирование системы занимает уже второе место. Главное задание QA — выстроить систему так, чтобы она имела как можно меньше зон, где можно допустить ошибку, соответствовала всем показателям качества, а также была легко тестируема.
Специальность QC Engineer является подмножеством специальности QA Engineer.
Чтобы вас не путать, в данной статье мы приравняем понятия “тестировщик” и “QA инженер” в пользу второго. Будем расписывать стек технологий и путь становления именно QA специалиста. Таким образом мы сможем затронуть максимальное количество информации касательно направления тестирования.
Направления QA
Начнем с того, что в QA есть два основных направления — Manual и Automation. Специалисты каждого из них называются мануальный (ручной) тестировщик и тестировщик-автоматизатор, соответственно. Их разница в том, что первый следит за качеством продукта и проводит все тесты вручную, а второй автоматизирует тестирование путем написания скриптов. Automation QA использует определенный язык программирования и фреймворк для того, чтобы создавать программы, которые будут производить тестирование продукта вместо самого специалиста. Такой подход позволяет сократить время на тесты.
В обязанности мануального QA инженера входят:
анализ и выяснение требований у заказчика либо бизнес-аналитиков;
планирование процесса тестирования;
написание сценариев тестирования;
непосредственно тестирование программного продукта;
определение проблемных мест, их документирование;
использование систем отслеживания багов (баг-трекинги);
обсуждение исправлений с разработчиками, активное взаимодействие с ними;
отслеживание жизненного цикла ошибок;
повторный тест исправленных дефектов;
анализ тестирования;
планирование идей по оптимизации качества программного обеспечения;
ведение тестовой документации;
проверка требований к программному обеспечению;
оценка рисков;
участие в стенд-апах и других митингах.
Тем временем на плечи Automation QA помимо прочего возлагаются такие обязанности, как:
написание новых автотестов на основе разработанных вручную;
обновление поломанных/устаревших автотестов;
прогон автотестов;
анализ результатов тестовых прогонов;
настройка тестового окружения;
ревью кода;
оформление автотестовой документации.
На самом деле и мануальное, и автоматизированное направление имеют много общих требований, поскольку их фундамент одинаков. Давайте начнем с рассмотрения Manual QA, а затем плавно дополним его инструментами Automation QA.
Стек технологий Manual QA Engineer
Общая теория по IT
Если лет 15 назад в тестировщики брали чуть ли не “с улицы”, то сейчас к претендентам с каждым годом выдвигают все больше и больше требований. Так что потенциальный претендент на должность прежде всего обязан хорошо понимать IT индустрию.
Итак, в этот пункт предусматривает такие темы, как:
веб-технологии (HTTP, HTTPS, DOM, JSON, cookie, session), клиент-серверная архитектура;
базы данных;
компьютерные сети;
операционные системы (обратить особое внимание на Unix);
мелкие подтемы, как, например, системы счисления и т. д.
Теория тестирования и тестовая документация
Безусловно, любой QA инженер должен знать, с чем он вообще имеет дело. Если на заре разработки тестирование было чем-то интуитивным, то сегодня оно обрело четкие формы, обзавелось своими методиками, инструментарием и специализированным программным обеспечением.
Изучив теорию тестирования, вы сможете ориентироваться в данном направлении, понимать принципы, типы и методы тестирования, тест-дизайна, этапы жизненного цикла ПО; узнаете, как правильно составлять тестовую документацию (тест кейс, баг-репорт, чек-лист и т. д.) и многое другое.
Основные темы:
Тестирование, основные стандарты ISTQB.
SDLC и STLC. Методологии разработки ПО.
Требования. Анализ и составление требований.
Тестовая документация.
Уровни, типы, методы и виды тестирования.
Техники тестирования. Тест-дизайн
Баги и баг-трекинговые системы.
Системы контроля тестов.
Основы программирования + HTML/CSS
Основы программирования мануальному QA нужны не для того, чтобы заниматься непосредственным кодингом, а чтобы уметь читать код разработчика и понимать, что в нем происходит. Здесь важен не сам язык программирования, а банальное понимание того, как создаются программы, что такое переменные, функции, методы, классы, какие есть методологии программирования, как они реализуются и т. д. Для изучения основ отлично подойдет C# либо Java. Возможно, сюда стоило бы включить и Python, но он, пожалуй, слишком легкий для изучения и при работе с другими языками вам придется что-то доучивать. C# с Java же более фундаментальны и зная основы одного из них, вы легко сможете разбираться с кодом любых других популярных языков.
Фактически, владение основами программирования необходимо для чтения чужого кода и выявления возможных багов прямо на месте.
Отдельно выделяем языки верстки HTML и CSS. Если вы будете работать с веб-приложениями (а как показывает практика — проектов много — очередь и до тестирования “веба” рано или поздно дойдет), то вам будет полезно знать, из чего состоит FrontEnd часть веб-приложения. Также, вы будете работать с инструментами разработчика в браузере и там тоже надо будет взаимодействовать с HTML/CSS кодом.
Правила оформления документации. Модель CMMI
Если вспоминать три специальности, о которых мы говорили вначале (QA, QC и тестировщик), то этот пункт для тестировщика как такового является ненужным. Но вот для QA инженера он является неотъемлемым. В процессе проектирования ПО, слежения за его качеством необходимо производить соответствующее документирование. Чтобы делать это правильно, надо знать стандарты оформления подобных документов. Важно уделить внимание серии ISO 9000.
CMM / CMMI — это набор методологий (моделей) совершенствования процессов разработки ПО. Знание CMMI позволяет QA инженеру грамотно оценивать проект и планировать необходимые процессы по обеспечению качества.
SQL
SQL — язык запросов, который используется для взаимодействия с данными в реляционных базах данных. Тестировщику он пригодится для того, чтобы выполнять бэкенд-тестирование для проверки тестовых данных, вставки, удаления, обновления их значений в БД.
Сказать точный уровень владения SQL нелегко, поскольку все зависит от сложности проекта. На каком-то сгодится базовый уровень SQL, а где-то необходимо быть весьма и весьма подкованным. А если тестирование не связано с бэкендом, то знания языка запросов вовсе не пригодятся.
В общем и целом, тестировщик должен обладать следующими знаниями и умениями при работе с БД и SQL:
умение распознавать различные типы БД;
способность реализовать подключение к БД, используя разные клиенты SQL-соединений;
понимание таблиц БД, ключей, индексов, типов отношений между таблицами;
умение создавать простые запросы;
понимание и умение разбирать по полочкам сложные запросы.
Веб-сервисы
Веб-служба (или веб-сервис) — это идентифицируемая веб-адресом программная система со стандартизированными интерфейсами. Данный термин описывает стандартизированный способ интеграции веб-приложений с использованием различных протоколов, например: XML, TCP/IP, SOAP, WSDL и UDDI. Веб-служба представляет собой способ связи между двумя электронными устройствами по сети, такими веб-сервисами можно пользоваться независимо от компьютера, браузера или места доступа в Интернет (поиск, веб-почта, хранение документов, файлов, закладок и т. д.).
К преимуществам веб-сервисов можно отнести:
возможность создания необходимых кондиций для взаимосвязи программных компонентов, которые не будут зависеть от используемых платформ;
веб-сервисы используют открытые стандартные протоколы; благодаря XML обеспечивается легкость в формировании и настройки веб-сервисов;
использование HTTP гарантирует успешную взаимосвязь систем через межсетевой доступ.
Веб-сервисы должны знать разработчики для корректной реализации ПО, а тестировщикам они нужны, чтобы понимать, как работает та или иная веб-система.
Jira
Система баг-трекинга, которая помогает выявлять, регистрировать и контролировать баги, найденные в разрабатываемом ПО, а также отслеживать процесс устранения этих ошибок. Является командным инструментом, что упрощает процесс взаимодействия разработчиков и тестировщиков, а также различную баг-трекинговую деятельность в принципе. Помимо прямого назначения помогает команде эффективнее работать, расставлять приоритеты и выбирать дальнейшие шаги оптимизации ПО.
Postman
Популярный и в то же время мощный набор инструментов для тестирования API (в среде разработчиков произносится как “а́пи”). API — это прикладной программный интерфейс; он указывает, каким образом следует обращаться к программе и какие ответы она обязана предоставлять пользователям.
Postman относительно простой в использовании, имеет богатый интуитивный интерфейс. Он проверяет запросы с клиентской стороны на серверную, а также отклик со стороны бэкенда. Таким образом можно убедится, что на стороне сервера все работает, даже если фронтенд сторона еще не готова.
API можно тестировать и при помощи множества других программных средств (например, JMeter), однако, на сегодняшний день именно Postman является наиболее компромиссным инструментом тестирования запросов, сочетающим в себе простоту и высокую эффективность.
Git
Git — это популярная система контроля версий, позволяющая вести историю разработки проекта с возможностью доступа к каждой сохраненной версии. Одним из самых известных антагонистов Git является SVN — централизованная система, в отличие от децентрализованной Git.
Также, в работе вам пригодится и сервис онлайн-хостинга проектов, использующий систему контроля версий. В данном случае это GitHub. В паре с Git он позволяет разработчикам сохранять свой код онлайн, а затем взаимодействовать с другими разработчиками в разных проектах.
Git нужен скорее для Automation QA, поскольку позволяет в удобном виде хранить код тестов с возможностью вернуться к рабочей версии тестов. Также, тестировщик сможет:
иметь доступ к коду разработчиков;
организовать список тестов и отслеживать его выполнение;
тестировать код с разных устройств (при этом сам код лежит на удаленном репозитории Git);
хранить различные настройки для приложения;
выполнять другие взаимодействия.
Методологии разработки Agile/Scrum
Методологии разработки — это своеобразные путеводители по процессам эффективной разработки ПО. Их применение помогает организовать максимально продуктивную работу всех участников, которые напрямую или косвенно задействованы в разработке продукта в соответствии с выбранной стратегией.
Agile — семейство гибких методологий разработки программного обеспечения, которое позволяет выпускать продукт небольшими частями, постоянно его дополняя и совершенствуя. При таком подходе технические и бизнес-подразделения работают совместно, ПО постоянно обновляется, обеспечивается быстрое принятие решений и выявление неправильных подходов, приложение проще обслуживать, а качество кода готового продукта более высокое. Agile имеет собственный манифест, который подробно описывает основные принципы, на которых строится гибкая разработка.
Scrum является одной из популярнейших реализаций agile-подхода. Его используют многие команды, поэтому знание особенностей работы со scrum-моделью для QA инженера является не менее важным, чем для любого разработчика.
Английский язык
Знание английского языка — естественное требование для многих профессий в IT, поскольку большинство новых сведений о технологиях, курсы, учебные и справочные материалы появляются в первую очередь на английском. Для работы в команде обычно знаний языка на уровне чтения технической документации, комментирования кода и составления баг-репортов вполне достаточно, однако, если возникнет необходимость вести переговоры и/или переписку с иностранным заказчиком, либо же вы будете в интернациональном коллективе, ваш уровень должен быть выше (тут уже очень желательно иметь уровень не ниже Upper Intermediate).
Soft Skills
Так называемые “гибкие (мягкие) навыки” — это внутренние качества специалиста, которые помогают ему выполнять работу максимально качественно и без лишнего напряжения. К примеру, для следователя-криминалиста прекрасными софт скиллами будут объективность, внимательность, умение чувствовать своего собеседника, прекрасное дедуктивное мышление и неугасающее стремление докапываться до правды. Для работника на ресепшене критически важными мягкими навыками есть коммуникабельность, дисциплинированность, пунктуальность, обходительность, вежливость и другие.
Какие soft skills пригодятся тестировщику? Специалисту, который следит за качеством ПО и проверяет его на прочность, следует обладать следующими навыками:
внимательность, умение концентрироваться на задаче;
инициативность;
усидчивость;
организованность, проактивность, нацеленность на результат;
стрессоустойчивость;
эмпатия к пользователю и вместе с тем понимание бизнес-процессов (умение “переобуваться”);
адаптивность;
коммуникабельность;
умение работать в команде;
обладание логическим, системным, упорядоченным мышлением;
умение правильно осуществлять декомпозицию (по отношению к системам, задачам, проблемам и т. д.);
наличие шестого чувства + немного изобретательности;
стремление учиться и умение передавать свои знания другим;
Пользовательский опыт (не обязательно, но очень удобно)
Было бы неплохо, если б перед тестированием приложения вы уже сталкивались с чем-то подобным в обычной жизни. Если работать предстоит в сфере игростроения, то ваш огромный геймерский опыт будет как нельзя кстати. Работа с проектами из веб-индустрии? Опыт сёрфинга в интернете (соцсети, интернет-магазины, онлайн-сервисы) облегчит понимание логики пользователей, их ожиданий и точек интереса.
Automation QA
Автоматизированный QA технически является надмножеством позиции Manual QA — он должен знать все то же самое, что и мануальный коллега плюс несколько новых инструментов. Эти инструменты мы сейчас и перечислим.
Язык программирования
Если в разделе о Manual QA мы говорили об основах программирования, то автоматизатору понадобится именно уверенное владение конкретным языком. Обычно выбирают среди Java и Python, но это не предел. В тестировании можно применять и такие языки, как JavaScript, C#, Ruby, PHP, SmashTest и другие.
При помощи выбранного языка вы будете писать автотесты, которые будут выполнять тестирование за человека. Программа работает — тестировщик анализирует результаты. Это упрощает работу, повышает скорость проведения тестов и снимает часть задач с человека.
Фреймворк для тестирования
Для создания автотестов зачастую используется специальные программное обеспечение — фреймворки. Одним из популярнейших считается Selenium. Он мультиплатформен, ориентирован на работу с веб-приложениями и поддерживает множество популярных языков программирования. Более того, Selenium является основной технологией для множества других инструментов автоматизации браузеров, API и фреймворков.
Инструменты нагрузочного тестирования
Данный пункт является необязательным, но при этом очень желателен. Нагрузочное тестирование — это вид тестирования, при котором производится тест производительности целевого ПО при различных нагрузках от действий определенного количества пользователей. Наиболее известными инструментами проведения нагрузочного тестирования являются Gatling и JMeter.
Как стать тестировщиком?
Превращаем список приведенных выше технологий в туториал. Начинаем с пути Manual QA.
Вы можете учиться самостоятельно — по книгам или видео курсам, а можете записаться на курсы тестирования для максимально эффективного обучения. В любом случае вначале вам нужно очень хорошо изучить теорию тестирования и базовые темы в IT: веб-технологии, API, клиент-серверная архитектура, базы данных, компьютерные сети, операционные системы (обратить особое внимание на Unix), мелкие подтемы, как, например, системы счисления и т. д. Конкретные темы по тестированию мы расписали в одном из первых наших разделов. Затем вам следует освоить написание тестовой документации (для чистого тестировщика), а QA понадобится еще и знание стандартов по обеспечению качественного ПО (ISO 9000) для дополнительного документирования, модель CMMI.
Чтобы беспроблемно читать код разработчиков и понимать, что в нем происходит, следует владеть основами программирования. Для этого лучше выбрать либо Java, либо C# — документация по данным языкам очень информативна, есть большое комьюнити. Более того, множество программ обучения по данным языкам располагает прекрасным бэкграундом (история программирования, как работают вычислительные системы и как они обрабатывают информацию), который закладывает прочный фундамент программирования. Также, стоит освоить языки верстки HTML и CSS — они очень простые и используются в абсолютно всех веб-приложениях
Для работы с обеспечением, которое использует базы данных, необходимо изучить основы SQL.
Далее приступаем к изучению веб-сервисов, а после — к популярной баг-трекинговой системе Jira и мощному набору инструментов для тестирования API — Postman.
Создание программного продукта обычно ведется в команде, потому знание методологии командной разработки является не менее важным, чем предыдущие технологии. Уделите время изучению принципов Agile/Scrum — с их помощью эффективно разрабатывается современное программное обеспечение. Методология гибкой разработки очень важна для тестировщика, поскольку он участвует в производственном цикле так же, как и разработчики.
Также, не забудьте подтянуть ваш английский как минимум до уровня Intermediate. Он нужен для комфортного поиска нужной информации в интернете, чтения технической документации, работы с иностранными коллегами, а также — для возможного взаимодействия с заказчиком. Все же английский в IT еще никому не мешал и более того — давал новые карьерные возможности.
Чтобы ваша работа приносила вам удовольствие и вы себя не заставляли работать, вам следует обладать следующими софт скиллами:
внимательность, умение концентрироваться на задаче;
инициативность;
усидчивость;
организованность, проактивность, нацеленность на результат;
стрессоустойчивость;
эмпатия к пользователю и вместе с тем понимание бизнес-процессов (умение “переобуваться”);
коммуникабельность;
другие качества, которые мы указали в соответствующем разделе.
С этими навыками и знаниями вы сможете приступать к практике. Изучите Git, начните работать каким-либо проектом: покройте его тестами, напишите тест-документацию. Опубликуйте наработки на GitHub — это даст вам ценный опыт работы с распределенной системой управления версиями и позволит проверить свои навыки в решении реальной задачи. Несколько хороших проектов, и полноценное портфолио готово, а с ним вы можете уверенно подавать резюме на вакансию мануального QA инженера.
Если вас интересует автоматизированное тестирование, дополнительно изучите Python, либо Java + фреймворк для тестирования (Selenium, PyTest, Robot Framework или другой). Это позволит вам создавать скрипты, которые будут автоматически выполнять тестирование, избавляя вас от лишней рутины.
Очень желательно иметь опыт работы с инструментами нагрузочного тестирования. Это может быть JMeter, Gatling или любой другой популярный аналог. Такой опыт даст вам дополнительный вес в глазах работодателя, что сыграет вам на руку, поскольку конкуренция за место тестировщика весьма высока.
Очень желательно, чтобы у вас был наставник, который мог бы следить за вашим прогрессом, отвечать на возникающие вопросы, давать полезные советы и направлять в нужное русло.
Итоги
В данной статье мы постарались сделать максимальный охват темы тестирования. Была рассмотрена не только специальность тестировщик, но и два её надмножества — QC и QA. Сейчас линии разграничения между этими тремя профессиями по большому счёту стёрты и прослеживаются лишь в серьезных компаниях. В более мелких же тестировщик может запросто выполнять функции QA. Тем не менее, в нашей статье высветлены те технологии и области знаний, которые подойдут как тестировщику, так и QA инженеру. Также, мы рассмотрели ответвления Manual QA и Automation QA. Как выяснилось, без знания мануального тестирования вам не стать автоматизированным тестером. Ведь как можно писать автотесты, если ты в принципе не понимаешь, что, где и как исследовать на предмет багов?
Несмотря на высокую конкуренцию за место тестировщика, количество вакансий остается одним из самых больших на рынке труда в IT. Посмотрите популярные ресурсы по трудоустройству в IT и вы сами в этом убедитесь. Поэтому нами и были указаны некоторые необязательные технологии — мы хотим вооружить наших читателей максимально красноречивым стеком, дабы вы были на голову выше конкурентов.
Приведенный в статье стек технологий является прочной основой QA специалиста — как мануального, так и автоматизированного. Если этот материал не дал вам в полной мере ответ на вопрос “как стать тестировщиком и что следует для этого учить?”, делимся с вами ссылкой на вебинар одного из авторов ITVDN — действующего QA Engineer Андрея Шевцова.
Если вас интересует данное направление и вы хотите стать QA инженером, предлагаем вашему вниманию подборку курсов и вебинаров ITVDN, которые вы найдете на странице специальности Quality Assurance.
Желаем успехов в изучении IT технологий!
Оставайтесь с ITVDN!
Обробка файлів С#. NET
Автор: Редакція ITVDN
Введение
Статья объяснит Вам, как выполнять задачи по считыванию и введению файловой информации из разных областей, используя С#. .NET программирование API. Оно включает анализ структуры каталогов, определяет существующие папки и файлы, а также выполняет операции, связанные с файлами: перемещение, копирование и удаление объектов с диска. Цель статьи – определить типы, которые содержатся в области имен System.IO и объяснить, как разными способами можно считывать и вводить информацию в символьно-ориентированый, бинарный и строчный архив данных.
Структура файловой системы
Область имен System.IO состоит из 4 классов, которые помогут Вам оперировать конкретными файлами, работать с машинной структурой каталогов. Каталог адресов и файлов непосредственно наследует System.Object и поэтому выполняет задачи создания, копирования, перемещения и удаления файлов, используя при этом разные статические способы. Они содержат только статические методы, а главное то, что на их основе никогда не создаются экземпляры. Типы FileInfo и DirectotryInfo возникли от базового класса типа FileSystemInfo и обычно их используют, чтобы получить детальную информацию про файл или каталог, поскольку их элементы обычно настроены на возвращение типизованых объектов. Они используют те же общедоступные методы, что и каталог адресов и файлов, но могут сохранять данные, а элементы этих классов не статичные.
В шаблоне .NET область имен System.IO выполняет роль библиотеки базовых классов, которая предназначена для производственных и исходящих услуг на базе файлов. Как и любая область имен, System.IO содержит большое количество классов, интерфейсов, нумераций, структур данных и их передачи. В таблице ниже представлены основные классовые типы данных:
Классовые типы
Характеристика
Хранилище/содержание каталогов
Классовые типы данных помогают управлять системой структуры каталогов.
Информация про накопитель
Этот класс данных предоставляет детальную информацию про накопители, которые содержатся в компьютере.
Файловий поток
Класс данных предоставляет Вам файл прямого доступа с информацией в виде потока байтов.
Файл/сведения про файл
Классовые типы данных руководят файлами, которые содержатся в компьютере.
Путь
Этот класс выполняет операции в System.String, в котором содержится информация про файл и каталог независимо от платформы.
Устройство двойного считывания/устройство двойного введения информации
Классовые типы позволяют Вам сохранять и находить простые типы данных в виде двойных значений.
Поток считывания/поток введения
Этот класс используется для сохранения текстовой информации в файле.
Строчная последовательность считывания/строчная последовательность введения информации
Эти классовые типы данных также работают с текстовой информацией. Однако, базовая система хранилища – скорее, строчный буфер, чем физический файл.
Поток буферизации
В этом типе можно лишь временно хранить поток байтов. Вы можете разместить данные в хранилище позже.
В System.IO содержится класс DriveInfo, чтобы руководить системой диска во время произведения разных операций. Класс DriveInfo предоставляет детальную и полную информацию про количество дисков, общее пространство на жёстком диске, свободное пространство, название диска, состояние готовности и другое. Обратите внимание на следующую программу, которая показывает основные дисководы:
DriveInfo[] di = DriveInfo.GetDrives();
Console.WriteLine("Total Partitions");
foreach(DriveInfo items in di)
{
Console.WriteLine(items.Name);
}
Следующие фрагменты кода отдельно выполняют все другие операции класса DriveInfo.
using System;
using System.IO;
namespace DiskPartition
{
class Program
{
static void Main(string[] args)
{
DriveInfo[] di = DriveInfo.GetDrives();
Console.WriteLine("Total Partitions");
Console.WriteLine("---------------------");
foreach(DriveInfo items in di)
{
Console.WriteLine(items.Name);
}
Console.Write("\nEnter the Partition::");
string ch = Console.ReadLine();
DriveInfo dInfo = new DriveInfo(ch);
Console.WriteLine("\n");
Console.WriteLine("Drive Name::{0}", dInfo.Name);
Console.WriteLine("Total Space::{0}", dInfo.TotalSize);
Console.WriteLine("Free Space::{0}", dInfo.TotalFreeSpace);
Console.WriteLine("Drive Format::{0}", dInfo.DriveFormat);
Console.WriteLine("Volume Label::{0}", dInfo.VolumeLabel);
Console.WriteLine("Drive Type::{0}", dInfo.DriveType);
Console.WriteLine("Root dir::{0}", dInfo.RootDirectory);
Console.WriteLine("Ready::{0}", dInfo.IsReady);
Console.ReadKey();
}
}
}
После разработки этой программы, она отображает каждую деталь дисковода и конкретные дисководы, как показано ниже:
Работа с каталогами
Чтобы производить операции с каталогами, то есть создавать и удалять данные, шаблон .NET содержит два элементарных класса: DirectoryInfo и Directory.
Классовый тип DirectoryInfо
Класс DirectoryInfo содержит серию методов создания, удаления, перемещения и перечень каталогов и подкаталогов. В следующем кодовом примере отображена информация относительно временного каталога.
DirectoryInfo di = new DirectoryInfo(@"D:\temp");
Console.WriteLine("*******Direcotry Informations*******\n\n");
Console.WriteLine("Full Name={0}", di.FullName);
Console.WriteLine("Root={0}", di.Root);
Console.WriteLine("Attributes={0}", di.Attributes);
Console.WriteLine("Creation Time={0}", di.CreationTime);
Console.WriteLine("Name={0}", di.Name);
Console.WriteLine("Parent={0}", di.Parent);
Кодовый пример производит информацию относительно временного каталога, который содержится на диске D:
Допускается, что путь, пройденный конструктором времени класса DirectoryInfo существует. Но если Вы попробуете работать с несуществующим каталогом, то общая среда выполнения языков CLR исключит это действие. Чтобы создать каталог, сначала проверьте, нет ли таких исключений.
DirectoryInfo di = new DirectoryInfo(@"D:\temp\xyz");
di.Create();
При помощи программ и при использовании метода CreateSubdirectory можно также увеличить структуру каталога. В следующем кодовом примере показано, как создается каталог на диске D, а потом в D:\ajay\:
DirectoryInfo di = new DirectoryInfo(@"D:\");
di.CreateSubdirectory("ajay");
di.CreateSubdirectory(@"ajay\ajay11");
Класс каталога
Класс каталога выполняет почти те же функции, что и класс DirectoryInfo. Класс каталога, как правило, возвращает строчные данные, а не типизированые объекты класса DirectoryInfo. В следующем примере показано, как удалять каталог и подкаталог на диске D.
static void Main(string[] args)
{
DirectoryInfo di = new DirectoryInfo(@"d:\abc");
Console.WriteLine("Name:{0}", di.FullName);
Console.Write("Are you sure to Delete:");
string str = Console.ReadLine();
if (str == "y")
{
Directory.Delete(@"d:\abc", true);
}
Console.Write("Deleted.....");
}
Считывание и введение информации в файл
Операции считывания и введения информации происходят при использовании файлового объекта. Следующий фрагмент кода считывает текстовый файл, размещенный в компьютере.
private void button1_Click(object sender, EventArgs e)
{
try
{
textBox2.Text = File.ReadAllText(txtPath.Text);
}
catch (FileNotFoundException)
{
MessageBox.Show("File not Found....");
}
}
Сначала пользователя спрашивают, правда ли он желает действовать в выбранном им направлении. Позже, когда настанет очередь файла, метод ReadAllText считывает всю текстовую информацию с файла и отображает ее за текстовым полем.
Кроме того, используя класс File, к файлу, с которого считывается информация, можно добавить что-то свое, кроме самого текста, как показано ниже.
File.WriteAllText(@"d:\test.txt", textBox2.Text);
Этот класс выбирает такой путь, что сохранит файл и способ введения данных как, например, текстовое поле или другой способ.
На следующих изображениях показан процесс считывания текстового файла после того, как был выбран соответствующий шаг:
Поток
Благодаря .NET такие классы, как FileStream, StreamReader/Writer, BinaryReader/Writer могут считывать данные и вводить их в файл. В основном, такой поток информации демонстрирует фрагмент данных, который переходит от начального места до указаного. Таким образом, он способствует взаимодействию последовательности байтов, несмотря на вид устройства, на котором хранятся байты.
Методы
Характеристика
Считывание/считывание байтов
Считывает информацию про количество байтов с исходящей точки.
Введение/введение байтов
Вводит информацию про количество байтов в исходящую точку.
Поиск
Определяет позицию в исходящей точке.
Расположение
Определяет текущую позицию в текущем потоке информации.
Размер
Меняет размер потока информации на байты.
Заполнитель
Обновляет основное хранилище данных вместе с текущим буфером, а потом устанавливает новый.
Выход
Закрывает текущий поток информации и предоставляет информацию, связанную с этим потоком.
Файловый поток
Обновление файлового потока используют, чтобы считывать и вводить информацию в файл. Для того, чтобы создать файловый поток, сначала нужно иметь доступ к необходимому файлу. Затем открыть файл и определить путь получения доступа к файлу. Наконец, выбрать общий каталог, в котором Вы хотите ограничить доступ к файлу.
Перечисления
Значения
Режим доступа к файлу
Создает, добавляет, открывает, приостанавливает - OpenOrCreate
Доступ к файлу
Считывает, вводит - ReadWrite
Общий каталог
Передает, считывает, вводит - ReadWrite
Класс файлового потока может считывать или вводить только один байт или же массив байта. Вам нужно будет раскодировать классовый тип System.String соответствующим массивом байта. Область System.Text определяет закодированый тип, чтобы потом выбрать метод закодирования или раскодирования текстового фрагмента в массив байта. Но закодированый массив байта сохраняется в файле способом FileStream.Write. Чтобы возвратить байт назад на накопитель, нужно вернуться на начальное место и использовать метод ReadByte. Затем Вам следует отобразить строчный массив байта и закодированый текстовый фрагмент на компьютере.
using(FileStream fs = new FileStream(@"d:\ajay123.doc", FileMode.Create))
{
string msg = "first program";
byte[] byteArray = Encoding.Default.GetBytes(msg);
fs.Write(byteArray, 0, byteArray.Length);
fs.Position = 0;
byte[] rFile = new byte[byteArray.Length];
for (int i = 0; i < byteArray.Length; i++)
{
rFile[i] = (byte)fs.ReadByte();
Console.WriteLine(rFile[i]);
}
Console.WriteLine(Encoding.Default.GetString(rFile));
}
Двойное считывание и двойное введение информации
Классовый тип BinaryReader и Writer позволит Вам считывать и вводить дискретную информацию в указанный поток в компактном двойном формате. Классовый тип BinaryWriter определяет нужный способ введения информации, чтобы разместить ее в указанный поток.
Элементы
Характеристика
Классовый тип
Ввод
Считывает элемент к текущему потоку
Двойное введение
Поисковик
Определяет позицию в текущем потоке
Двойное введение
Закрытие
Не допускает двойное считывание
Двойное введение
Заполнитель
Заполняет двойной поток
Двойное введение
Символьный считыватель
Возвращает доступные элементы, не направляет их в поток
Двойное считывание
Считыватель
Считывает указаный ряд байтов или других элементов и сохраняет их во входящем массиве данных
Двойное считывание
В следующих примерах показано, как вводится определенная информация к новому файлу champu.dat, используя BinaryWriter. Далее информация считывается в то время, как классовый тип BinaryReader применяет целый ряд способов.
class Program
{
static void Main(string[] args)
{
// writing
FileInfo fi = new FileInfo("champu.dat");
using (BinaryWriter bw = new BinaryWriter(fi.OpenWrite()))
{
int x = 007;
string str = "hello champu ,one day you will become doomkatu";
bw.Write(x);
bw.Write(str);
}
//Reading
FileInfo f = new FileInfo("champu.dat");
using (BinaryReader br = new BinaryReader(fi.OpenRead()))
{
Console.WriteLine(br.ReadInt32());
Console.WriteLine(br.ReadString());
}
Console.ReadLine();
}
}
Строчное считывание и введение данных
Можно использовать StringWriter и StringReader, чтобы поставлять текстовую информацию на поток запоминающего устройства. Вы в этом убедитесь, когда добавите информацию в виде символов к указаному буферу. На следующих кодовых примерах изображено, что лучше вводить блок строчных данных в StringWriter, чем в файл, размещенный на жестком диске.
static void Main(string[] args)
{
// writing
using (StringWriter sw = new StringWriter())
{
sw.WriteLine("helloooooooooooooooooooo");
// Reading
using (StringReader sr = new StringReader(sw.ToString()))
{
string input = null;
while ((input = sr.ReadLine()) != null)
{
Console.WriteLine(input);
}
}
}
}
Вывод
Данная статья начинается со вступительной части про файловую систему .NET и содержит детальное описание ее иерархических классов. Благодаря статье Вы выучили, как управлять физическим файлом и каталогом на жестком диске, используя классовые типы File и Directory. Было детально рассмотрено классовый тип Stream. Область System.IO содержит ряд устройств введения и считывания информации, как, например, FilStream, BinaryStream, StringStream и другие. Статья рассказывает про доступ к информации и ее ввод.
Повышение цен с 1 февраля
Автор: Редакция ITVDN
ITVDN – это образовательная онлайн платформа, которая более 10 лет помогает изучать программирование и IT. За это время мы выпустили 250+ видео курсов разной степени сложности – как для новичков, так и для практикующих специалистов, – а также сформировали комплексные программы обучения по 16 самым востребованным IT-специальностям.
Поступления, которые мы получаем от наших пользователей, мы вкладываем в создание новых украиноязычных видео курсов. Чтобы иметь возможность записывать больше новых курсов, мы поднимаем цены. С 1 февраля стоимость пакета Стартовый составит 59.99 USD (49.99 USD).
Стоимость пакетов "Базовый" и "Премиум" на данный момент остается без изменений.
Какие преимущества пакета “Стартовый”?
Этот пакет подписки чаще всего выбирают новички, которые ещё не знают, что именно они хотят изучать, и пробуют себя в разных направлениях, а также специалисты, которым нужно систематизировать свои знания или изучить несколько новых технологий.
Что вы получите, выбрав пакет “Стартовый”:
Доступ ко всем видео курсам на 3 месяца
Исходный код учебных проектов
Презентации, опорный конспект, д/з
Проверка 5 домашних заданий
Консультации с тренером – 30 минут
Доступ к интерактивным практикумам
Прохождение 10 онлайн тестов с получением сертификатов
Доступ к новым курсам, которые будут выходить во время действия подписки
Спешите приобрести “Стартовый” по старой цене до 1 февраля.
🎓 Пакет «Unlimited Month» — повний преміум-доступ до ITVDN на 1 місяць всього за 19.99 USD
Автор: Редакція ITVDN
Хочете спробувати навчання в ІТ, але не готові одразу оформлювати підписку на довгий термін?
Пакет «Unlimited Month» — це ідеальна можливість зануритися у світ сучасних технологій без великих вкладень і ризиків.
Ви отримуєте на 1 місяць можливість, щоб протестувати платформу, пройти потрібні курси й зрозуміти, чи підходить вам цей формат навчання. Акція триває з 14 до 21 серпня.
✅ Що входить до пакету:
Доступ до 300+ курсів з програмування, тестування, веброзробки, дизайну, ігор, мобільної розробки та баз даних.
Презентації, конспекти, домашні завдання.
Доступ до інтерактивних практикумів.
Онлайн-тестування з 10 курсів
Сертифікація по завершенні спеціальності.
Доступ до нових курсів, що вийдуть протягом місяця.
💳 Повна вартість пакету – 39.99 USD
🔥 Акційна вартість – 19.99 USD
💡 Чому варто обрати пакет «Unlimited Month»:
Мінімальний ризик і доступна ціна — лише 19.99 USD.
Можливість швидко пройти кілька курсів або закрити конкретні теми.
Ідеальний варіант, щоб протестувати платформу перед оформленням підписки на більший термін.
Гнучкість і свобода навчання — самі обираєте темп і напрям.
Можливість швидко перевірити, чи підходить вам ІТ-сфера.
🎯 Пакет «Unlimited Month» — це старт без зобов’язань і максимальний результат за короткий час.
Ви самі вирішуєте, скільки знань встигнете отримати за цей місяць — а ми забезпечимо вам усі інструменти для ефективного навчання.