Это вторая часть моего повествования (искренне думал что последняя).
Первая часть здесь.
Итак, формально команда сформирована. Хотя никто никого еще не знает. Цель проекта не определена. Radio Canada обещают предоставить некий API за неделю до события, чтобы у участников было какое-то время на ознакомление.
Как человек с определенным опытом в различных проектах, я понимал с самого начала, что написать любой работающий прототип за пару дней это задача непростая. Учитывая что команда состоит из участников с неопределенными навыками и опытом в различных языках и системах и никогда ранее не работавшими вместе, я понимал что вероятность создания вообще чего либо работающего не очень реальна.
Во время своих попыток организовать встречу всей команды до начала хакатона, я поговорил сначала со Звездочкой, а затем и с Платоном, по поводу имеющихся и у меня и, как оказалось, у них, совершенно обоснованных, сомнений в успехе мероприятия.
На этом этапе мы сошлись на том, что наша цель не победа, но участие — это раз.
Мы хотим получить рабочий прототип который не будет стыдно показать друг другу, ну или Звездочке с Меркурием в колледже — это два.
Для достижения пункта два, нам нужно создать что-то минимально удовлетворяющее условиям хакатона.
А условия, если вы помните следующие:
- Использование API от Radio Canada (логично было предположить что это будет какой-то контент: новости, видео, аудио, возможно включающий дополнительные/вспомогательные данные: регион, дата, исполнитель, категория и т.д.). Итого API от Radio Canada — некий контент.
- Использование Azure. Этот пункт казался самым простым. Я предполагал что как минимум каждый разработчик поднимет себе сервер для разработки (каждый судит по себе, я оказался прав наполовину). Ну и поскольку следующий пункт будет AI, то было ясно, что надо будет взять какой-то сервис имеющий отношение к этому словосочетанию.
- Как я только что напомнил, тема хакатона AI. Так что какое-то использование AI надо прицепить относительно контента который мы получим от Radio Canada
- Интерфейс должен соответствовать требованиям стандарта WCAG 2.0 AA. Я сделал пару поисковых запросов по этому стандарту. Понял, что на практике, наша задача будет: отформатировать HTML по каким-то там правилам. Но, для себя, я решил, что будем мы этим всерьез заниматься если останется время, а сам прототип будет существовать и как-то функционировать. Иначе как-то получается, что телега впереди лошади идет.
- Команды могут использовать другие публичые сервисы и источники данных. На первый взгляд, этот пункт не звучит как требование, а скорее как разрешение. Но я, наверное, проинтерпретировал бы его как призыв не использовать никакое проприетарное ПО, т.е. избегать любой возможности получить в будущем вопросы связанные с лицензированием и авторскими правами. (Да здравствует опенсорс!)
- Весь прототип, от дизайна архитектуры до кода и прочих элементов, должен быть создан во время проведения хакатона. С одной стороны, понятно желание организаторов уровнять шансы команд. С другой я прекрасно понимал, что у организаторов нет возможности проследить сколько строк кода было написано до, а сколько во время. Поэтому я был не сильно против если у нас будет что принести «с собой» и не питал иллюзий по поводу того что какие-то команды тоже придут немного более подготовленными чем другие.
Стоит отметить, что зайдя на одну из главных страниц Radio Canada мы обнаружили один замечательный факт — у них нет Поисковой Строки!
С этого момента, все сложилось. Все были согласны, что будем делать некую поисковую строку.
И все бы было отлично, если бы нам не надо было куда-то всунуть ИИ, который вроде как нам для поиска особо не нужен. Сошлись на том, что будем брать некое аудио (возможно, выковыривать его из видео) — посылать его на распознавание в ИИ, результат будем складывать в БД, а уже потом делать поиск по БД по тексту (который же был распознан ИИ? ;-) ), что позволит нам говорить об удовлетворении требований хакатона.
От Меркурия она тоже передала, что все нормально, но времени нет. Так что — встретимся на хакатоне!
Фаэтон на связь со Звездочкой выходил нерегулярно, постоянно что-то невнятно обещал, но по факту было тоже понятно что человек занят своими делами и дай бог чтобы освободился к хакатону.
Платон тоже сказал что времени у него много нет. Но он, как и я, понимал насколько важно подойти к мероприятию максимально подготовленными. Так что мы оба зарегистрировались на Azure, чтобы немного «поиграться». Я имел небольшой опыт работы с AWS, но ключевое слово «небольшой». Я просто более менее знаком с терминологией AWS, понимаю что есть EC2, S3, Route53, Lambda и т.д. Плюс к этому есть система безопасности с ролями, ключами, группами, подсетями и прочимм плюшками. Так что, когда я зашел в Azure Dashboard, мне показалось все довольно простым и понятным (но стоило все же поразбираться поглубже и подольше).
Насколько я понял Платон со своей стороны свою «домашнюю работу» провел на 5 баллов. Его в первую очередь интересовали Azure Cognitive Services и возможности создания и обучения своей нейросети (Machine Learning Studio).
Итого за неделю до мероприятия мы встретились с Платоном лишь однажды, всего на пару часов. Он пытался послать curl (REST API режим) запрос к Azure Speech-to-text сервису используя Python. Он столкнулся с несколькими препятствиями: REST API принимает куски аудио не более 15 сек, при неправильном сочетании параматров (Recognition mode, Language, Output format) не возвращает никакой ошибки, а возвращает HTML то ли с 4хх, то ли с 5хх статусом. Но, к концу вечера, Платон уже имел скрипт для нарезки аудио на куски по 15 сек и успешно отправлял их в API и получал некий внятный текст на французском. Что нас конечно порадовало как исследователей :-)
Я же бездарно потратил несколько часов в попытках собрать какой-то бэкенд JavaScript сервер с нуля. Я брал за основу голую машину Debian 8 Jessie и пользуясь гуглом пытался поднять Node.js и прикрутить к нему библиотеку, но все как-то разваливалось. Какие-то библиотеки недоустанавливались, что-то работало не так. Смысл был в том, что я хотел проверить тот же Speech-to-text сервис, но в режиме client library, который, например, не имеет ограничения в 15 сек. Javascript был выбран постольку поскольку C# и Java в моем понимании в разы сложнее в плане деплоймента (я могу очень сильно ошибаться) и требуют каких-то знаний о том как вызывать среду исполнения (JVM? CLR?). Поскольку реального опыта ни на том ни на другом у меня нет, я думал что смогу осилить JS в микрообъеме необходимом для подключения необходимой библиотеки. Времени на полноценное изучение вопроса не было.
В общем, ничего путного из моих экспериментов не получалось. Единственный полезный вывод который я для себя сделал, что на хакатоне я не буду пытаться использовать какой-то новый для себя язык, а буду работать с PHP который я вроде знаю и, как минимум, понимаю когда, чего, кому и зачем не хватает.
На неделе, предшествующей хакатону, примерно 13 Марта, мы получили по почте приглашение заполнить анкету онлайн.
Анкета
- Имя, Фамилия, Email, номер телефона
- Название команды
- Будете ли вы присутствовать в Доме Радио (la Maison de Radio-Canada) 19 Марта в 18.00.
Варианты ответов: «Да буду присутствовать», «Нет, но буду присутствовать и участвовать а прямой трансляции на YouTube», «Нет, но я ознакомлюсь с записью трансляции позже на YouTube» - Будете ли вы присутствовать в Доме Радио (la Maison de Radio-Canada) 23-25 Марта во время проведения хакатона?
Варианты ответов: «Да буду присутствовать», «Нет, мне бы хотелось работать удаленно.» - Презентация прототипа. Если вы выбрали «удаленный» режим участия, то для презентации своего прототипа вы можете выбрать любое место на свое усмотрение, либо вы можете воспользоваться одним из региональных представительств Radio Canada.
Варианты ответов: «На мое усмотрение», «Воспользоваться региональным представительством» - Необходима ли вам «детская комната». Если вам необходимо предоставить уход за ребенком/детьми (6 мес — 11 лет), то по запросу такая услуга будет предоставлена участникам: Суббота, 8:45 — 22:00 и Воскресенье, 8:45 — 19:00.
Варианты ответов:«Да»,«Нет» - Как вы о нас узнали?
Варианты ответов:«Вебсайт»,«Друзья»,«Рассылка»,«Объявление», «Другое» (поле для заполнения) - Вопросы или комментарии?
Варианты ответов:(поле для заполнения)
Размышления вслух
Мне не очень понятно зачем Agorize или Radio Canada повторно собирали имена, телефоны, почтовые адреса и названия команд. Всю эту информацию мы уже предоставляли когда регистрировали свою команду и как вы помните даже загрузили презентацию.
Информация о предварительной встрече с участниками 19 Марта была приятной новостью. Оставалось только выкроить время чтобы на нее попасть.
Информация о возможности участия команд в удаленном режиме, придавала некую масштабность предстоящему мероприятию. И, даже признаться, слегка пугала возможность появления каких-то гуру AI откуда-нибудь из США или Европы на фоне которых нам будет стыдно показать свой проект, если таковой вообще появится на свет. Успокаивало с другой стороны то, что абсолютно вся переписка и информация об этом хакатоне была на французском. Этот фактор резко сужал потенциальный круг международных участников. (Мысль о международном масштабе у меня возникла после первого же посещения сайта Agorize, поскольку там опубликованы хакатоны из разных стран.)
Детская комната — это по-нашему по-канадски. Так же как и упомянутый в требованиях стандарт WCAG 2.0 AA, «продленка» для детей иллюстрирует перманентное желание канадского общества уровнять права, а главное возможности всех членов общества. Чтобы никакие обстоятельства не могли стать причиной дискриминации в любом ее виде.
День 0 — Понедельник, 19 Марта. На старт!
В понедельник днем нам пришло письмо от организаторов через систему Agorize с логином и паролем к специально созданному под нашу команду аккаунту Azure. Это немного нас взбудоражило, но, поскольку, понедельник — день тяжелый, а мы все, как я уже неоднократно повторял, занятые люди, то всерьез покопаться и «потрогать» этот аккаунт у нас не было возможности. К тому же мы с Платоном уже ознакомились с Azure и нас на тот момент больше интересовал доступ к API Radio Canada, поскольку от него тоже многое зависело и эта часть была неким «белым пятном» в нашей архитектуре.
Тем временем, к 18.00 надо было попасть на презентацию. Я ушел с работы немного пораньше, слава богу до Дома Радио мне идти от работы 30 мин, ну 40 максимум, или 10-15 мин на автобусе. Звездочка тоже обещала быть к 17:45. Платон сказал что тоже подойдет. По итогу Платон немного опоздал к началу презентации и был не месте где-то в 18:35.
Я был на месте к 17:50. В зале было довольно много народу. Звездочка представила меня и Меркурия друг другу. Меркурий подошел немного пораньше и уже успел пообщаться с некоторыми будущими участниками. Звездочка с Меркурием были довольно позитивно настроены по поводу наших шансов на победу. Меркурий высказался по поводу того что многие люди в зале не являются опытными разработчиками, а являются просто дизайнерами, или студентами, такими же как они со Звездочкой или даже просто студентами в сфере бизнеса, у которых возможно и есть неплохие бизнес-идеи, но это не большое преимущество для хакатона. Мы искренне считали: нет прототипа — нет победы.
Хочу отметить что на момент нашей регистрации я рассчитывал что будет соревноваться от 4 до 10 команд максимум. Поскольку было очень мало команд прошедших «полную» регистрацию. На момент 19 Марта, я уже знал что количество команд точно больше 10. Но я не занимался подсчетами, на это не было времени, да и что это меняет в конце концов?
Презентация началась с небольшим опозданием, примерно в 18:10.
Вы можете посмотреть ее на YouTube полностью.
Сначала вступительное слово было предоставлено Maxime St-Pierre — Executive Director, Head of Digital, Radio Canada. Он поприветствовал присутствующих и сказал, в частности, что причина этого хакатона, как и предыдущего годом ранее, это быстро развивающийся мир технологий, за которым следует успевать. Что первый хакатон принес хорошие плоды и практические результаты. Поэтому Radio Canada с оптимизмом смотрит на проведение таких мероприятий.
Затем слово взяла на себя ведущая этого вечера Dominique Gagné
— Directrice, Intelligence d'affaires numériques, Médias numériques, Radio Canada. Она еще раз прошлась по расписанию хакатона на предстоящий уикенд.
От Давида эстафету принял Jean-Francois Gamache — Cloud Solution Architect at Microsoft. Жан рассказал о бессерверной архитектуре (Serverless) которую можно реализовать на базе Azure. А также прошелся по списку ИИ сервисов доступных через платформу Azure.
Затем Жан показал трогательное видео о том как ИИ меняет жизнь людей. Пожалуйста уделите несколько минут своего времени и посмотрите этот фрагмент.
Меня лично такие вещи воодушевляют. Мне нравится наш век технологий. Мне нравится когда технологии приносят реальную пользу людям. Мне нравится чувствовать себя частью этих изменений. Мне нравится тот факт что, то о чем писали фантасты пару десятков лет назад, претворяется в жизнь прямо у нас на глазах. Наверное эти чувства и толкают меня не останавливаться и изучать новое снова и снова.
Далее Жан продемонстрировал несколько проектов, связанных с ИИ, взятых из публичного репозитория Microsoft на GitHub и немного отсюда.
После этого Жан перешел к прототипу серверлес приложения, которое вытягивает все твиты по определенному хэштэгу в реальном режиме времени (видимо через Твитер API). Затем посылает содержимое твита на анализ в Text Analytics API. В результате анализа возвращается оценка текста от 0 до 1, где 0 это резко отрицательное содержание, а 1 — абсолютно положительный текст. Далее в зависимости от оценки выбирается следующее действие. Так для отрицательных твитов генерится емэйл, а положительные отправляются в Slack чат канал. А так же независимо от результата анализа все результаты оценки отправляются в какую-то утилиту для мониторинга и визуализации. Жан несколько раз повторил что подобное серверлес решение может быть создано за 10-15 минут средствами Azure. Демонстрация включала тот самый хэштэг #hackathonRC, который нас просили твитнуть в самом начале. Это видимо должно было подтвердить что приложение работает в реальном режиме времени. Звездочка даже успела заметить где-то промелькнувший на экране ее твит.
Завершая часть посвященную Azure Жан и Давид ответили на несколько вопросов аудитории.
После этого был объявлен 10-ти минутный перерыв чтобы сходить в туалет и/или перекусить.
Мы воспользовались перерывом чтобы еще раз познакомиться друг с другом. Мы обменялись впечатлениями от презентации. Вся команда сошлась во мнении что подача довольно живая и интересная.
Еще раз проговорили идею для нашего прототипа. И распределили роли:
Платон — работа с API Radio Canada — тянет данные (пока неизвестно какие) — посылает их на обработку в Azure API (пока неизвестно какой) — получает результат анализа и складывает их в базу данных.
Я — получаю данные из базы данных — отправляю результаты в виде некоего поискового микросервиса на фронт енд.
Звездочка и Меркурий — создают HTML для визуализации результатов поиска и JS функционал для динамического поиска (при вводе каждого символа) для более симпатичного эффекта на презентации.
Фаэтон, поскольку постоянно пропадает, роль не определена. Но в случае проявления инициативы должен помочь ребятам с фронт ендом.
Все члены команды были довольны своими ролями. Все чувствовали что поставленная часть им по силам, хотя много вопросов витало в воздухе, но пока не начнем делать что-то руками, задавать их нет смысла.
Итак, после перерыва, пришла очередь для специалистов Radio Canada.
- Neuro — публичный API используется на новостном портале ici.radio-canada.ca
- Validation Media — API только для участников хакатона, используется для работы с медиа файлами.
- Sitesearch — API только для участников хакатона, используется на двух музыкальных сайтах ICI MUSIQUE и CBC MISUC
- Via Foura — внешний API только для участников хакатона, используется для работы с комментариями.
Поскольку большая часть всех API не имеет подробной документации, Вьет пообещал предоставить все примеры запросов в виде коллекции для Postman.
Мне кажется это удобный инструмент, который позволяет не только формировать запросы, но и собирать их в коллекции (это позволяет систематизировать хранение запросов по источника, назначению, юзер кейсам, тест кейсам или как вам еще захочется, а также обмениваться с коллегами готовыми уже подготовленными и протестированными запросами).
К тому же Postman просто записывает историю моих запросов. Это позволяет легче отлаживать запросы и не терять удачные или неудачные попытки, ну и еще многое, до чего у меня пока не дошли руки.
Перед тем как передать слово следующему выступающему, Вьет также ответил на несколько вопросов собравшихся, не только в зале, но и удаленно наблюдаюших через YouTube трансляцию.
Далее слово было предоставлено специалисту по UI и Web accessibility (извините, снова не могу нагуглить правильный перевод для этого термина на русский) Olivier Fortin. Оливье обратил внимание аудитории что примерно 13.7% взрослого населения Канады имеет какие-то трудности для нормального восприятия.
В Канаде считается плохим тоном произносить слово — инвалид. Тут нет инвалидов, здесь есть люди с ограниченными возможностями.
Я уже 7 лет живу в Канаде, но, до сих пор, не могу ни согласиться с таким подходом, ни отвергнуть его. С одной стороны, я люблю использовать четкие термины чтобы выражать свои мысли. И люблю когда другие тоже используют слова по их прямому назначению. С другой стороны, слово «инвалид» не дает нам понимания, что за человек стоит за этим термином. Если исходить из моего обывательского восприятия мира это может с одинаковой вероятностью быть и человек без руки или ноги и диабетик, и хромой и косой.
Причем если поиграть в игру «ассоциация», то слепой или глухой, приходит на ум далеко не первым или вторым, в ответ на «инвалид». Так что в этом смысле я согласен с канадцами и готов забанить это слово.
Еще один интересный факт восприятия мира и слов (возможно только я такой?). Продолжая игру в ассоциации на слово ивалид у меня далеко не сразу возникнет образ пожилого человека. Но если брать статистику, то среди пожилых людей найдется очень много людей с «ограниченными возможностями» ;-) Я думаю что канадская статистика 13.7% включает в себя эту категорию пожилых граждан.
К пенсионерам и пожилым тут отношение очень уважительное. Они в отличие от российских пенсионеров живут во многом даже лучше более молодого и трудоспособного населения. Приличная пенсия, приличные сбережения и выплаченная ипотека, различные льготы и пособия позволяют пенсионнрам иметь намного более выигрышный баланс доходов-налогов-расходов, по сравнению с работающими гражданами. Я не говорю о 100% пенсионеров, просто озвучиваю то о чем все думают, знают и обсуждают. И, наверное, мы даже стремимся именно к этому — к обеспеченной и сытой старости.
Если будете летом в Канаде, обратите внимание на дорогие кабриолеты на дорогах страны — в большинстве случаев вы обнаружите за рулем пожилых людей. Довольно часто можно видеть седых байкеров. Первые годы по приезду мы еще удивлялись этому, а сейчас почти не замечаем — это стало нормой для нашего восприятия.
Но с другой стороны, «человек с ограниченными возможностями» звучит хоть и политкорректно, но, на мой субъективный взгляд, также не отражает чего-то конкретного. То есть меняем шило на мыло.
Исходя из этой статистики получается что только в нашей провинции Квебек мы имеем около 1 миллиона человек с ограниченными способностями. Вот почему Web accessibility настолько важно в наш век технологий и Интернета, чтобы обеспечить равный доступ к информации, товарам и услугам для всех без исключения.
Оливье рассказал на что в первую очередь следует обращать внимание при разработке HTML страниц:
- alt — текстовый аттрибут для изображений
- legend — тэг для форм (насколько я понимаю)
- отслеживание статуса состояния страницы и в частности фокуса. Страница должна быть сконструирована таким образом чтобы по ней было удобно перемещаться используя только клавиатуру
- все линки/ссылки должны иметь текстовые подписи
- сообщения об ошибках внутри форм должны быть понятными и однозначными. ( Я думаю имеется в виду что должно быть понятно какое именно поле вызвало ошибку, а текст ошибки должен быть описательным. А не просто подсветить красной рамкой неверно введенное значение, поскольку потенциальный посетитель может не иметь возможности видеть эту рамку)
- обращайте особое внимание на семантику и тестируйте/проверяйте/валидируйте свой HTML код. Это поможет вам получить не только работающую страницу или сайт, но и позволит избежать проблем и доработок в будущем.
Оливье отметил, что соблюдение и следование этим правилам позволит не только соблюдать стандарты как таковые, но и улучшит SEO вашего сайта, а также его эргономику.
Затем он порекомендовал несколько приложений для тестирования Web accessibility.
- Wave — Chrome extension
- aXe — Chrome extension
- Tota11y — Chrome extension
- NVDA — скрин-ридер для Windows
- VoiceOver — скрин-ридер для MacOS и iOS
Немного повеселил вопрос одной из участниц, которая напрямую задала вопрос о том почему Web accessibility придается такое значение и насколько важно соблюдать все эти правила? (подразумевая, как мне показалось: какого лешего нам надо тратить свое драгоценное время на все эти танцы с бубном?). На что получила ответ, что если она внимательно читала технические трабования к данному хакатону, то WCAG 2.0 это часть этих технических требований.
Но участница не была удовлетворена и задала еще один вопрос «в лоб» (что большая редкость в Канаде, обычно все все стараются читать между строк и не задавать неудобных вопросов): будет ли кто-то проверять каждую строку кода на соответствие этим высоким треованиям. Оливье и Доминик как можно вежливее ответили, что во время хакатона спациалисты Radio Canada, Microsoft и других партнеров будут всегда рядом, чтобы помочь если возникнут какие-либо вопросы. И что, по правде сказать, у жюри конечно же не будет времени проверять каждую строку кода в каждом проекте.
Под занавес было еще пару вопросов по использованию API заданными зрителями YouTube трансляции.
Нас всех поблагодарили, пожелали успехов на предстоящем хакатоне и, так сказать, до встречи в пятницу.
Наша небольшая команда еще раз собралась в фойе. Перекинулись парой слов. Надо сказать, что несмотря на усталость после трудового дня и 2-х часов в сидячем положении, у всех на лицах были улыбки. И мы были полны энтузиазма и в предвкушении предстоящего приключения под названием «хакатон».
Работая над этой второй частью своего рассказа, я пересмотрел видео от 19 марта несколько раз, в поисках ссылок, имен, деталей и т.д. Хочу заметить и хотелось бы чтобы вы понимали, что выходя вечером после презентации у меня в голове не было всей только что описанной картины. 2 часа презентации, без возможности отмотать назад или поставить на паузу или попросить повторить то, что не расслышал. Это не тоже самое, что иметь уже опубликованное видео и текст, которые можно перечитать и пересмотреть. В моей голове была каша. Все это надо было пересмотреть, осмыслить, попробовать, проанализировать. Выделить то, что может быть использовано быстро и на практике, а что снова ляжет в большой бэклог того, что еще надо изучить в будущем.
Мы все живем в диком ритме. Нет времени остановиться и изучить какой-либо заинтересовавший нас вопрос или осмыслить и проанализировать какую-то появившуюся информацию.
Мне не нравится то с какой скоростью меня несет река времени, не давая мне принимать свои собственные решения, а лишь заставляя следовать за течением событий.
Это одна из причин толкнувших меня на этот хакатон. Она же стала причиной того что на свет появилась эта статья. Я просто пытаюсь проанализировать и задокументировать то что со мной происходит. Я верю что это важно. И надеюсь, что это интересно читателям.
На этом позвольте поставить… «продолжение следует»
Я не хочу потерять интерес тех кто ждет продолжение первой части.
И сразу же приступаю к написанию третьей, думаю заключительной части.
Автор: dzsysop