Історія моєї участі в Ubuntu Scope Showdown 2016


15 січня 2016 року аннонсирован щорічний конкурс Ubuntu Scope Showdown! Учасникам пропонувалося протягом шести тижнів розробити з нуля і опублікувати в магазині додатків свій скоуп для Unity 8 (офіційний переклад слова scope як «лінза» зовсім не радує, тому нехай буде просто скоуп). За ці півтора місяці було розроблено близько 15 скоупов, ще півтора місяця тривало голосування журі (в три рази довше заявлених двох тижнів). В результаті переможцями виявилися Roman Shchekin, Ricardo Silva, Michael Weimann і Pieter Engelbrecht. Про свій досвід участі я б хотів розповісти під хабракатом.


Ідея

Для початку нагадаю, що саме є scope по відношенню до Unity 8:
  1. з точки зору розробника це ні що інше як плагін до середовища робочого оточення;
  2. з точки зору користувача це стартовий екран, що дозволяє швидко отримати доступ до необхідної інформації без запуску окремих додатків, кастомизируемая оболонка так сказати, конкурент віджетів.


Мою увагу до конкурсу було залучено призами — відмінний неттоп з нашими-то ринковими цінами на залізо для мене просто ласий шматочок. Та й своє залізо вже застаріло, тому хотілося поборотися саме за головний приз. Телефони, контролери, інша дрібнота — приємно, але не більше ніж.

Окей, є бажання брати участь, але потрібна ідея для скоупа. Знову ж для довідки уточню, що основне призначення скоупа це пошук інформації, будь то пошук в книжковому магазині, пошук інформації про актуальні фільмах і події, пошук зображень в соцмережах і так далі (вторинне призначення це відображення поточного стану, наприклад показ поточної погоди або моніторинг ресурсів віддаленої віртуальної машини). Пам'ятається, в 2014 році був подібний конкурс, і тоді я з-за відсутності ідеї поневірялася кілька тижнів, а потім закинув свої напрацювання по створенню скоупа на тему Dota 2 (якої тоді захоплювався). Останні кілька років я старанно вивчаю різні онлайн-курси (навіть заповнив про собі сторінку https://github.com/open-source-society/computer-science)тому зовсім не дивно, що мені в голову прийшла думка створити скоуп для пошуку MOOC-курсів з різних джерел.

Джерела

Реалізовувати свій задум я почав з вивчення можливостей, які надають «основні гравці ринку онлайн-курсів, а саме Coursera, edX, Udacity і Udemy. Коротко по кожному:

Coursera
Добротний і непогано продуманий API. Хороша документація. Одним словом — обличчям до людей, працювати просто і зручно, можна спробувати прямо в браузері. Віддають JSON, вміст налаштовується.

edX
Тут мене чекав елемент розчарування — є нескінченна кількість сторінок з описом API, навіть якась конкретика про методи і опис параметрів, але насправді ще нічого не працює, а коли запрацює — незрозуміло. В якості тимчасового рішення довелося використовувати RSS стрічку. В ній близько 100 курсів, вміст регулярно оновлюється.

Udacity
Хороший API буде, але пізніше, а поки є тільки одне посилання, за якою можна отримати всі доступні курси. Все краще, ніж RSS з довільним вмістом, так що скаржитися не доводиться.

Udemy
Самий зручний, гнучкий і приємний API. Можна налаштувати практично все, що завгодно. Єдине що мені було не дуже зрозуміло, навіщо прикручувати «авторизацію» — перед використанням API пропонувалося отримати ключ доступу, який потім передавався б у хидерах. У мене було сильне відчуття того, що я був першим, хто взагалі цей ключ отримав, тому що підтримка діяла вкрай незграбно.

Інші джерела
Пізніше додалися iversity і OpenLearning. З «багатством» API дуже близькі до Udacity, детально розглядати не буду.

Загалом я був задоволений. Джерела надавали всю бажану інформацію, а саме опис курсу, деталі проведення (тривалість, рівень складності і тд), посилання на зображення і відео-візитки, інформацію про інструкторів. Природно вона [інформація] була різношерста, місцями неповна, по-різному організована. Завдання пошуку, структуризації і показу в прийнятному для користувача вигляді і потрібно було вирішити. Давши проекту тимчасове назва CourseExplorer, я взявся за розробку.

Інструментарій (і трохи деталей)

В Canonical розробили спеціальний інструментарій для створення скоупов. Фізично кожен скоуп являє собою динамічну бібліотеку. Притому ближче до конкурсу оновили список доступних мовних засобів: якщо за кілька місяців до цього єдиним безальтернативним варіантом C++, то вже в рамках конкурсу пропонувалося використовувати JavaScript і Go. Природно акцент був на нові мови і технології, щоб залучити новачків. Я ж вибрав C++, так як серед теймплейтов був присутній «C++ (Qt)», що не могло не порадувати бувалого Qt розробника.

