Участники категорий Worldskills и Обзор и участник Олимпиады

Участники категорий Worldskills и Обзор и участник Олимпиады

Участники категорий Worldskills и Обзор и участник Олимпиады

Каждый программист хочет прокачать свои навыки и каждая компания хочет видеть у себя квалифицированных специалистов, но как этого достичь? На помощь приходят олимпиады, об участии в одной из них и будет эта статья.

Не просто конкурс для студентов училищ и колледжей. WorldSkills – это что такое и чем он помогает?

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

Сегодня хотим поговорить с вами об участии в чемпионатах, хакатонах, соревнованиях. Меня зовут Максим Межов, и, работая в отделе предиктивного анализа компании «Цифрум» (Госкорпорация «Росатом»), уже дважды участвовал в чемпионатах, построенных на концепции WorldSkills. Эти соревнования задают стандарты технической подготовки и квалификации специалистов. Кроме оригинального чемпионата, в ряде организаций проводятся ещё внутренние. Например, в Росатоме – это AtomSkills.

Зачем участвовать в чемпионатах?

В первую очередь, для самого себя. Не все чемпионаты подразумевают награду, могут даже просто грамоту выдать. Самое главное – это возможность перезагрузиться, заново взглянуть на привычные процессы, попробовать себя в новом и оценить свои силы. Стрессануть и получить заряд адреналина.

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

Как проходят чемпионаты

Марафоны с окончанием «-skills» построены по модели известного чемпионата WorldSkills. Так, DigitalSkills-2021 длился 3 дня. Каждый день мы, участники, садились спиной к спине за компьютеры и в течение определенного  времени решали модуль за модулем. По сути, это как сдать 6 экзаменов за 3 дня. К каждому дню надо готовиться, работать 2 модуля по 3 часа. В середине модуля нам давали перерыв около 15 минут и один перерыв на обед между модулями. Мобильные телефоны, прочая собственная вычислительная техника запрещены. Только выданные компьютеры, у всех одинаковые.

Задание участников номинации «Машинное обучение» в 2021 году – создать приложение автоматизированной обработки обращений граждан. Механика такая: люди своими словами пишут обращение на сайте в специальной форме, затем эти сообщения нужно классифицировать по направлениям, по подразделениям администрации, чтобы они попадали в нужный отдел. То есть настроить автоматическую маршрутизацию.

Один модуль = одна задача. На весь чемпионат участникам ставится одно большое задание, которое нужно решить так, чтобы в конце получился законченный продукт. Например, нашей целью было создать web-приложение, которое автоматически обрабатывает обращения граждан, поступающие на сайт «Умного города».

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

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

Как оценивают участников

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

Третий критерий – это обоснование. Например, метрик. Почему использовали конкретную метрику качества? Почему она подходит именно в данной задаче? Важны именно такие пояснения: «Вот этот подход, этот алгоритм, этот метод я использую, потому что в данной задаче есть такая особенность, и для такой особенности такая метрика лучше, чем вот такая. Она более адекватно нам дает понимание, как модель работает, с каким качеством решает поставленную задачу» и так далее.

И последний, но не по важности, критерий – презентация. Это ещё один навык, который можно здорово прокачать на соревновании.

Презентовать свой проект нужно так, как будто ты выступаешь перед инвесторами.

В целом, нужно показать, что у тебя получилось хорошее решение, рассказать о всех его плюсах, возможностях.

Какие навыки можно получить (и не только в номинации «Машинное обучение и большие данные»)

1)     Конечно, навык разработки. Как правило, конкретных критериев на чем разрабатывать нет. Главное – иметь работающий прототип. Получается, почти что Fullstack. Нужно сделать минимально-жизнеспособный продукт, который покрывает весь требуемый функционал.

2)     Web-программирование. Нужно сделать, чтобы приложение работало. Нужно сделать, чтобы оно работало с данными, с разработанной моделью, чтобы выдавало результаты, демонстрировало их пользователю, взаимодействовало с ним.

Никаких супертребований к дизайну приложения нет. Главное, чтобы оно было, работало и выполняло заявленные функции. Я использовал библиотеку для Python Streamlit, она за короткий срок помогает создать веб-приложение, при этом из «коробки» имеет вполне презентабельный, современный вид.

3)     Навыки презентации, потому что решение нужно ещё защитить и «продать» жюри. На подготовку презентации, кстати, тоже выделяют целый модуль, 3 часа. Но, правда, ещё за это время нужно написать документацию к проекту: Руководство пользователя и Руководство по установке и запуску приложения.

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

Как я решал задачу – мой кейс

  • постановка задачи: бизнес и МЛ

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

Набор данных представлял собой коллекцию файлов в формате json в количестве 59889 штук. Каждый из них представлял собой файл следующей структуры:

