{
    "version": "https:\/\/jsonfeed.org\/version\/1",
    "title": "Блог Антона Репушко: заметки с тегом соревнования",
    "_rss_description": "Блог Антона Репушко",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": "",
    "_itunes_explicit": "",
    "home_page_url": "https:\/\/repushko.com\/tags\/sorevnovaniya\/",
    "feed_url": "https:\/\/repushko.com\/tags\/sorevnovaniya\/json\/",
    "icon": "https:\/\/repushko.com\/user\/userpic@2x.jpg?1608852798",
    "author": {
        "name": "Антон Репушко",
        "url": "https:\/\/repushko.com\/",
        "avatar": "https:\/\/repushko.com\/user\/userpic@2x.jpg?1608852798"
    },
    "items": [
        {
            "id": "49",
            "url": "https:\/\/repushko.com\/all\/openeds2020\/",
            "title": "Дневник соревнования OpenEDS 2020",
            "content_html": "<p>Мы со <a href=\"https:\/\/www.linkedin.com\/in\/sviatoslav-skoblov\">Святославом Скобловым<\/a> 2 месяца решали <a href=\"https:\/\/research.fb.com\/programs\/openeds-2020-challenge\/\">OpenEDS 2020 Challenge<\/a>, где в одном треке заняли первое место, а во втором восьмое. Про второй трек тут не будет, потому что он скучный и не очень интересный. И ещё нас изредка консультировал Вова Михеюшкин по всяким CV-вопросам. Может быть кому-то тоже будет интересно почитать, как проходят соревнования по ML.<\/p>\n<h2>Про соревнование<\/h2>\n<p>На основе <a href=\"https:\/\/arxiv.org\/abs\/2005.03876\">датасета OpenEDS2020<\/a>, собранного <a href=\"https:\/\/research.fb.com\/category\/augmented-reality-virtual-reality\/\">Facebook Reality Labs<\/a>, запустили два трека. Оба связаны с VR\/AR, Oculus и всем таким. Треки шли в рамках <a href=\"https:\/\/openeyes-workshop.github.io\/\">воркшопа к ECCV 2020<\/a>.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/repushko.com\/pictures\/099.png\" width=\"640\" height=\"400\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Один из тысяч кадров<\/div>\n<\/div>\n<p><b>В первом треке<\/b> даны последовательности по 100 (трейн) и 55 (валидация) фотографий глаз с gaze-векторами каждого кадра. Представьте, что вы умеет стрелять лазерами из глаз. Вот отнормированный вектор из вашего зрачка до объекта на VR\/AR экране и есть gaze-vector.<br \/>\nЧастота записи последовательности — 100Гц. В тесте были те же последовательности по 50 кадров, но уже без настоящих векторов. Общая задача — научиться предсказывать по 50 кадрам последовательности в тесте следующие 5 кадров (т.e. 50мс). Нужно это для <a href=\"https:\/\/en.wikipedia.org\/wiki\/Foveated_rendering\">foveated rendering<\/a>.<\/p>\n<p><b>Во втором треке<\/b> нужно было сегментировать части глаза (бэкграунд, склеру, радужку и зрачок) по кривой разметке 5% данных в каждой последовательности из 200 кадров. Многие (по отзывам других участников) боролись именно с кривой разметкой, мы же начали решать второй трек за 2 недели до конца и не слишком преуспели, хотя разрыв между топом очень маленький. Важнее и интереснее для нас был именно первый трек.<\/p>\n<h2>Технические особенности<\/h2>\n<p>Соревнование проводилось на платформе <a href=\"https:\/\/evalai.cloudcv.org\/\">EvalAI<\/a>. Там можно скрывать свои сабмиты, но перед этим на какую-то долю секунды они попадают на общую таблицу. Поэтому было решено написать своего бота, который бы мониторил изменения лидерборда, генерировал красивые картинки и присылал их в наш общий диалог. С помощью него мы могли трекать и отслеживать настоящих лидеров, а не те результаты, которые были показаны вручную.<br \/>\nБыл только 1 сабмит в день, каждую ночь предыдущая возможность сабмита сгорала.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/repushko.com\/pictures\/lb.jpg\" width=\"1280\" height=\"897\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Команда BTSD скрыла свой сабмит<\/div>\n<\/div>\n<p>Своего железа у нас было не очень много, поэтому мы время от времени арендовали машины на <a href=\"https:\/\/vast.ai\/\">vast.ai<\/a>. Потратили на это около 230 долларов за 2 месяца соревнования.<\/p>\n<h2>Дневник<\/h2>\n<p><i>1 июня<\/i><br \/>\nСоздан чат в Телеграме, начали разбираться в предметной области, с платформой, читать правила. Выяснили, как части глаза называются на английском. Создали репозиторий на Гитхабе и настроили всем доступы.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/repushko.com\/pictures\/eye.jpg\" width=\"500\" height=\"239\" alt=\"\" \/>\n<\/div>\n<p><i>3 июня<\/i><br \/>\nВыкачиваются данные, визуально посмотрели gaze-вектора. Появляется идея классическими CV-методами поисков контуров искать зрачок на изображении и смотреть на изменение его положение внутри склеры. Разбираемся в типах движения глаза (саккады, скольжения, статичное положение и т. д.). Наконец-то понимаем вообще в чём суть трека.<\/p>\n<p><i>4 июня<\/i><br \/>\nНашли <a href=\"https:\/\/pupil-labs.com\/\">pupil-labs<\/a>, с помощью оборудования которых Facebook генерировал свой датасет. Ничего полезного, но очень интересно.<br \/>\nНаучились находить зрачок обычными CV методами. В итоге это потом использовалось только в визуализациях.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/repushko.com\/pictures\/pupil_center.jpg\" width=\"399\" height=\"133\" alt=\"\" \/>\n<\/div>\n<p>Пытались добавить ещё всяких контуров, но ничего не получилось.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/repushko.com\/pictures\/countur_orig.jpg\" width=\"640\" height=\"400\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Оригинальный кадр<\/div>\n<\/div>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/repushko.com\/pictures\/countur.jpg\" width=\"657\" height=\"417\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Посчитанный контур<\/div>\n<\/div>\n<p><b>Важное решение<\/b>: посчитали правильным разделить пайплайн на две части: gaze-estimator (модель, которая по кадру предсказывает его gaze-вектор) и gaze-predictor (модель, которая по истории gaze-векторов предсказывает gaze-вектора следующих 5 кадров).<\/p>\n<p><i>6 июня<\/i><br \/>\nНачали визуализировать вектора, чтобы посмотреть на всю последовательность целиком. Нам нужен gaze-predictor, но насколько сложным он будет? Если в данных в основном статичное положение глаза, то тогда сложная модель тут не нужна (так в итоге и оказалось).<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/repushko.com\/pictures\/static_gaze.jpg\" width=\"518\" height=\"281\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Глаз практически неподвижен<\/div>\n<\/div>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/repushko.com\/pictures\/saccade.jpg\" width=\"423\" height=\"358\" alt=\"\" \/>\n<div class=\"e2-text-caption\">А тут уже двигается<\/div>\n<\/div>\n<p>Где-то тут было решено для обучения эстиматора (модели, которая будет по кадру предсказывать gaze-вектор) использовать <a href=\"https:\/\/habr.com\/ru\/company\/smartengines\/blog\/264677\/\">аугментации<\/a>. Но проблема в том, что при изменении изображения нужно будет менять и изначальный вектор: вращаешь изображение -> вращаешь вектор. Решили патчить <a href=\"https:\/\/github.com\/albumentations-team\/albumentations\">albumentations<\/a>.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/repushko.com\/pictures\/vector_visualize.jpg\" width=\"391\" height=\"251\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Проекция вектора<\/div>\n<\/div>\n<p><i>11 июня<\/i><br \/>\nНачали гонять первые модели, оптимизировать параметры. Стали разбираться с предиктором. Попробовали всякие стандартные штуки для форкаста временных рядов типа <a href=\"https:\/\/facebook.github.io\/prophet\/\">prophet<\/a>, но они предсказуемо не зашли из-за специфики данных: нельзя вытащить сезонность (которой нет), другие фичи вроде дней недели, времени и прочего, что активно эксплуатируется в таких местах.<br \/>\nОбучили первый resnet для эстиматора.<\/p>\n<p><i>12 июня<\/i><br \/>\nСкор первого трека: <b>0.1556<\/b><\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/repushko.com\/pictures\/submit.jpg\" width=\"949\" height=\"355\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Сделали первый сабмит (команда baccaddes)<\/div>\n<\/div>\n<p>Начали глубже разбираться с метрикой и сравнивать предикты модели с реальными данными, чтобы понять, где косяк. Настроили честную локальную валидацию эстиматора.<\/p>\n<p><i>15 июня<\/i><br \/>\nСкор первого трека: <b> 0.0786<\/b><\/p>\n<p>Засабмитили улучшенную модель (VAR поверх хорошего эстиматора).<br \/>\nЭто приблизило нас к остальным на ЛБ.<\/p>\n<p><i>16 июня<\/i><br \/>\nСкор первого трека: <b>0.0747<\/b><\/p>\n<p>Написан и запущен Big Brother — бот, который следит за ЛБ. С этого момента до конца соревнования он работал с одним перебоем на полдня, после без ошибок.<br \/>\nЗасабмитили скользящее среднее по 5 последним кадрам.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/repushko.com\/pictures\/submit_bot.jpg\" width=\"1280\" height=\"708\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Бот отрабатывает как надо<\/div>\n<\/div>\n<p><i>17 июня<\/i><\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/repushko.com\/pictures\/ezgif.com-video-to-gif.gif\" width=\"256\" height=\"160\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Начали смотреть глазами на глаза (это анимация одной последовательности)<\/div>\n<\/div>\n<p>Посмотрели на статические генераторы таких данных (NVGaze и UnityEyes). В итоге для сореванования их так и не использовали.<\/p>\n<p><i>22 июня<\/i><br \/>\nПредикт эстиматора очень грязный: колбасит вектора между кадрами и получается, что между ними как будто бы сильное движение глаза.<\/p>\n<p><i>28 июня<\/i><br \/>\nПодумали, что было бы классно научиться группировать авторов одних и тех же последовательностей (количество участников при сборе датасета на порядки меньше числа последовательностей), чтобы вытаскивать оттуда какие-то фичи специфичные для конкретного участника. Эту идею так и не доделали.<\/p>\n<p>Начали думать про классическое CV снова: хотели вытаскивать крайние точки глаз и прочее.<\/p>\n<p>Обучили LSTM для предиктора. Сработало чуточку хуже средних по 5 кадрам.<\/p>\n<p><i>29 июня<\/i><br \/>\nЗакончили патчить albumentations.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/repushko.com\/pictures\/orig.jpg\" width=\"387\" height=\"251\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Оригинальный кадр<\/div>\n<\/div>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/repushko.com\/pictures\/flipped.jpg\" width=\"385\" height=\"249\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Сработавший Vertical Flip (и пересчитанный вектор)<\/div>\n<\/div>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/repushko.com\/pictures\/shift_scale_rotate.jpg\" width=\"380\" height=\"247\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Живой ShiftScaleRotate<\/div>\n<\/div>\n<p><i>1 июля<\/i><br \/>\nНачали подозревать, что в тесте всё таки в основном статика. И что самый большой буст тут даст улучшение эстиматора, а не предиктора.<\/p>\n<p>Нафигачили для эстиматора аугментаций.<\/p>\n<p><i>4 июля<\/i><br \/>\nСкор первого трека: <b>0.0613<\/b><\/p>\n<p>Стали думать, как сделать интереснее предиктор. Взяли потыкать <a href=\"https:\/\/github.com\/unit8co\/darts\">darts<\/a> — это такой враппер над всякими стандартными моделями для форкаста.<\/p>\n<p>Запустили старый метод среднего по кадрам (или какую-то оч простую эвристику) над данными нового эстиматора. Очень сильно улучшились.<\/p>\n<p><i>5 июля<\/i><br \/>\nСкор первого трека: <b>0.0570<\/b><\/p>\n<p>Выучили пачку effnet’ов (до этого был resnet). Начали дробить на фолды и мешать предикты с разных фолдов.<\/p>\n<p>Сняли тачку на <a href=\"https:\/\/vast.ai\">vast.ai<\/a>.<\/p>\n<p>Посмотрели на тестовые данные на основе более-менее нормальных предиктов эстиматора. Оказалось, что какая-то динамика в последних 10 кадрах последовательности есть всего в 600-700 последовательностях из 6400.<\/p>\n<p>Засабмитил старые методы предикта на среднем фолдов effnet’а. Почти до самого конца это было нашим лучшим результатом и первым местом на ЛБ.<\/p>\n<p><i>9 июля<\/i><br \/>\nОбучили mobnet. Стали экспериментировать с предиктором: ExponentialSmoothing, VAR, ARIMA и т. д.<br \/>\nМетоды ничего не докинули, а некоторые и ухудшили скор относительно просто среднего.<br \/>\nСкор самого предиктора при этом был очень хороший, около 0.000400+ на кадр по их метрике.<\/p>\n<p>Первый раз открыли данные второго трека, порисовали маски.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/repushko.com\/pictures\/mask.jpg\" width=\"1098\" height=\"1034\" alt=\"\" \/>\n<\/div>\n<p><i>10 июля<\/i><br \/>\nЗасабмитили скользящее среднее по 3 кадрам на куче разных фолдов — не сработало.<\/p>\n<p>Постарались достраивать вектора регрессией. Тоже не сработало.<\/p>\n<p><i>11 июля<\/i><br \/>\nНачали играться с фильтрами над сигналом, чтобы сгладить разницу предиктов эстиматора между соседними кадрами. Получалось хорошо, использовали <a href=\"https:\/\/en.wikipedia.org\/wiki\/Savitzky%E2%80%93Golay_filter\">фильтр Савицки-Голая<\/a>. Кажется, что всякие неровности эстиматора очень красиво сглаживаются.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/repushko.com\/pictures\/savgol_2.jpg\" width=\"751\" height=\"558\" alt=\"\" \/>\n<\/div>\n<p><i>12 июля<\/i><br \/>\nРазбирались с предиктором. Выяснили, что наша регрессия багованная и искали ошибку в разнице валидаций друг у друга. Нашли. Смотрели глазами на фильтрованные предикты и думали, что делать дальше.<\/p>\n<p><i>14 июля<\/i><br \/>\nНарисовали красивые картинки градиентов по разным осям между двумя соседними кадрами по предиктам на всём тесте. Выяснили, что у нас действительно всё — статика. Поэтому опять же нет смысла во всяких сложных моделях предиктора.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/repushko.com\/pictures\/gradient_x.jpg\" width=\"664\" height=\"422\" alt=\"\" \/>\n<\/div>\n<p>Выяснили, что локальная метрика эстиматора напрямую коррелирует с результатами на ЛБ и что результат одного хорошего фолда лучше, чем его же со смесью фолдов чуть-чуть хуже. Опять упёрлись в то, что надо дотюнивать эстиматор. Вернулись к resnet’у.<\/p>\n<p><i>14 июля — 23 июля<\/i><br \/>\nСкор первого трека: <b>0.0552<\/b><\/p>\n<p>Разбирались с сегментацией, удивлялись кривой разметке, сложным случая с закрытыми глазами и т. д.<\/p>\n<p>Вытюнили 1 фолд для эстиматора до ошибки 0.000197 (в 3 раза лучше прошлых). В предиктор засунули простую эвристику: если статика, то скользящее среднее по 2 последним кадрам, а если была динамика в последних 5 кадрах, то добавляем градиент дальше до упора (из-за особенностей движения глаза, там бОльшая часть движений — линейная).<\/p>\n<p><i>23 июля — 29 июля<\/i><br \/>\nТюнили и думали над сегментацией. Смотрели на то, как нам применить синтетические данные в сегментаци. Генерировали синтетику.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/repushko.com\/pictures\/unity_eye.jpg\" width=\"1148\" height=\"648\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Типичный несуществующий глаз<\/div>\n<\/div>\n<p>Из интересного: один сабмит пропустили, потому что кое-кто заснул от усталости и не слышал звонков с просьбой прислать данные. Два сабмита в два дня были сделаны за 30 и 20 секунд до сгорания.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/repushko.com\/pictures\/sega.png\" width=\"720\" height=\"720\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Кусочек каких-то сравнений моделей по сегментации<\/div>\n<\/div>\n<p><i>30 июля — 31 июля<\/i><br \/>\nСкор первого трека: <b>0.0537<\/b><\/p>\n<p>Смотрели и думали над всякими сложными случаями в сегментации<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/repushko.com\/pictures\/sega2.jpg\" width=\"1280\" height=\"287\" alt=\"\" \/>\n<\/div>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/repushko.com\/pictures\/sega3.jpg\" width=\"1280\" height=\"277\" alt=\"\" \/>\n<\/div>\n<p>По первому треку доучили остальные бленды эстиматора, сблендили и засабмитили. Так и осталось нашим лучшим результатом.<\/p>\n<p>По сегментации остались на 8ом месте.<\/p>\n<h2>Что хотели попробовать, но не попробовали<\/h2>\n<ul>\n<li>Не использовали никакую синтетику, а скорее всгео надо было бы. Можно и в обоих треках<\/li>\n<li>Надо было учить LSTM на чистых данных (в том числе из теста и из трейна) и сразу на векторах. Наши эвристики в итоге были по каждой оси отдельно<\/li>\n<\/ul>\n",
            "date_published": "2020-08-04T21:38:13+03:00",
            "date_modified": "2020-08-17T15:21:44+03:00",
            "image": "https:\/\/repushko.com\/pictures\/099.png",
            "_date_published_rfc2822": "Tue, 04 Aug 2020 21:38:13 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "49",
            "_e2_data": {
                "is_favourite": true,
                "links_required": [],
                "og_images": [
                    "https:\/\/repushko.com\/pictures\/099.png",
                    "https:\/\/repushko.com\/pictures\/lb.jpg",
                    "https:\/\/repushko.com\/pictures\/eye.jpg",
                    "https:\/\/repushko.com\/pictures\/pupil_center.jpg",
                    "https:\/\/repushko.com\/pictures\/countur_orig.jpg",
                    "https:\/\/repushko.com\/pictures\/countur.jpg",
                    "https:\/\/repushko.com\/pictures\/static_gaze.jpg",
                    "https:\/\/repushko.com\/pictures\/saccade.jpg",
                    "https:\/\/repushko.com\/pictures\/vector_visualize.jpg",
                    "https:\/\/repushko.com\/pictures\/submit.jpg",
                    "https:\/\/repushko.com\/pictures\/submit_bot.jpg",
                    "https:\/\/repushko.com\/pictures\/ezgif.com-video-to-gif.gif",
                    "https:\/\/repushko.com\/pictures\/orig.jpg",
                    "https:\/\/repushko.com\/pictures\/flipped.jpg",
                    "https:\/\/repushko.com\/pictures\/shift_scale_rotate.jpg",
                    "https:\/\/repushko.com\/pictures\/mask.jpg",
                    "https:\/\/repushko.com\/pictures\/savgol_2.jpg",
                    "https:\/\/repushko.com\/pictures\/gradient_x.jpg",
                    "https:\/\/repushko.com\/pictures\/unity_eye.jpg",
                    "https:\/\/repushko.com\/pictures\/sega.png",
                    "https:\/\/repushko.com\/pictures\/sega2.jpg",
                    "https:\/\/repushko.com\/pictures\/sega3.jpg"
                ]
            }
        },
        {
            "id": "20",
            "url": "https:\/\/repushko.com\/all\/junction-2019\/",
            "title": "Junction 2019 — русские, русские, русские, VK",
            "content_html": "<div class=\"e2-text-picture\">\n<img src=\"https:\/\/repushko.com\/pictures\/Screenshot-from-2019-11-17-07-41-05.png\" width=\"732\" height=\"173\" alt=\"\" \/>\n<\/div>\n<p>Был на выходных на Junction-2019 (топовый европейский хакатон в Хельсинки), а это заметка фактами по свежим следам.<\/p>\n<h2>Выжимка<\/h2>\n<p>Русские, русские, автобусы из Питера, иностранцы придумывают, как интегрировать VK с AliExpress 🤯, ещё русские, детская безопасность в интернете, клёвое название нашего проекта, купленные шрифты, Люси в восторге, треки не очень, старость.<\/p>\n<h2>Чуть более развёрнуто<\/h2>\n<p>Похоже Junction окончательно стал главной выездной площадкой для IT-шников в СНГ. Русскоговорящих было по ощущениям больше половины. Приглашения для визы генерил скриптик на сайте, это ли не победа над бюрократией?<\/p>\n<p>Вспомнил, что он же в 2016 был моим первым выездным IT-мероприятием и атмосфера была совсем другой: пиццабургеры, Yousician с укулеле, на которых можно было играть ночью, лазерный луч через всё пространство мероприятия. Тогда это чувствовалось как что-то близкое, организованное такими же как и ты. Сейчас — построенный бизнес, который (видимо успешно) штампует мероприятия для студентов и ищет спонсоров. Ну и призы подросли.<\/p>\n<p>Чувствовалась старость и лень: зачем не спать всю ночь, когда после сна ты сможешь что-то пофиксить за 20 минут? Зачем не спать, когда в понедельник на работу?<\/p>\n<h2>Победители<\/h2>\n<ol start=\"1\">\n<li>Приложение для авторизации детей, которые ещё не умеют читать и писать (а потреблять контент хочется) в соцсетях. Суть в том, что ты придумываешь историю с вымышленными персонажами, и вот эта твоя история и становится паролем.<\/li>\n<li>Симуляция потоков людей на мероприятии. Создали комнатку в игровом движке, наплодили агентов, хакнули A* алгоритм и ПОБЕЖАЛИ ВСЕ НА ВЫХОД ПОЖАРНАЯ ТРЕВОГА УПС, ТЫ СГОРЕЛ И НЕ ДОБЕЖАЛ. Демка выглядела классно.<\/li>\n<li>Оказывается, фины очень много тратят на гэмблинг. Ребята сделали рулетку на телефоне, где проигранные деньги отправляются тебе на банковский счёт и вернутся к тебе только через год.<\/li>\n<\/ol>\n<h2>sad but true<\/h2>\n<p>В итоге мы с Дашей набросали вдвоём маленькое демо приложения для личного контроля финансов, собрав в кучку все лучшие идеи, которые нашлись в других приложениях (типа burnout-char’a для отслеживания твоего ежедневного бюджета). Сервер я уже грохнул, так что есть только скрины. Возможно как-то допилим и сделаем интеграцию со своими банковскими аккаунтами. Оказывается в Европе это сильно проще, чем с российскими банками.<\/p>\n<p>Называется sad but true, потому что в миллениальном настоящем денег у тебя сильно меньше, чем приходит с ЗП на карту: это на квартирку, это на Netflix, а за Spotify кто заплатит, Пушкин? Вот и хочется, чтобы оно там само где-то считалось, списывалось, советовало как сэкономить, а ты повиновался бы бездушным if-else и средним по окнам в временных рядах.<\/p>\n<p>Фронтендик на Svelte оказался удобным. Мне как глупому `if err!= nil ` бэкендеру прям самое то.<\/p>\n<div class=\"e2-text-picture\">\n<div class=\"fotorama\" data-width=\"603\" data-ratio=\"0.64561027837259\">\n<img src=\"https:\/\/repushko.com\/pictures\/Screenshot-from-2019-11-17-07-31-28.png\" width=\"603\" height=\"934\" alt=\"\" \/>\n<img src=\"https:\/\/repushko.com\/pictures\/Screenshot-from-2019-11-17-07-31-41.png\" width=\"869\" height=\"938\" alt=\"\" \/>\n<img src=\"https:\/\/repushko.com\/pictures\/Screenshot-from-2019-11-17-07-31-55.png\" width=\"680\" height=\"923\" alt=\"\" \/>\n<\/div>\n<\/div>\n",
            "date_published": "2019-11-18T16:11:17+03:00",
            "date_modified": "2020-02-03T14:01:50+03:00",
            "image": "https:\/\/repushko.com\/pictures\/Screenshot-from-2019-11-17-07-41-05.png",
            "_date_published_rfc2822": "Mon, 18 Nov 2019 16:11:17 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "20",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/jquery\/jquery.js",
                    "system\/library\/fotorama\/fotorama.css",
                    "system\/library\/fotorama\/fotorama.js"
                ],
                "og_images": [
                    "https:\/\/repushko.com\/pictures\/Screenshot-from-2019-11-17-07-41-05.png",
                    "https:\/\/repushko.com\/pictures\/Screenshot-from-2019-11-17-07-31-28.png",
                    "https:\/\/repushko.com\/pictures\/Screenshot-from-2019-11-17-07-31-41.png",
                    "https:\/\/repushko.com\/pictures\/Screenshot-from-2019-11-17-07-31-55.png"
                ]
            }
        },
        {
            "id": "12",
            "url": "https:\/\/repushko.com\/all\/santander-2019\/",
            "title": "Santander 2019 на Kaggle: 52 место",
            "content_html": "<p>С коллегами из <a href=\"https:\/\/ods.ai\">ODS<\/a> заняли 52ое место в соревновании на Kaggle среди 8800 команд.<br \/>\nSantander в этот раз молодцы: обошлось почти без ликов.<\/p>\n<p>Данные были странные и несколько тысяч команд застряли на скоре 0.901. В итоге сильно докинула частотность значения признака и хороший тюнинг.<\/p>\n<p>Kaggle = веселье.<\/p>\n",
            "date_published": "2019-04-20T22:47:40+03:00",
            "date_modified": "2019-06-09T01:18:54+03:00",
            "_date_published_rfc2822": "Sat, 20 Apr 2019 22:47:40 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "12",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": []
            }
        }
    ],
    "_e2_version": 3565,
    "_e2_ua_string": "E2 (v3565; Aegea)"
}