{
    "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\/",
    "feed_url": "https:\/\/repushko.com\/rss\/",
    "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": "61",
            "url": "https:\/\/repushko.com\/all\/ubuntu-i-nvidia-container-toolkit\/",
            "title": "Ubuntu и nvidia-container-toolkit",
            "content_html": "<p>Из неочевидного: для того, чтобы в Docker-контейнерах заработал доступ к GPU, нужно использовать <i>docker-ce<\/i>, а не <i>docker<\/i> из Snap. Это связано с тем, что пакеты из snap’a работают в песочнице snap’a и не имеют прямого доступа к системе.<\/p>\n<p><a href=\"https:\/\/github.com\/docker\/genai-stack\/issues\/95\">Вот тут описание проблемы<\/a>.<\/p>\n",
            "date_published": "2025-03-30T01:33:41+03:00",
            "date_modified": "2025-03-30T01:33:37+03:00",
            "_date_published_rfc2822": "Sun, 30 Mar 2025 01:33:41 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "61",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": []
            }
        },
        {
            "id": "60",
            "url": "https:\/\/repushko.com\/all\/analogovy-kalendar-taiwan\/",
            "title": "Аналоговый календарь на корте в Тайване",
            "content_html": "<p>Интересно выглядит система бронирования публичных кортов на Тайване. Пишешь свое имя и вставляешь бумажку в нужный слот. Аналоговый shared calendar.<\/p>\n<div class=\"e2-text-picture\">\n<div class=\"fotorama\" data-width=\"960\" data-ratio=\"0.75\">\n<img src=\"https:\/\/repushko.com\/pictures\/tennis_taiwan_2.jpg\" width=\"960\" height=\"1280\" alt=\"\" \/>\n<img src=\"https:\/\/repushko.com\/pictures\/tennis_taiwan_1.jpg\" width=\"1280\" height=\"960\" alt=\"\" \/>\n<\/div>\n<\/div>\n",
            "date_published": "2025-01-05T18:24:44+03:00",
            "date_modified": "2025-01-06T09:20:57+03:00",
            "image": "https:\/\/repushko.com\/pictures\/tennis_taiwan_2.jpg",
            "_date_published_rfc2822": "Sun, 05 Jan 2025 18:24:44 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "60",
            "_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\/tennis_taiwan_2.jpg",
                    "https:\/\/repushko.com\/pictures\/tennis_taiwan_1.jpg"
                ]
            }
        },
        {
            "id": "59",
            "url": "https:\/\/repushko.com\/all\/cons-cells-v-lisp\/",
            "title": "Cons Cells в Lisp",
            "content_html": "<p>Если вам (как и мне) поначалу было тяжеловато понять концепт Cons Cells в Lisp, то на <a href=\"https:\/\/stackoverflow.com\/questions\/1317023\/what-is-the-definition-of-a-lisp-cons-cell\">Stack Overflow<\/a> есть емкое и краткое объяснение:<\/p>\n<blockquote>\n<p>Cons cells in general hold two pointers that can point to anything. General usage of course is to point to a «value» with the left one, and to another Cons cell (or nil) with the «right» one.<\/p>\n<\/blockquote>\n<p>car и cdr соответственно вернут первый элемент или второй.<\/p>\n",
            "date_published": "2023-01-12T02:30:13+03:00",
            "date_modified": "2023-01-12T02:31:27+03:00",
            "_date_published_rfc2822": "Thu, 12 Jan 2023 02:30:13 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "59",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": []
            }
        },
        {
            "id": "58",
            "url": "https:\/\/repushko.com\/all\/final-formula-e\/",
            "title": "Formula E",
            "content_html": "<p>Сходил на финал сезона <a href=\"https:\/\/www.fiaformulae.com\">Formula E<\/a> в Берлине. Это как F1, только полностью на электрических машинах, без ДВС. У них больше крутящий момент, они быстрее разгоняются, а максимальная скорость доходит до 280 км\/ч. Особенно понравился звук электрического мотора.<\/p>\n<div class=\"e2-text-video\">\n<iframe src=\"https:\/\/www.youtube.com\/embed\/RFh3ucTD2qM\" frameborder=\"0\" allowfullscreen><\/iframe><\/div>\n",
            "date_published": "2021-08-16T00:41:24+03:00",
            "date_modified": "2021-08-16T00:40:58+03:00",
            "_date_published_rfc2822": "Mon, 16 Aug 2021 00:41:24 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "58",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": []
            }
        },
        {
            "id": "57",
            "url": "https:\/\/repushko.com\/all\/newprojectname-dev\/",
            "title": "newprojectname.dev",
            "content_html": "<div class=\"e2-text-picture\">\n<img src=\"https:\/\/repushko.com\/pictures\/readme_image.jpeg\" width=\"1280\" height=\"729\" alt=\"\" \/>\n<\/div>\n<p><a href=\"newprojectname.dev\"><a href=\"https:\/\/newprojectname.dev\">https:\/\/newprojectname.dev<\/a><\/a><\/p>\n<p>Есть забавная традиция называть проекты\/библиотеки именами различных мифических существ и божеств. И у меня давно лежала идея хелпера по подбору таких названий, но реализовал её только сейчас.<\/p>\n<p>Я напарсил <a href=\"https:\/\/github.com\/repushko\/mythology_names_dataset\">самый большой список названий божеств<\/a> из 43 пантеонов, что дало 4096 уникальных имён (и 9000 если считать все алиасы). Ну а чтобы избежать коллизий, проект на лету ищет эти имена в названиях репозиториев на Гитхабе и показывает топ-результаты.<\/p>\n<p>Из интересной инженерии: проект на <a href=\"https:\/\/svelte.dev\/\">Svelte<\/a>, имеются <a href=\"https:\/\/github.com\/repushko\/newprojectname.dev\">исходники<\/a>. Внутри есть база на 1Мб сырого json’a, которая затаскивается в общий бандл приложения и ужимается до 150кб. И из-за этого хака всё успешно хостится как статика на Digital Ocean’e за 0.00$ в месяц. Дизайн тоже корявенько делал я. Запросы к Гитхабу — клиентские, лимиты запросов — тоже на клиенте. Легчайшая поддержка.<\/p>\n",
            "date_published": "2021-01-08T23:47:43+03:00",
            "date_modified": "2021-01-08T23:48:13+03:00",
            "image": "https:\/\/repushko.com\/pictures\/readme_image.jpeg",
            "_date_published_rfc2822": "Fri, 08 Jan 2021 23:47:43 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "57",
            "_e2_data": {
                "is_favourite": true,
                "links_required": [],
                "og_images": [
                    "https:\/\/repushko.com\/pictures\/readme_image.jpeg"
                ]
            }
        },
        {
            "id": "54",
            "url": "https:\/\/repushko.com\/all\/rejection-sampling-i-reservoir-sampling\/",
            "title": "Rejection sampling и Reservoir sampling",
            "content_html": "<p>Разобрался на днях с двумя интересными алгоритмами про выборки.<\/p>\n<p><a href=\"https:\/\/en.wikipedia.org\/wiki\/Rejection_sampling\">Rejection sampling<\/a> находил в задачах вроде «с помощью функции, которая гарантирует равновероятное выпадение целого числа в интервале [1...7], создайте функцию, которая делает тоже самое, но в интервале от [1...10]».  Ещё такая же задача была однажды у меня на собесе в Яндексе: дана монетка с вероятностью выпадения орла\/решки ½. С помощью этой монетки нужно смоделировать вероятность ⅓. Я интуитивно дошёл до решения и доказал, что это работает, но конкретно названия группы алгоритмов не знал.<\/p>\n<p><a href=\"https:\/\/en.wikipedia.org\/wiki\/Reservoir_sampling\">Reservoir sampling<\/a> про то, как смоделировать равновероятный выбор элемента при неизвестной конечной размерности множества вариантов.<\/p>\n",
            "date_published": "2020-10-14T21:28:27+03:00",
            "date_modified": "2020-10-14T21:28:38+03:00",
            "_date_published_rfc2822": "Wed, 14 Oct 2020 21:28:27 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "54",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": []
            }
        },
        {
            "id": "53",
            "url": "https:\/\/repushko.com\/all\/audiozametka-3\/",
            "title": "Аудиозаметка №3",
            "content_html": "<p>Станция Нойкёльн.<\/p>\n<div class=\"e2-text-audio\">\n<a class=\"jouele\" data-space-control=\"true\" data-length=\"26\" href=\"https:\/\/repushko.com\/audio\/audio_note3.mp3\" >5 октября, Берлин<\/a>\n<\/div>\n",
            "date_published": "2020-10-06T23:21:39+03:00",
            "date_modified": "2020-10-06T23:24:09+03:00",
            "_date_published_rfc2822": "Tue, 06 Oct 2020 23:21:39 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "53",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/jquery\/jquery.js",
                    "system\/library\/jouele\/jouele.css",
                    "system\/library\/jouele\/jouele.js"
                ],
                "og_images": []
            }
        },
        {
            "id": "52",
            "url": "https:\/\/repushko.com\/all\/ideya-voice-control-dlya-rpg-igr\/",
            "title": "[Идея] Voice-control для RPG-игр",
            "content_html": "<div class=\"e2-text-picture\">\n<img src=\"https:\/\/repushko.com\/pictures\/fallout.jpg\" width=\"800\" height=\"450\" alt=\"\" \/>\n<\/div>\n<p>Современные технологии уже позволяют реализовать самую клёвую штуку, которую можно придумать в RPG-играх — открытые диалоги.<\/p>\n<p>Вместо того, чтобы выбирать колёсиком (как в MassEffect или Fallout) вариант ответа в диалоге, можно настроить возможность произносить его голосом в микрофон. Система бы матчила семантику сказанного к максимально близком варианту ответа в сценарии и запускала скрипт реакции на этот вариант ответа. Было бы интересно попробовать.<\/p>\n<p>А вообще игры с голосовой механикой не новость.<\/p>\n<div class=\"e2-text-video\">\n<iframe src=\"https:\/\/www.youtube.com\/embed\/L5-o6iODptU\" frameborder=\"0\" allowfullscreen><\/iframe><div class=\"e2-text-caption\">Scream Go Hero<\/div>\n<\/div>\n",
            "date_published": "2020-09-28T17:20:46+03:00",
            "date_modified": "2020-09-28T17:36:43+03:00",
            "image": "https:\/\/repushko.com\/pictures\/fallout.jpg",
            "_date_published_rfc2822": "Mon, 28 Sep 2020 17:20:46 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "52",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": [
                    "https:\/\/repushko.com\/pictures\/fallout.jpg"
                ]
            }
        },
        {
            "id": "51",
            "url": "https:\/\/repushko.com\/all\/zarisovki\/",
            "title": "Чьи-то зарисовки",
            "content_html": "<p>На берлинской барахолке полгода назад получилось бесплатно взять виниловый проигрыватель и аудиосистему к нему. Ещё в придачу отдавался набор старых пластинок: в основном латинской музыки и пара классических произведений.<\/p>\n<p>В куче этих пластинок был блокнот с зарисовками интерьеров и какими-то записями (непонятно какого срока давности). Я так рисовать не умею, поэтому кажется очень красивым.<\/p>\n<div class=\"e2-text-picture\">\n<div class=\"fotorama\" data-width=\"1280\" data-ratio=\"1.5023474178404\">\n<img src=\"https:\/\/repushko.com\/pictures\/photo_2020-08-16_18-41-38-(8).png\" width=\"1280\" height=\"852\" alt=\"\" \/>\n<img src=\"https:\/\/repushko.com\/pictures\/photo_2020-08-16_18-41-38-(7).png\" width=\"916\" height=\"1280\" alt=\"\" \/>\n<img src=\"https:\/\/repushko.com\/pictures\/photo_2020-08-16_18-41-38-(6).png\" width=\"930\" height=\"1280\" alt=\"\" \/>\n<\/div>\n<div class=\"e2-text-caption\">Интерьеры<\/div>\n<\/div>\n<div class=\"e2-text-picture\">\n<div class=\"fotorama\" data-width=\"1280\" data-ratio=\"1.3793103448276\">\n<img src=\"https:\/\/repushko.com\/pictures\/photo_2020-08-16_18-41-38-(3).png\" width=\"1280\" height=\"928\" alt=\"\" \/>\n<img src=\"https:\/\/repushko.com\/pictures\/photo_2020-08-16_18-41-38-(5).png\" width=\"1280\" height=\"916\" alt=\"\" \/>\n<img src=\"https:\/\/repushko.com\/pictures\/photo_2020-08-16_18-41-38-(4).png\" width=\"1280\" height=\"934\" alt=\"\" \/>\n<img src=\"https:\/\/repushko.com\/pictures\/photo_2020-08-16_18-41-38-(2).png\" width=\"1280\" height=\"908\" alt=\"\" \/>\n<img src=\"https:\/\/repushko.com\/pictures\/photo_2020-08-16_18-41-38-(1).png\" width=\"1280\" height=\"920\" alt=\"\" \/>\n<\/div>\n<\/div>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/repushko.com\/pictures\/photo_2020-08-16_18-41-38.png\" width=\"860\" height=\"1280\" alt=\"\" \/>\n<\/div>\n",
            "date_published": "2020-08-16T22:37:45+03:00",
            "date_modified": "2020-08-16T22:37:41+03:00",
            "image": "https:\/\/repushko.com\/pictures\/photo_2020-08-16_18-41-38-(8).png",
            "_date_published_rfc2822": "Sun, 16 Aug 2020 22:37:45 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "51",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/jquery\/jquery.js",
                    "system\/library\/fotorama\/fotorama.css",
                    "system\/library\/fotorama\/fotorama.js",
                    "system\/library\/jquery\/jquery.js",
                    "system\/library\/fotorama\/fotorama.css",
                    "system\/library\/fotorama\/fotorama.js"
                ],
                "og_images": [
                    "https:\/\/repushko.com\/pictures\/photo_2020-08-16_18-41-38-(8).png",
                    "https:\/\/repushko.com\/pictures\/photo_2020-08-16_18-41-38-(7).png",
                    "https:\/\/repushko.com\/pictures\/photo_2020-08-16_18-41-38-(6).png",
                    "https:\/\/repushko.com\/pictures\/photo_2020-08-16_18-41-38-(3).png",
                    "https:\/\/repushko.com\/pictures\/photo_2020-08-16_18-41-38-(5).png",
                    "https:\/\/repushko.com\/pictures\/photo_2020-08-16_18-41-38-(4).png",
                    "https:\/\/repushko.com\/pictures\/photo_2020-08-16_18-41-38-(2).png",
                    "https:\/\/repushko.com\/pictures\/photo_2020-08-16_18-41-38-(1).png",
                    "https:\/\/repushko.com\/pictures\/photo_2020-08-16_18-41-38.png"
                ]
            }
        },
        {
            "id": "50",
            "url": "https:\/\/repushko.com\/all\/ideya-fizicheskiy-kaleydoskop-dlya-ganov\/",
            "title": "[Идея] Физический калейдоскоп для latent spaces",
            "content_html": "<p>Клёво сделать физический калейдоскоп (как в детстве), вращение которого бы приводило к движению внутри latent space всяких GANов. Внутри собственно экран.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/repushko.com\/pictures\/kalejdoskop.jpeg\" width=\"576\" height=\"406\" alt=\"\" \/>\n<\/div>\n",
            "date_published": "2020-08-12T13:06:38+03:00",
            "date_modified": "2020-08-12T13:01:49+03:00",
            "image": "https:\/\/repushko.com\/pictures\/kalejdoskop.jpeg",
            "_date_published_rfc2822": "Wed, 12 Aug 2020 13:06:38 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "50",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": [
                    "https:\/\/repushko.com\/pictures\/kalejdoskop.jpeg"
                ]
            }
        },
        {
            "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": "48",
            "url": "https:\/\/repushko.com\/all\/audiozametka-2\/",
            "title": "Аудиозаметка №2",
            "content_html": "<p>1 августа 2020. Звуковая инсталляция в Бергхайне.<\/p>\n<div class=\"e2-text-audio\">\n<a class=\"jouele\" data-space-control=\"true\" data-length=\"33\" href=\"https:\/\/repushko.com\/audio\/berghain.mp3\" >1 августа 2020, Берлин<\/a>\n<\/div>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/repushko.com\/pictures\/berghain.jpg\" width=\"1280\" height=\"960\" alt=\"\" \/>\n<\/div>\n",
            "date_published": "2020-08-02T00:21:02+03:00",
            "date_modified": "2020-08-02T00:20:10+03:00",
            "image": "https:\/\/repushko.com\/pictures\/berghain.jpg",
            "_date_published_rfc2822": "Sun, 02 Aug 2020 00:21:02 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "48",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/jquery\/jquery.js",
                    "system\/library\/jouele\/jouele.css",
                    "system\/library\/jouele\/jouele.js"
                ],
                "og_images": [
                    "https:\/\/repushko.com\/pictures\/berghain.jpg"
                ]
            }
        },
        {
            "id": "47",
            "url": "https:\/\/repushko.com\/all\/data-cleaning-stat-gibdd-ru\/",
            "title": "Как работает очистка данных со stat.gibdd.ru",
            "content_html": "<p>Год назад <a href=\"https:\/\/repushko.com\/all\/dtp-stat-helpers\/\">написал скрипты<\/a> для очистки данных статистики ДТП, потому что изначальные данные (именно GPS-координаты) были очень грязными  и их практически нельзя было визуализировать. Сорцы на Гитхабе <a href=\"https:\/\/github.com\/repushko\/dtp_stat_helpers\">имеются<\/a>.<\/p>\n<p>Сейчас скрипты временно неработоспособны, так как Яндексовский геокодер теперь требует ключ для использования API, но скоро я их поправлю.<\/p>\n<p>Я расскажу про красивый и аккуратный способ, как нам точку с неправильными координатами аккуратно подвинуть прямо на улицу, где произошло ДТП.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/repushko.com\/pictures\/graph_explanation.jpg\" width=\"1280\" height=\"960\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Алгоритм очистки данных<\/div>\n<\/div>\n<h2>Описаниме по шагам<\/h2>\n<p>Изначально нам дана синяя точка слева внизу. Это GPS-координаты, которые мы получили из исходных данных. Наша основная зацепка — адрес. Он заполняется вручную и обычно верный.<\/p>\n<p><b>Шаг 1.<\/b> Воспользуемся геокодером. Это такая программа, которая переводит географическое название (город\/село\/улицу + дом) в географические координаты. Я обычно пользуюсь <a href=\"https:\/\/tech.yandex.com\/maps\/geocoder\/\">геокодером Яндекса<\/a>, потому что он точнее для СНГ, но ещё есть <a href=\"https:\/\/nominatim.org\/\">бесплатный от OpenStreetMap<\/a>. Так мы получаем чистую координату дома по адресу (красная точка на рисунке).<\/p>\n<p><b>Шаг 2.<\/b> В OSM хранится граф дорог, при этом они привязаны к географическим координатам (у графа есть точное положение на плоскости). И есть классная особенность: мы можем ввести координаты точки на плоскости и получить кусок графа в радиусе n от этой точки. Общая идея такая:<\/p>\n<ul>\n<li>вводим координаты дома после геокодирования -> получаем круг примерно как на картинке,<\/li>\n<li>выбираем все дороги, попавшие в радиус (можно считать их просто линиями),<\/li>\n<li>строим перпендикуляры из точки до каждой из линий (на рисунке x и y),<\/li>\n<li>выбираем кратчайший (в нашем случае x),<\/li>\n<li>наша красная точка получает новые координаты (уже на ребре графа из OSM) и становится жёлтой точкой,<\/li>\n<li>profit.<\/li>\n<\/ul>\n<p>Так мы кривые координаты ДТП по одному лишь адресу аккуратно перенесли прямо на улицу. Теперь при визуализации всё будет аккуратно и ровно.<\/p>\n",
            "date_published": "2020-06-25T23:15:15+03:00",
            "date_modified": "2020-06-26T09:47:27+03:00",
            "image": "https:\/\/repushko.com\/pictures\/graph_explanation.jpg",
            "_date_published_rfc2822": "Thu, 25 Jun 2020 23:15:15 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "47",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": [
                    "https:\/\/repushko.com\/pictures\/graph_explanation.jpg"
                ]
            }
        },
        {
            "id": "46",
            "url": "https:\/\/repushko.com\/all\/street-types-tula\/",
            "title": "Типы улиц Тулы",
            "content_html": "<p>Раз уж пошла такая мода (<a href=\"https:\/\/erdavis.com\/2019\/09\/20\/the-beautiful-hidden-logic-of-cities-worldwide\/\">оригинальная идея Эрина Дэвиса<\/a>, <a href=\"https:\/\/t.me\/pathetic_low_freq\/319\">Москва<\/a>, <a href=\"https:\/\/vk.com\/astr.city.data?w=wall-51262629_141\">Астрахань<\/a>), то и я нарисовал карту типов улиц Тулы.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/repushko.com\/pictures\/map.png\" width=\"2560\" height=\"2560\" alt=\"\" \/>\n<\/div>\n<p>Интересно выглядят плотные участки, состоящие только из проездов. Вроде как согласно СНиП (Строительные нормы и правила), к проездам меньше требований по ширине полос, допустимым углам поворота, наибольшему допустимому уклону, ширине пешеходной части.<\/p>\n<p>А ещё в Туле есть особенный тип: «обвод». Он всего один (<a href=\"https:\/\/yandex.ru\/maps\/15\/tula\/search\/%D0%92%D0%BE%D1%81%D1%82%D0%BE%D1%87%D0%BD%D1%8B%D0%B9%20%D0%BE%D0%B1%D0%B2%D0%BE%D0%B4\/?ll=37.662604%2C54.185500&z=14.64\">Восточной обвод<\/a>), но всё таки существует. И целых два проспекта.<\/p>\n",
            "date_published": "2020-06-07T23:54:35+03:00",
            "date_modified": "2020-06-08T17:40:20+03:00",
            "image": "https:\/\/repushko.com\/pictures\/map.png",
            "_date_published_rfc2822": "Sun, 07 Jun 2020 23:54:35 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "46",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": [
                    "https:\/\/repushko.com\/pictures\/map.png"
                ]
            }
        },
        {
            "id": "44",
            "url": "https:\/\/repushko.com\/all\/dataset-struktury-seti-lightning\/",
            "title": "Датасет структуры сети Lightning",
            "content_html": "<p>Ковыряю в свободное время интересную тему и задачу, которую курирует <a href=\"https:\/\/cs.hse.ru\/en\/lambda\/\">LAMBDA<\/a>.<\/p>\n<h2>Вводная<\/h2>\n<p>Есть сеть <a href=\"https:\/\/lightning.network\/\">Лайтнинг<\/a>, которая является надстройкой над майннетом Биткоина. Придумывалась для более мелких транзакций, которые не позволял делать Биткоин. Например, тебе нужно заплатить за кофе или совершить какую-то маленькую операцию.<\/p>\n<p>Основная терминология:<\/p>\n<ul>\n<li>нода — узел сети. Получатель денег в общем,<\/li>\n<li>канал — ребро сети. Общий кошелёк в майннете Биткоина между двумя нодами.<\/li>\n<\/ul>\n<p>В Лайтнинге интересный механизм поиска пути транзакции. Eсли тебе надо перевести деньги из <i>А<\/i> в <i>С<\/i>, то не обязательно открывать новый общий кошелёк в майннете Биткоина.<\/p>\n<p>Предположим у тебя уже есть канал <i>А<->B<\/i> и есть канал <i>B<->C<\/i>. В таком случае ты можешь сделать перевод <i>A->B->C<\/i>, где <i>B<\/i> за проход транзакции через себя возьмёт какую-то комиссию. А можно перевести и предположим по пути <i>A>D->B->C<\/i>, если такой существует.<\/p>\n<p>Но не всё так просто. Помимо комиссии, на транзакцию накладываются дополнительные условия. У канала есть «ёмкость»: сколько можно переслать денег между двумя нодами без создания нового общего кошелька в майннете. И «ёмкость» <i>А->B<\/i> и <i>B->A<\/i> не одно и то же.<\/p>\n<p>Подробнее и больше можно почитать <a href=\"https:\/\/lightning.network\/\"> в документации<\/a>.<\/p>\n<h2>Цель<\/h2>\n<p>Основная идея ресёча — заменить глупый перебор результатов DFS для проведения транзакции на что-то более умное. Кажется, что это можно сделать, имея статистику «прошедших» транзакций и варианты альтернативных путей. Получиться должно что-то вроде статистического роутинга на основе прошлых транзакций.<br \/>\nДля этого нужно собирать датасет таких транзакций и их альтернатив, но это упирается в некоторые технические сложности и проблемы. Я собственно сейчас пытаюсь их решить, проверяя вообще работоспособность идеи сбора таких данных. Если получится, то будет очень классное и необычное решение.<\/p>\n<h2>Датасет<\/h2>\n<p>До этого этапа хотелось посмотреть (и посмотрели) просто на динамику сети, как она меняется и насколько стабильна. Написал простенький парсер и в итоге получился <a href=\"https:\/\/www.kaggle.com\/grisme\/hourly-snapshots-of-lightning-network\">датасет на 10 Gb<\/a> «слепков» сети: рёбра графа и всякая метаинфа нод (ip-адрес, алиас в сети и гео-координаты).<\/p>\n<p>Парсилось каждый час с 10.12.2019 до 04.03.2020 (84 дня), всего 2022 записи. Каждый результат в отдельном файле со своим временем.<\/p>\n<p>На этом датасете можно построить интересные визуализации динамики графа и прочие клёвые штуки. Почему бы собственно им не поделиться, да?<\/p>\n",
            "date_published": "2020-05-22T02:02:05+03:00",
            "date_modified": "2020-05-22T17:08:05+03:00",
            "_date_published_rfc2822": "Fri, 22 May 2020 02:02:05 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "44",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": []
            }
        },
        {
            "id": "42",
            "url": "https:\/\/repushko.com\/all\/the-falls-of-astronauts\/",
            "title": "Падения астронавтов на Луне",
            "content_html": "<p>NASA пару лет назад показало падения астронавтов на Луне во время операций Apollo 15 и Apollo 16.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/repushko.com\/pictures\/moon.gif\" width=\"320\" height=\"240\" alt=\"\" \/>\n<\/div>\n",
            "date_published": "2020-05-10T17:00:30+03:00",
            "date_modified": "2020-05-10T17:00:22+03:00",
            "image": "https:\/\/repushko.com\/pictures\/moon.gif",
            "_date_published_rfc2822": "Sun, 10 May 2020 17:00:30 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "42",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": [
                    "https:\/\/repushko.com\/pictures\/moon.gif"
                ]
            }
        },
        {
            "id": "41",
            "url": "https:\/\/repushko.com\/all\/srednenko-poc\/",
            "title": "«Средненько». Проверка гипотезы",
            "content_html": "<h2>Мотивация<\/h2>\n<p>Я 3-4 года назад услышал про исследование <a href=\"https:\/\/strelka-kb.com\/\">КБ «Стрелка»<\/a>, в котором они скрапили фото из социальных сетей (Инстаграм и ВК) и рисовали хитмапы на картах по ним. Оказывается, это называется <a href=\"https:\/\/strelkamag.com\/ru\/article\/est-takaya-professiya-cifrovoi-antropolog\">цифровой антропологией<\/a>.<\/p>\n<p>Идея кейса, который вдохновил меня, в том, что такое исследование помогло в каком-то там городе РФ выбрать лучшую точку для открытия общественного пространства. Гипотеза такая: если люди где-то делают фото, значит уже проводят там время, а значит там и так всё хорошо с социальной жизнью. В итоге администрации посоветовали открыть новую точку интереса на противоположном конце города от существующей.<\/p>\n<p>Загорелся идеей сделать нечто похожее, но в сферу каких-то постоянных событий идея оставалась идеей без реализации.<\/p>\n<p>Закрывая гештальт (как Инстаграм своё API для доступа к гео-информации о фотографиях в 2016-ом) достиг успеха.<\/p>\n<h2>Реализация<\/h2>\n<p>Т. к. API Инстаграма оказалось закрытым, решил воспользоваться <a href=\"https:\/\/www.flickr.com\/\">Flickr’ом<\/a>.<br \/>\nСуть идеи:<\/p>\n<ul>\n<li>берем 2019ый год,<\/li>\n<li>cкрапим фотографии с Flickr для конкретной локации (т.e. города),<\/li>\n<li>аккуратно накладываем на карту,<\/li>\n<li>видим места, где люди много фотографируют,<\/li>\n<li>делаем какие-то выводы.<\/li>\n<\/ul>\n<p><b>Например<\/b>: люди фотографируют -> там что-то интересное -> логично поселиться во время поездки.<\/p>\n<p><b>Другой например<\/b>: можно увидеть места, которые недостаточно освещены туристически (с точки зрения наличия фотографий) и можно выбрать наоборот район, где живут местные. На примере Берлина эта теория вроде как работает.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/repushko.com\/pictures\/berlin_flickr_project_2019.jpg\" width=\"1280\" height=\"684\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Фотографии в Берлине за 2019ый год<\/div>\n<\/div>\n<p>Найденные подводные камни:<\/p>\n<ul>\n<li>API Flickr’a частично не завелось из python-обертки, которую я нашёл,<\/li>\n<li>фотографий не так много (250к за год), как в Инстаграме. С геопозицией — еще меньше. За 2019ый год только 44к для Берлина,<\/li>\n<li>на карте прямыми линиями из фотографий заметны фотопрогулки, когда один человек шел и фотографировал всё, что видел. Так получается много фотографий одного места, хотя это всего лишь от одного человека. В планах написать кастомную функцию хитмапа, которая бы давала больший вес участкам, где фотографии от разных людей. Так получится сильно честнее.<\/li>\n<\/ul>\n<h2>«Средненько»<\/h2>\n<p>В процессе возникла идея — сопоставить кучу фотографий одной достопримечательности для получения её «усреднённого» вида. Итог получился сильно лучше, чем я ожидал.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/repushko.com\/pictures\/ansgar-scheffold-cyUf9E_mhFc-unsplash.jpg\" width=\"2560\" height=\"1701\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Оригинальные Бранденбургские ворота<\/div>\n<\/div>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/repushko.com\/pictures\/average_brandenburg_gates.jpg\" width=\"1280\" height=\"774\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Усреднённые 55 фотографий Бранденбургских ворот<\/div>\n<\/div>\n<p>Когда-то вероятно продолжу и сделаю для других городов.<\/p>\n",
            "date_published": "2020-04-26T01:05:52+03:00",
            "date_modified": "2020-04-26T01:05:49+03:00",
            "image": "https:\/\/repushko.com\/pictures\/berlin_flickr_project_2019.jpg",
            "_date_published_rfc2822": "Sun, 26 Apr 2020 01:05:52 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "41",
            "_e2_data": {
                "is_favourite": true,
                "links_required": [],
                "og_images": [
                    "https:\/\/repushko.com\/pictures\/berlin_flickr_project_2019.jpg",
                    "https:\/\/repushko.com\/pictures\/ansgar-scheffold-cyUf9E_mhFc-unsplash.jpg",
                    "https:\/\/repushko.com\/pictures\/average_brandenburg_gates.jpg"
                ]
            }
        },
        {
            "id": "40",
            "url": "https:\/\/repushko.com\/all\/u-menya-est-kartina\/",
            "title": "У меня есть картина. Я вам ее покажу",
            "content_html": "<p>«Яндекс» несколько месяцев назад организовал <a href=\"https:\/\/yandex.ru\/lab\/ganart\" class=\"nu\">«<u>Галерею нейросетевого искусства<\/u>»<\/a> и на старте раздавал картины. Успел взять «Нейроподъезд 21».<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/repushko.com\/pictures\/Neyropodezd-0021.png\" width=\"1024\" height=\"1024\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Нейроподъезд 21<\/div>\n<\/div>\n",
            "date_published": "2020-04-26T00:40:03+03:00",
            "date_modified": "2020-04-20T19:42:54+03:00",
            "image": "https:\/\/repushko.com\/pictures\/Neyropodezd-0021.png",
            "_date_published_rfc2822": "Sun, 26 Apr 2020 00:40:03 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "40",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": [
                    "https:\/\/repushko.com\/pictures\/Neyropodezd-0021.png"
                ]
            }
        },
        {
            "id": "37",
            "url": "https:\/\/repushko.com\/all\/barkody-seriala-tales-from-the-loop\/",
            "title": "Баркоды сериала «Tales from the Loop»",
            "content_html": "<p>Сделал баркоды, как и с <a href=\"https:\/\/repushko.com\/all\/barkody-seriala-chernobyl\/\">сериалом «Чернобыль»<\/a>. Каждая полоса — средний цвет кадра в этот момент времени.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/repushko.com\/pictures\/S1E1.jpg\" width=\"1700\" height=\"400\" alt=\"\" \/>\n<div class=\"e2-text-caption\">«Loop»<\/div>\n<\/div>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/repushko.com\/pictures\/S1E2.jpg\" width=\"1700\" height=\"400\" alt=\"\" \/>\n<div class=\"e2-text-caption\">«Transpose»<\/div>\n<\/div>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/repushko.com\/pictures\/S1E3.jpg\" width=\"1700\" height=\"400\" alt=\"\" \/>\n<div class=\"e2-text-caption\">«Stasis»<\/div>\n<\/div>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/repushko.com\/pictures\/S1E4.jpg\" width=\"1700\" height=\"400\" alt=\"\" \/>\n<div class=\"e2-text-caption\">«Echo Sphere»<\/div>\n<\/div>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/repushko.com\/pictures\/S1E5.jpg\" width=\"1700\" height=\"400\" alt=\"\" \/>\n<div class=\"e2-text-caption\">«Control»<\/div>\n<\/div>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/repushko.com\/pictures\/S1E6.jpg\" width=\"1700\" height=\"400\" alt=\"\" \/>\n<div class=\"e2-text-caption\">«Parallel»<\/div>\n<\/div>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/repushko.com\/pictures\/S1E7.jpg\" width=\"1700\" height=\"400\" alt=\"\" \/>\n<div class=\"e2-text-caption\">«Enemies»<\/div>\n<\/div>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/repushko.com\/pictures\/S1E8.jpg\" width=\"1700\" height=\"400\" alt=\"\" \/>\n<div class=\"e2-text-caption\">«Home»<\/div>\n<\/div>\n",
            "date_published": "2020-04-21T15:24:26+03:00",
            "date_modified": "2020-04-21T18:15:37+03:00",
            "image": "https:\/\/repushko.com\/pictures\/S1E1.jpg",
            "_date_published_rfc2822": "Tue, 21 Apr 2020 15:24:26 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "37",
            "_e2_data": {
                "is_favourite": true,
                "links_required": [],
                "og_images": [
                    "https:\/\/repushko.com\/pictures\/S1E1.jpg",
                    "https:\/\/repushko.com\/pictures\/S1E2.jpg",
                    "https:\/\/repushko.com\/pictures\/S1E3.jpg",
                    "https:\/\/repushko.com\/pictures\/S1E4.jpg",
                    "https:\/\/repushko.com\/pictures\/S1E5.jpg",
                    "https:\/\/repushko.com\/pictures\/S1E6.jpg",
                    "https:\/\/repushko.com\/pictures\/S1E7.jpg",
                    "https:\/\/repushko.com\/pictures\/S1E8.jpg"
                ]
            }
        },
        {
            "id": "38",
            "url": "https:\/\/repushko.com\/all\/kadry-iz-tales-from-the-loop-chast-2\/",
            "title": "Кадры из «Tales from the Loop». Часть 2",
            "content_html": "<p>Уже писал про сериал и показывал <a href=\"https:\/\/repushko.com\/all\/tales-from-the-loop-part-1\/\">первую часть<\/a> красивых кадров. Теперь — вторая часть. А еще есть <a href=\"https:\/\/repushko.com\/all\/barkody-seriala-tales-from-the-loop\/\">баркоды<\/a>.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/repushko.com\/pictures\/s5_1.jpg\" width=\"2560\" height=\"1440\" alt=\"\" \/>\n<div class=\"e2-text-caption\">«Control»<\/div>\n<\/div>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/repushko.com\/pictures\/s6_2.jpg\" width=\"2560\" height=\"1440\" alt=\"\" \/>\n<div class=\"e2-text-caption\">«Parallel»<\/div>\n<\/div>\n<div class=\"e2-text-picture\">\n<div class=\"fotorama\" data-width=\"2560\" data-ratio=\"1.7777777777778\">\n<img src=\"https:\/\/repushko.com\/pictures\/s7_1.jpg\" width=\"2560\" height=\"1440\" alt=\"\" \/>\n<img src=\"https:\/\/repushko.com\/pictures\/s7_2.jpg\" width=\"2560\" height=\"1440\" alt=\"\" \/>\n<\/div>\n<div class=\"e2-text-caption\">«Enemies»<\/div>\n<\/div>\n<div class=\"e2-text-picture\">\n<div class=\"fotorama\" data-width=\"2560\" data-ratio=\"1.7777777777778\">\n<img src=\"https:\/\/repushko.com\/pictures\/s8_1.jpg\" width=\"2560\" height=\"1440\" alt=\"\" \/>\n<img src=\"https:\/\/repushko.com\/pictures\/s8_2.jpg\" width=\"2560\" height=\"1440\" alt=\"\" \/>\n<img src=\"https:\/\/repushko.com\/pictures\/s8_3.jpg\" width=\"2560\" height=\"1440\" alt=\"\" \/>\n<\/div>\n<div class=\"e2-text-caption\">«Home»<\/div>\n<\/div>\n",
            "date_published": "2020-04-21T01:14:14+03:00",
            "date_modified": "2020-04-21T15:24:55+03:00",
            "image": "https:\/\/repushko.com\/pictures\/s5_1.jpg",
            "_date_published_rfc2822": "Tue, 21 Apr 2020 01:14:14 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "38",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/jquery\/jquery.js",
                    "system\/library\/fotorama\/fotorama.css",
                    "system\/library\/fotorama\/fotorama.js",
                    "system\/library\/jquery\/jquery.js",
                    "system\/library\/fotorama\/fotorama.css",
                    "system\/library\/fotorama\/fotorama.js"
                ],
                "og_images": [
                    "https:\/\/repushko.com\/pictures\/s5_1.jpg",
                    "https:\/\/repushko.com\/pictures\/s6_2.jpg",
                    "https:\/\/repushko.com\/pictures\/s7_1.jpg",
                    "https:\/\/repushko.com\/pictures\/s7_2.jpg",
                    "https:\/\/repushko.com\/pictures\/s8_1.jpg",
                    "https:\/\/repushko.com\/pictures\/s8_2.jpg",
                    "https:\/\/repushko.com\/pictures\/s8_3.jpg"
                ]
            }
        }
    ],
    "_e2_version": 3565,
    "_e2_ua_string": "E2 (v3565; Aegea)"
}