{'id': 2947909, 'district_name': 'Приморский', 'watchers_count': 0, 'feed': [{'widget': 'public.status', 'key': 'changestatus_12267237', 'payload': {'id': 12267237, 'dt': '2020-11-13T01:30:54.728196', 'status_name': 'Завершено: Автоматически', 'status': 4}, 'meta': {'title': 'Изменение статуса сообщения', 'bg_color': '#EEEEEE', 'icon': 'fa-thumbs-up fa-flip-horizontal', 'icon_bg_color': '#65C381'}, 'content_type': 30}, {'widget': 'public.status', 'key': 'changestatus_12063847', 'payload': {'id': 12063847, 'dt': '2020-10-23T14:46:07.242630', 'status_name': 'Получен ответ', 'status': 4}, 'meta': {'title': 'Изменение статуса сообщения', 'bg_color': '#EEEEEE', 'icon': 'fa-comments-o', 'icon_bg_color': '#AC89C7'}, 'content_type': 30},
... 'comment': '<p>Если Вы обнаружили, что парадная находится в неудовлетворительном состоянии, сообщите об этом на Портал. Данная категория включает в себя сообщения о зданиях...</p>'}, 'can_view': True, 'is_authenticated': False, 'last_user_answer_dt': None, 'show_unpublished_message': False}

Для решения задачи показались полезным взять следующие признаки:

- `['feed'][-1]['payload']['body']` (текст обращения гражданина)
- `['district_name']` (название округа), возможно пригодится для группировки или агрегации
- `['sidebar']['full_address']` (адрес, где возникла жалоба)
- `['reason']['category']['name']`, `['reason']['category']['id']` (целевая метка класса, который будем предсказывать)
  • предварительная обработка данных

import os
import pandas
from tqdm import tqdm
files_list = os.listdir(raw_datadir)
for f in tqdm(files_list): try: with open(f'{raw_datadir}/{f}', encoding = 'UTF-8') as fl: raw = json.load(fl) data_structure = {} #parse text for i, w in enumerate(raw['feed']): if w['widget'] == 'public.petition': body_text = raw['feed'][i]['payload']['body'] raw_text = " ".join([t['text'] for t in body_text]) preproc_text = preproc_text.strip() break # если нашли нужный виджет, то смысла идти по циклу больше нет data_structure['text'] = preproc_text data_structure['district_name'] = raw['district_name'] data_structure['target'] = raw['reason']['category']['id'] data_structure['target_name'] = raw['reason']['category']['name'] df = df.append(data_structure, ignore_index=True) except Exception: print('Что-то пошло не так :(') print('file name:', f) continue # продолжаем цикл для обработки остальных файлов, а с этим будем разбираться отдельно, возможно он какой-то некорректный!?

По итогу парсинга данных, создаём pandas. DataFrame (далее – df) следующего вида (фрагмент):

text – текст обращения пользователя,
district_name – наименование округа,
target – идентификатор категории,
target_name – наименование категории.

По выбранным признакам пропусков в данных не было, однако встречались дубликаты. Их пришлось удалить. Также, как можно заметить, в колонке target имеется два различных значения для одной и той же категории. Соответственно, рассчитывать на корректность данного признака не приходится и лучше будет удалить данный столбец, а вместо него добавить новый, который будет содержать числовые значения после кодирования категориального признака target_name.

Итого, финальный датасет представлял собой набор данных, содержащий 50096 записей по четырём признакам.

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

df.district_name.value_counts()
Невский 6681
Выборгский 5033
Центральный 4251
Калининский 3722
Московский 3620
Кировский 3334
Приморский 3278
Красногвардейский 3028
Красносельский 2961
Фрунзенский 2768
Адмиралтейский 2695
Пушкинский 2278
Василеостровский 2226
Петроградский 1714
Колпинский 1006
Петродворцовый 929
Курортный 391
Кронштадтский 181
Name: district_name, dtype: int64
Участники категорий Worldskills и Обзор и участник Олимпиады

Как видим все наименования округов уникальны, опечаток нет.

df.target_name.value_counts()
Благоустройство 26853
Содержание МКД 14221
Нарушение правил пользования общим имуществом 1753
Фасад 1467
Незаконная информационная и (или) рекламная конструкция 1095
Повреждения или неисправность элементов уличной инфраструктуры 1031
Кровля 819
Водоснабжение 809
Санитарное состояние 433
Состояние рекламных или информационных конструкций 396
Центральное отопление 284
Подвалы 254
Нарушение порядка пользования общим имуществом 243
Водоотведение 238
Незаконная реализация товаров с торгового оборудования (прилавок, ящик, с земли) 200
Name: target_name, dtype: int64

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

Теперь займёмся текстом.

План предварительной обработки текста:

  • подготовить список стоп-слов, пунктуации, спецсимволов и цифр – всё это будем удалять;

  • собрать текстовый корпус, в котором не будет стоп-слов, пунктуации, спецсимволов и цифр, а также все тексты привести к нижнему регистру;

  • провести лемматизацию для исключения различных форм одного и того же слова;

  • выделить токены – слова, встречающиеся в корпусе и приведённые к изначальной форме (лемматизированные слова).