Тут мене чекало перше розчарування — в шаблоні був «голий» C++. Я навіть створив проект скоупа на C++ без Qt'a, щоб спробувати побачити різницю. Як виявилося, у шаблоні з Qt в одному місці використовується QJsonDocument. І все :) «Лааааадно», — подумав я, — «будемо гнути свою лінію!». Було вирішено використовувати Qt у всіх місцях, а на чистий C++ переходити тільки у місцях взаємодії з API. До речі про API: по суті, пропонувалося реалізувати у своєму проекті три сутності (унаследоваться від деяких базових класів):
Scope
Сам скоуп, здатний обробляти запити на пошук та відображення інформації. В моєму випадку практично не вимагав доопрацювання.
Query
«Робоча конячка» скоупа, здійснює пошук інформації та поділ за категоріями. Реалізація звелася до послідовного викликом класів-клієнтів джерел (які в свою чергу здійснювали розбір даних, що повертаються сервісами).
Preview
Відображення раніше знайденої і спеціальним чином структурованої інформації в декларативному стилі з допомогою заздалегідь заданого безлічі елементів управління.
Про исходники розповідати сенсу немає, можете самі подивитися тут: GitHub

Для прискорення відображення результатів по порожньому запитом було застосовано кешування (в офіційній документації таке використання іменується surfacing mode). Крім цього в скоупе був застосований механізм мапінгу категорій, що надаються джерелом, на внутрішні категорії скоупа. В деяких випадках доводилося два десятка категорій зводити до своїх десяти (наприклад, Literature та History звелося Humanities), а іноді навпаки — використовувати одну внутрішню категорію для всіх категорій оригінального джерела (Web design Desktop development, JavaScript звелися в одну IT & Tech).

Візуальна складова

На певному етапі я зрозумів, що потрібно приводити свої напрацювання в товарний вигляд, правильно назвати і намалювати іконку. Поміркувавши кілька хвилин я прийшов до висновку, що непогано було б назвати скоуп на початкову літеру алфавіту, щоб він завжди був в топі виділеного за алфавітом переліку встановлених скоупов на одному з базових екранів ОС. Так народилася назва Academy. З іконкою, на жаль, так швидко не вийшло розправитися. Ідею довелося шукати вже не в своїй голові, а в одному з сервісів створення логотипів. На очі попався значок атома з частинками на орбітах. Він мені відразу сподобався, так як у багатьох людей твердо асоціюється з наукою. Я перемалював його в одному популярному графічному редакторі. Вийшло погано, що тут скажеш, квапився. Однак перша версія полетіла у магазин саме в такому вигляді. Наступного разу я вирішив взятися за іконку грунтовніше і перемалював стару концепцію з підвищеною якістю. Вийшло краще, бути може тому, що вже не було такого тиску термінів. На цьому варіанті я було зовсім хотів зупинитися, але мені пощастило випадково в G+ натрапив на пост одного OpenSource дизайнера, він якраз малював іконки для деяких додатків UP. Погодився намалювати і мені :) Так вийшов кінцевий варіант, який Ви можете бачити нижче. Інші компоненти інтерфейсу я підвів під колірний дизайн іконки, вийшло прямо-таки миленько.


Баг

В якійсь дії в моєму скоупе почали приводити до падіння Unity. Не хотілося вірити, що це моїх рук справа, тому я протестував всі стабільні версії без останніх змін — баг був присутній. Благо вдалося швидко зв'язатися з розробниками Unity 8, разом ми знайшли проблему. Виявилося, що движок скоупов не може коректно реагувати на абсолютно однакові результати (так як всередині виробляє порівняння по всіх полях). Виявилося, що це edX так псує життя, надсилає два однакових опису. Проста перевірка на основі QSet і проблема вирішена.

Підсумок

Отже, я заповнив форму учасника і став чекати. Спочатку чекав закінчення конкурсу, потім запланованих двох тижнів голосування журі, а потім ще двох, і ще двох. Зізнатися, мені було набридло вже чекати. За цей час Academy вибрався в топ скоупов за рейтингом, було зібрано кілька вкрай позитивних відгуків на різних мовах, а я потихеньку займався оптимизациями і обробляв pull-request'и з локалізаціями.

І ось довгоочікувана оголошення переможців. Розподіл місць вже було озвучено в пролозі, так що можете швиденько повернутися в початок, щоб ще раз побачити призерів, а я в цей час буду стомлено радіти, адже Roman Shchekin — це я!

P. S. Кілька скріншотів готового скоупа можна побачити тут: uappexplorer/academy, анонс результатів developer.ubuntu.com
P. S. S. Може бути повинно бути на гиктаймсе. Замислювалося як легке чтиво, ІТ історія і не більше того. Критика вітається!

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.