import nltk
import matplotlib.pyplot as plt
import re
from pymystem3 import Mystem
from nltk.corpus import stopwords
from string import punctuation
nltk.download('stopwords')
stop_words_rus = set(stopwords.words('russian'))
stop_words_eng = set(stopwords.words('english')) # бывают также английские слова попадаются на практике, включим стоп-слова для чистоты целевого датасет
# punctuation == '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
numbers = [i for i in range(10)]
numbers = list(map(str, numbers))
# numbers == ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
mysteam = Mystem() # инициализируем для последующего использования при лемматизации
def preprocess_text(raw_text): """ Метод для предобработки исходного текста """ tokens = mysteam.lemmatize(raw_text.lower()) # лемматизация и приведение к нижнему регистру """ удаление стоп-слов и всяких ненужных символов регулярочка помогает заменить токены типа "1й", которые встречаются в тексте на *, которые потом просто удаляем из списка """ text = [re.sub('[0-9][а-я]', '*', token) for token in tokens if (token.strip() not in stop_words_rus) & \ (token.strip() not in stop_words_eng) & \ (token.strip() not in punctuation) & \ (token.strip() not in numbers) & \ (token != ' ')] if '*' in text: text.remove('*') return ' '.join(text)
text = preprocess_text(df.text[0])
text
'подъезд этаж коридор висеть какой-то провод возможно напряжение председатель тсж ленинградский вечер отказываться принимать заявка устранение полгода'

На одном примере работает корректно, соберём далее корпус из очищенных/предобработанных текстов для последующего перевода текста в числовой вид с помощью алгоритма векторизации.

corpus = []
for row in tqdm(df.iterrows()): text = preprocess_text(row[1]['text']) corpus.append(text)

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

По работе:  Полное руководство по трудоустройству в MFC

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

Для векторизации текстов воспользуемся методом IF-IDF. TF показывает, насколько часто слово встречается в каждом конкретном документе, а IDF – насколько редко слово встречается во всей коллекции документов. При данной векторизации учитывается не только частотность слов в конкретном документе, но и частотность слов в рамках всего корпуса. Это даёт возможность отсечь часто встречающиеся слова во всех документах, которые не представляют пользы для разделения классов.

from sklearn.feature_extraction.text import TfidfVectorizer
tfidf = TfidfVectorizer()
X_tfidf = tfidf.fit_transform(corpus)

К получившейся матрице добавим столбец с целевым признаком, который хотим определять. Фрагмент полученной матрицы приведён ниже:

Данный фрагмент матрицы иллюстрирует тот факт, что TF-IDF матрица является разреженной.

Целевая переменная является категориальной, её необходимо закодировать числовыми значениями. Для этого воспользуемся методом LabelEncoder

lbe = LabelEncoder()
target = lbe.fit_transform(df['target'])
df['target'] = target
  • О финальной модели, метрика

Для отбора наилучшей модели, построим несколько моделей, оценим на кросс-валидации метрику качества и выберем модель с наилучшим значением метрики. В качестве метрики качества будем использовать взвешенный вариант F1 меры – гармонического среднего между точностью и полнотой. Данная метрика позволит адекватно оценить качество работы модели при дисбалансе классов.

По итогу анализа различных моделей классификации по метрике `f1` лидирует `Extra Trees Classifier` 

На втором и третьем месте: Gradient Boosting Classifier и Ridge Classifier соответственно.

Сделаем небольшой поиск лучших гиперпараметров с помощью поиска по сетке. Лучшим вариантом было бы, конечно, использовать optuna или ray.tune, но в силу ограниченности времени остановимся на более простом варианте.

params = { 'et': { 'n_estimators': [100, 500, 1000] }, 'gbc': { 'learning_rate': [0.1, 0.01] }, 'ridge': { 'alpha': [1.0, 5.0, 10.0] }
}
models2 = { 'et': ExtraTreesClassifier(n_jobs=-1, random_state=random_state), 'gbc': GradientBoostingClassifier(), 'ridge': RidgeClassifier(random_state=random_state)
}
for name, model in models2.items(): gs = GridSearchCV(model, param_grid=params[name], scoring='f1_weighted', n_jobs=-1, cv=5) gs.fit(X,y) models2[name] = gs.best_estimator_ print(name, 'best score =', gs.best_score_)

Результат:
et best score = 0.8276726774886836
gbc best score = 0.8193002246126653
ridge best score = 0.8188670459658077

Как видим, даже при такой простой подборке параметров удалось немного улучшить качество метрики при той же стратегии кросс-валидации.

Сохраняем лучшую модель и векторизатор в сериализованном pickle-формате и в дальнейшем используем их в веб-приложении для классификации обращений пользователей сайта «умного города».

with open('tfidf_vectorizer.pkl', 'wb') as f: pickle.dump(tfidf, f)
with open('prod_model.pkl', 'wb') as f: pickle.dump(models2['et'], f)

Лайфхаки от победителя: учимся выигрывать

Если на DigitalSkills я был участником, то в нашем отраслевом чемпионате Росатома – AtomSkills – участвовал в качестве члена жюри. Так что имел представление о том, как оцениваются работы участников и на что нужно обращать особое внимание.

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

  2. Настройтесь на марафон и заранее подготовьтесь к стрессовой ситуации. На DigitalSkills участники сидели в одном помещении, часто приходили группы посетителей мероприятия, от напряжения воздух буквально искрит. Я с собой взял наушники и слушал плейлист в стиле Chillout. Сосед рядом слушал DrumStep, наверное, мощные биты резонировали с его биением сердца и помогали не расслабляться. Но тут каждому своё.

  3. Высыпайтесь. После окончания каждого дня чемпионата лучше немного развеяться и пораньше лечь спать, чтобы дать мозгу полноценно отдохнуть. А перед сном можно порассуждать, какие задачи могут быть завтра. Как правило, они идут  логично. И можно заранее прикинуть, на какие подзадачи разделить следующий модуль и как их решить. А когда появилось понимание, можно почитать теорию. Причём лучше читать краткие справки по конкретным задачам, проблемам, а не лезть в дебри. На чемпионате можно гуглить, а умение правильно задавать вопросы – одно из самых полезных. Я обычно просматривал на каком ресурсе и его разделе можно найти нужную информацию, и на соревновании уже гуглил информацию на конкретных сайтах.

  4. Делайте зарядку утром. Она помогает улучшить кровообращение, и вам потребуется меньше времени на раскачку.

  5. Читайте научные статьи. Это касается не только подготовки к соревнованиям, но и в целом для повышения профессионализма. Полезно знакомиться с чужими практиками, брать себе что-то на заметку. В научных статьях содержится концентрат знаний по теме. Авторы проводят не один день над формулировками и структурированием материала, чтобы было понятно и можно было воспроизвести полученные в исследовании результаты.

Каким специалистам нужно участвовать в чемпионатах

Всем, кто чувствует необходимость перезагрузки, хочет прокачать навыки или просто проверить свои силы. Чемпионаты делятся по уровню сложности, иногда проходят чемпионаты для юниоров. Номинации известны заранее, но какая именно задача будет, держится в тайне. Она объявляется за 15 минут до старта первого модуля. На AtomSkills я ездил со своим коллегой-участником, специалистом по компьютерному зрению. А задачу дали в области предиктивного анализа с данными акустических датчиков. Нужно было выявить аномальные состояния трубопровода по акустическим и вибрационным сигналам, которые требуют особого подхода. Коллега был в шоке. Но смог справиться в итоге, и на проработке задачи уже смело предлагал несколько вариантов решения, старался комментировать и аргументировать свои решения. Эта задача была сложной, потому что необходимо было понять, как вообще работать с такими сигналами, как преобразовать их в адекватный набор данных, по которому в дальнейшем можно обучать модель.

На DigitalSkills я стрессанул примерно так же. Объявили, что задача будет связана с NLP. А моя специализация – предиктивный анализ, где чаще всего временные ряды. Но задача оказалась довольно творческая, плюс, нечто похожее я делал в рамках одного из своих рабочих проектов, так что имеющийся опыт мне очень помог.

Описание самой задачи выше. Каким бы способом её решали вы? Поделитесь с нами в комментариях!

Так что на самом деле, чемпионаты созданы для IT-специалистов любой сферы. Это возможность перезагрузиться, расширить горизонты. А ещё такие чемпионаты иногда меняют подход к работе. Я выяснил, что для меня сейчас оптимальный режим работы – режим хакатона. 3 часа – оптимальное время для фокусировки на задании, не успеваешь устать. Задачу дробишь на мелкие и стараешься каждый этап за эти 3 часа завершить.

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

О выборе компетенции и подготовке

Об олимпиаде я узнал случайно во время одной из практик в университете на 2 курсе. Меня пригласили поучаствовать в компетенции «Разработка программных решений для бизнеса». Для решения задач требовались знания в C# или Java, работа с базой данных, и как я узнал в процессе первой олимпиады Android. Открытие олимпиады было запланировано на начало июня, а за окном был уже конец апреля. В этот момент я не знал абсолютно ничего, что требовалось.

Моему удивлению не было предела, когда всех потенциальных участников собрали для подготовки. В аудитории сидело 7 человек, 6 из которых были уже третьекурсниками, седьмым был я. Почему же я был так удивлен? На третьем курсе студентам читают курс по Базам данных, который длится 2 семестра, а значит у всех было на год практики больше. Отказываться не хотелось, поэтому я попросил у преподавателей книги по БД, нашел курс по C# в Интернете и начал готовиться, периодически появляясь на подготовительных занятия.

За две недели до начала олимпиады мы узнали, что от нашей кафедры могут участвовать не более трех человек. Прошел отборочный тур. За 1,5 часа мы должны были создать базу данных в СУБД MSSQL по ER-модели, импортировать данные из файла Excel и показать их в приложении. Одним словом, мне разрешили участвовать в олимпиаде от нашей кафедры.

По работе:  Эффективные лайфхаки по поиску работы для начинающих

Теперь о конкурсе

Первый день соревнования или «C -1»

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

Второй день соревнования или начало соперничества

Что же представляла из себя олимпиада?

Для нашей компетенции за 2 дня (три для других компетенций) по 6 часов с перерывами от нас требовалось написать клиент-серверное приложение на C#/Java с запросами к БД. Точнее сказать «все что успеем написать», поскольку принципом олимпиады является «делай что можешь и как можешь».

По словам экспертов, критериев было на несколько десятков страниц A4. Критерии выдаются только после окончания сессии и только экспертам, поэтому о них ничего сказать не могу.

Перейдем к событиям второго дня. За первую сессию требовалось реализовать следующее:

  • Создать базу данных по известной ER-диаграмме
  • Импортировать данные из файлов Excel в базу
  • Создать 4 экрана по макетам в презентации

А за вторую сверстать еще пять экранов по макетам.

Если кратко, все задания были решены, кроме отображения картинок из базы данных и создания кастомного списка элементов.

Участники категорий Worldskills и Обзор и участник Олимпиады

Интерфейс позволяет найти игроков по имени (даже по первой букве), сезону и команде. По двойному клику на изображение, которое не было реализовано, открывается подробная информация о игроке. Сейчас бы реализовал это через DataGridViewImageColumn.

Участники категорий Worldskills и Обзор и участник Олимпиады

Как я сохранял изображения

 private void download_Click(object sender, EventArgs e) { SaveFileDialog saveFile = new SaveFileDialog(); saveFile.DefaultExt = ".jpg"; saveFile.AddExtension = true; //Папка по умолчанию - Библиотеки/Изображения saveFile.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.CommonPictures); saveFile.Filter = "Bitmap files (*.bmp)|*.bmp|Image files (*.jpg;*.png)|*.jpg;*.png"; if (saveFile.ShowDialog() == DialogResult.OK) { if (!saveFile.FileName.Equals("")) { String[] arr = saveFile.FileName.Split('.'); //Получаем путь для сохранения от начала до "\" включительно String filepath = arr[0].Substring(0, arr[0].LastIndexOf('\\') + 1); for (int i = 1; i <= imageList1.Images.Count; i++) { Image image = Image.FromFile("..\\Pictures\\" + (i + offset) + ".jpg"); image.Save(filepath + i + "." + arr[1]); } } } }

Больше скриншотов,текста и кода

Участники категорий Worldskills и Обзор и участник Олимпиады

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

Реализация загрузки изображений

 private int countImages() { sqlConnection = new SqlConnection(connectionString); using (sqlConnection) { sqlConnection.Open(); String sqlcomm = "SELECT Count(*) FROM [Pictures$]"; SqlCommand command = new SqlCommand(sqlcomm, sqlConnection); int result = (int)command.ExecuteScalar(); return result; } } private void loadPage() { sqlConnection = new SqlConnection(connectionString); using (sqlConnection) { sqlConnection.Open(); String sqlcomm = "SELECT [Img] , [CreateTime] FROM [Pictures] P" + " Order By P.CreateTime Desc" + " Offset @click Rows FETCH NEXT @svm ROWS ONLY"; SqlCommand cmd = new SqlCommand(sqlcomm, sqlConnection); cmd.Parameters.AddWithValue("@click", click); cmd.Parameters.AddWithValue("@svm", svm); dataAdapter.SelectCommand = cmd; DataSet data = new DataSet(); dataAdapter.Fill(data); imageList1.Images.Clear(); listView1.Clear(); for (int i = 0; i < data.Tables[0].Rows.Count; i++) { imageList1.Images.Add(Image.FromFile("..\\Pictures\\" + data.Tables[0].Rows[i].ItemArray[0].ToString())); } listView1.LargeImageList = imageList1; for (int i = 0; i < imageList1.Images.Count; i++) listView1.Items.Add("").ImageIndex = i; } } private void left_Click(object sender, EventArgs e) { if (click > 0) { if (!right.Enabled) { right.Enabled = true; } click -= svm; loadPage(); } else { left.Enabled = false; } } private void right_Click(object sender, EventArgs e) { if (click + svm < totalPhotos) { if (!left.Enabled) { left.Enabled = true; } click += svm; loadPage(); } else { right.Enabled = false; } }

Участники категорий Worldskills и Обзор и участник Олимпиады

 private int checkData(string jobnumber, string password) { //Защита от SQL-Injection при помощи параметризованных команд String sqlchecked = "if (Isnull((Select RoleId From Admin$ Where Jobnumber like(@Jobnumber) and Passwords like(@Password)) , 0) = 0)" + " Select 0 " + " else " + " Select RoleId From Admin$ Where Jobnumber like(@Jobnumber) and Passwords like(@Password)"; sqlConnection = new SqlConnection(connectionString); int result = 0; using (sqlConnection) { sqlConnection.Open(); SqlCommand command = new SqlCommand(sqlchecked, sqlConnection); //Автоматическое определение типа вводимых данных command.Parameters.AddWithValue("@Jobnumber", jobnumber); command.Parameters.AddWithValue("@Password", password); //Получение данных из первого столбца первой строки таблицы result = (int)command.ExecuteScalar(); } return result; }

Если Вы знаете лучший способ проверить данные, просьба написать в комментариях.

Участники категорий Worldskills и Обзор и участник Олимпиады

А так выглядит недоделанный экран, здесь я просто накидал компоненты на форму согласно макету. Можете, пожалуйста, подсказать как сделать такой кастомный список на C#?

Участники категорий Worldskills и Обзор и участник Олимпиады

Самый сложный для меня экран, так как здесь была работа с графиками, к которым я не готовился.

Третий день соревнования или неожиданная встреча с Android

Предыдущий день можно было считать разогревом по сравнению с третьим. На 3 сессии предстояло доверстать еще 8 экранов. А на заключительной сессии произошла смена планов и вместо презентации по разработанному продукту мы начали делать упрощенную версию для Android. А именно галерею с картинками, подгружаемых из базы данных. Сейчас это звучит легко, но в тот момент я был рад, что на сессию давали 15 минут для выхода в Интернет. За 3 часа был создан GridView с элементами в виде ImageView, в Adapter передан массив id картинок и переопределен интерфейс OnItemClickListener для создания новой Activity с картинкой.

Еще немного скриншотов:

Участники категорий Worldskills и Обзор и участник Олимпиады

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

Моя «идеальная» галерея за 3 часа с использованием Интернета и без навыков программирования под Android.

Больше изображений, текста и кода

Код для создания галереи, когда не знаешь как работать с БД

class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) setSupportActionBar(toolbar) //список id изображений var images = ArrayList<Int>() images.add(R.drawable.a1) //... images.add(R.drawable.a12) listView.adapter = CustomAdapter(images.toTypedArray()) listView.onItemClickListener = AdapterView.OnItemClickListener { _: AdapterView<*>, _: View, i: Int, _: Long -> var intent = Intent(this, FullscreenActivity::class.java) //передаем id изображения, которое нужно посмотреть intent.putExtra("id",images[i]) startActivity(intent) } }
}
class CustomAdapter internal constructor(var images: Array<Int>) : BaseAdapter() { override fun getCount(): Int { return images.size } // элемент по позиции override fun getItem(position: Int): Int { return images[position] } // id по позиции override fun getItemId(position: Int): Long { return position.toLong() } // пункт списка override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { //используем уже созданное представление var view: View? = convertView //если нет, создаем новое if (view == null) { val inflater = LayoutInflater.from(parent.context) view = inflater.inflate(R.layout.item, parent, false) } view!!.findViewById<ImageView>(R.id.imageView).setImageResource(images[position]) return view }
}
class FullscreenActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_fullscreen) //Получаем id изображения var id = intent.getIntExtra("id",-1) imageView2.setImageResource(id) }
}

Участники категорий Worldskills и Обзор и участник Олимпиады

По клику на сезон(правая таблица) открывается подробная информация о всех матчах.

Участники категорий Worldskills и Обзор и участник Олимпиады

Интерфейс для администраторов, позволяющий вносить изменения в список команд и экспортировать данные в Excel.

Как я экспортировал данные в Excel

 private void exportExcel_Click(object sender, EventArgs e) { SaveFileDialog saveFileDialog = new SaveFileDialog(); saveFileDialog.Filter = "Excel (*.xls)|*.xls|All files (*.*)|*.*"; saveFileDialog.DefaultExt = ".xls"; if (saveFileDialog.ShowDialog() != DialogResult.OK) return; if (saveFileDialog.FileName.Equals("")) return; DataTable dt = (DataTable)dataGridView2.DataSource; //Открываем файл StreamWriter wr = new StreamWriter(saveFileDialog.FileName); try { for (int i = 0; i < dt.Columns.Count; i++) { wr.Write(dt.Columns[i].ToString().ToUpper() + "\t"); } wr.WriteLine(); //Записываем строки в файл Excel for (int i = 0; i < (dt.Rows.Count); i++) { for (int j = 0; j < dt.Columns.Count; j++) { if (dt.Rows[i][j] != null) { wr.Write(Convert.ToString(dt.Rows[i][j]) + "\t"); } else { wr.Write("\t"); } } //Переходим на следующую строку wr.WriteLine(); } //Закрываем файл wr.Close(); } catch (Exception ex) { MessageBox.Show(this, ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } }

Подведение итогов

В 12 часов состоялась церемония закрытия, где всем участникам вручались сертификаты, а победителей и призеров ждали медальки с дипломами. В нашей компетенции я занял 2 место. Между награждением компетенций выступали студенты с песнями и танцами.

Медали, дипломы и не только

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

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

А спонсоры наградили победителей определенных компетенций небольшими денежными суммами.

Участники не одни. Рядом – главный эксперт и эксперты-компатриоты

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

Не просто конкурс для студентов училищ и колледжей. WorldSkills – это что такое и чем он помогает?

Главный эксперт – отвечает за проведение соревнований по той компетенции, к которой прикреплен. Несет ответственность за финальный результаты, протоколы и саму площадку проведения Чемпионата.

Эксперты-компатриоты – это те люди, которые сопровождают участников в конкурсе и оценивают выполненные работы участником. Обычно ими являются тренера участников, либо преподаватели профильных дисциплин в учебном учреждении, где учится их конкурсант.

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

Еще по правилам на площадках может присутствовать независимый эксперт от какой-либо организации. Независимый эксперт не заинтересован в чьей-либо победе и может проводит оценку заданий каждого участника.

Соревнования с лучшими из лучших

Победа на региональном этапе – это только часть пути, которую предстоит пройти победителю. После победы предстоит защищать честь своего региона для получения места на участие в финале Национального Чемпионата, наравне с другими лучшими участниками из других регионов.

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

После формирования сборной страны, команда начинает принимать участие в таких Чемпионатах как EuroSkills и WorldSkills International. Соревнуясь с лучшими участниками по каждой компетенции от своей страны. Которые прошли точно такой же отбор.

C 22 по 27 августа 2019 года, Россия провела 45-ый мировой Чемпионат WorldSkills International в городе Казань. В нем принимали участие более 1300 конкурсантов из 63 стран мира, которые соревновались в 56 компетенциях.

Не просто конкурс для студентов училищ и колледжей. WorldSkills – это что такое и чем он помогает?

О конкурсе

WorldSkills — это соревнование, целью которого является выявление профессионалов в конкретной области. Конкурс берет свои истоки с WorldSkills International (WSI), международной некоммерческой ассоциации.

Участие в конкурсе бесплатное. Возраст участников от 18 до 28 лет, учащиеся в коллежах или ВУЗах.

Конкурс в ВУЗе длится 5 дней: в первый день открытие и проверка рабочих мест, затем три дня соревнований, в заключительный день — подведение итогов и закрытие.

Участники – не профессионалы с 15-летним стажем, но быстро добьются этого статуса

Вспоминая собственный опыт, который получил в 2016 году в роли участника по компетенции «Веб-дизайн», когда в 2015 году Удмуртская Республика только вступила в движение «Молодые профессионалы» и уже в 2016 году организовали первый региональный Чемпионат.

По работе:  Разыскивается арт-директор

Так, по правилам минимальное количество участников должно быть не меньше 6 человек для проведения соревнований по компетенции.

На момент проведения первого Регионального Чемпионата у нас в республике, участниками были студенты средних профессиональных образовательных учреждений в возрасте от 16 до 22 лет. Люди, которые только делают первые шаги в своей профессиональной деятельности.

При это, в моем случае, в первом региональном чемпионате принимал также участие и студент местного ВУЗа, попадая в возрастную категорию. И по основному направлению движения WorldSkills Russia до сих пор сохраняется данный критерий возрастной категории.

Во всем этом надо понимать, что участники не являются профессионалами в своей области. И у них нет рабочего стажа, как у признанных экспертов компаний по 8-15 лет.

Но когда человек начинает с раннего возраста заниматься собственным образованием через Чемпионаты профессиональной деятельности, то он быстро добьется статуса профессионала и займет свое место на рынке труда.

Отступление

Статья получилась объемная, поэтому весь код и большая часть изображений находятся под спойлерами. Все еще тестирую формат подачи статей. Если такой формат покажется Вам неудобным, просьба написать об этом. Также все картинки кликабельны.

Пандемия 2020 года и бесплатное повышение квалификации

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

В связи с этим Минпросвещения РФ и Союз «Молодые профессионалы» организовали площадку WorldSkills Express для тех, кто решил получить дополнительные навыки и пройти повышение квалификации по востребованным профессиям. С последующим трудоустройством по доступным вакансиям.

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

Это говорит о том, что движение «Молодые профессионалы» – это уже не просто конкурс профессионального мастерства для студентов СПО, а целая система, направленная на разные категории граждан, которые хотят получить новые навыки. И тех, кто только делает первые шаги в профессиональной деятельности и хочет найти свое место сделав правильный выбор, не жалея в будущем о нем.

Это шанс построить карьеру

Именно когда вы готовитесь к Чемпионату, неважно региональному или финалу Национального Чемпионата, вы учитесь. Вы получаете новые знания и практические навыки, растете как профессионал, что придает вам преимущества в глазах будущего работодателя.

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

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

Такой вывод я сделал на собственном опыте и смотря на участников предыдущих Чемпионатов. Кто-то успешно устроился работать в крупные компании, кто-то открывает собственный бизнес, как это произошло и в моем случае, открыв компанию по разработке ПО на заказ. В каждой ситуации все индивидуально, но то, что в твоей жизни могут произойти значительные изменения – это точно.

К примеру, во время Регионального Чемпионата у меня в Республике, который прошел в 2018 году, участнику из моего учебного заведения сразу предложили работу в городе Казань по направлению «Организация экскурсионных услуг»

Решаем реальные задачи за 3-4 часа

Длительность соревновательных дней в каждой компетенции может отличаться. В компетенции «Веб-дизайн», в которой я когда-то принимал участие, они длились 3-4 дня. В каждый день мы выполняли по 2 модуля, которые эксперты составляли еще до начала самого конкурса.

При это хочу отметить, что по правилам, задания, которые берутся за основу, эксперты изменяют на 30%. И все эти изменения участники увидят только во время ознакомления и выполнения самих заданий.

На выполнение одного модуля по моей компетенции отводилось до 3-4 часов. Количество времени может меняться в зависимости от той или иной компетенции.

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

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

Не просто конкурс для студентов училищ и колледжей. WorldSkills – это что такое и чем он помогает?

Теория бесполезна, но совмещенная с практикой – путь к успеху.

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

За те годы, которые провел в Чемпионате, я не раз встречал студентов, которые только и желали победить. Конечно, побеждать – это здорово. Но в данном случае не стоит упускать из вида самую важную часть.

Продвижение и повышение престижа рабочих профессий

Возможно, вы не раз слышал о таком Чемпионате как WorldSkills Russia (Ворлдскиллс Россия) – Молодые профессионалы, учредителями которого являются Минпросвещения России, Агентство стратегических инициатив и Министерство труда и социальной защиты РФ.

В каждой стране существует собственное движение WorldSkills, а раз в 4 года проводится международный Чемпионат WorldSkills International. Где собираются лучшие участники, которые состоят в сборной своей страны и защищают ее честь.

Не просто конкурс для студентов училищ и колледжей. WorldSkills – это что такое и чем он помогает?

Основная задача Чемпионата – это повышение престижа рабочих профессий и развитие профессионального образования в нашей стране. Применяя не только лучшие практики и стандарты из России, но и со всего мира.

Россия вступила в движение еще в 2012 году, а в апреле 2013 года был проведен первый Национальный финал в городе Тольятти, где было представлено:

  1. 306 участников
  2. 42 региона России
  3. 22 компетенции
  4. 135 экспертов из России
  5. 16 международных экспертов из других стран

Все компетенции Чемпионата объединены в 6 тематических блоков, а именно:

  1. Строительная сфера
  2. Информационные технологии
  3. Промышленное производство
  4. Обслуживание гражданского транспорта
  5. Сфера услуг
  6. Творчество и дизайн

Для курирования Чемпионата, в каждом регионе создается Региональный координационный центр WorldSkills Russia (Молодые профессионалы). Центр отвечает за ежегодную подготовку региональных чемпионатов и продвижения проектов от Союза.

Проект реализуется по программе Национальных проектов России в сфере «Образование».

Проекты, которые появились благодаря данному движению

Спустя уже 8 лет с того момента, как Россия вступила в движение WorldSkills. Была проведена колоссальная работа по развитию данного направления. Теперь, WorldSkills Russia – Молодые профессионалы, это не только про студентов среднего профессионального образования. Из этого движения были выделены следующие направления и отдельные проекты, которые реализуются на территории нашей страны.

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

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

Проект «Навыки мудрых»

Программа обучения для граждан в возрасте от 50-ти лет и старше, а также лиц предпенсионного возраста. Так в каждом регионе реализуются соревнования в определенных компетенциях между данной категорией лиц.

Данный проект реализуется в рамках федерального проекта «Старшее поколение» национального проекта «Демография» при поддержке Министерства труда и социальной защиты РФ и Федеральной службы по труду и занятости.

Билет в будущее

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

Данный проект входит в паспорт федерального проекта «Успех каждого ребенка» в рамках национального проекта «Образование». Участие происходит за счет государственной субсидии, поэтому бесплатно для детей и родителей.

Рассказали про итоги участников — обнуляют результаты

После завершения выполнения всех заданий участниками и проведения оценки с подписанием протоколов по каждой работе, заносятся в систему CIS. Где уже после оценки работ всех участников подводится итог по 100-балльной и 500-балльной шкале.

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

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

Заключение

За месяц подготовки я освоил DDL и DML команды SQL, что значительно упростило работу на парах по БД на третьем курсе. Полученные знания в C# и Windows Form оставляют желать лучшего, кроме работы с базами данных и пользовательским интерфейсом ни с чем работать не пришлось.

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