{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "Ихрь постит в уютный бложик: заметки с тегом community",
    "_rss_description": "Фрирайтинг, заметки, шитпостинг и все подряд",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": "",
    "_itunes_explicit": "",
    "home_page_url": "https:\/\/ifedyukin.ru\/blog\/tags\/community\/",
    "feed_url": "https:\/\/ifedyukin.ru\/blog\/tags\/community\/json\/",
    "icon": "https:\/\/ifedyukin.ru\/blog\/pictures\/userpic\/userpic@2x.jpg?1737233225",
    "authors": [
        {
            "name": "Игорь Федюкин",
            "url": "https:\/\/ifedyukin.ru\/blog\/",
            "avatar": "https:\/\/ifedyukin.ru\/blog\/pictures\/userpic\/userpic@2x.jpg?1737233225"
        }
    ],
    "items": [
        {
            "id": "79",
            "url": "https:\/\/ifedyukin.ru\/blog\/all\/how-to-sync-obsidian-between-ios-devices\/",
            "title": "How to sync Obsidian between iOS devices",
            "content_html": "<p>I’ve written a lot of notes since 2010, I really like methodologies like second mind and Zettelkasten, and as a consequence I really like Obsidian.<\/p>\n<p>And many times I’ve seen people find solutions to synchronize different iOS\/iPad OS devices without iCloud and Obsidian Sync. People use Apple Shortcuts and third-party tools like Working Copy to sync Obsidian via git, or use terminal emulators like iSH to mount the vault directory and sync it manually.<\/p>\n<p>But Obsidian on mobile devices (yes, iOS too) supports community plugins.<br \/>\nAnd instead of reinventing the wheel, you can... just install the plugin you need.<\/p>\n<p>Just go to Settings — Community Plugins — Browse. And install:<\/p>\n<ul>\n<li>«Obsidian Git» for synchronization with git;<\/li>\n<li>«Remote Save» to synchronize with S3\/WebDav.<\/li>\n<\/ul>\n<p>Yes, it works on iOS devices, it works natively and automatically on startup, you just need to enable it in the settings. And also you can add shortcut to Obsidian menu to call action you need.<br \/>\nEnjoy!<\/p>\n",
            "date_published": "2023-10-15T19:39:31+03:00",
            "date_modified": "2025-01-19T00:09:34+03:00",
            "tags": [
                "community",
                "education",
                "life"
            ],
            "_date_published_rfc2822": "Sun, 15 Oct 2023 19:39:31 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "79",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": []
            }
        },
        {
            "id": "66",
            "url": "https:\/\/ifedyukin.ru\/blog\/all\/best-openair-ryazan2022\/",
            "title": "Лучший оупен-эйр 2022 в Рязани",
            "content_html": "<p><s>Минувшие выходные<\/s> Выходные несколько недель назад (потому что мне было лень написать пост)  были самыми длинными за последний, кажется, год. И не потому, что я много отдыхал, а потому, что слишком много эмоций и событий наполняло их.<\/p>\n<p class=\"note-main\">Почти два месяца мы (и здесь я очень рад, что принимал участие в подготовке) готовили опен-эир с электронной музыкой, клевыми диджеями, баром, интересными инсталляциями и декором. И у нас получилось. Очень круто, куча положительного фидбэка, респектов и вопросов «вы там <i>ебанутые<\/i>?» (в <i>положительном<\/i> ключе, конечно). Повторюсь, что безумно рад, что удалось приложить руку к этому всему.<\/p>\n<p class=\"note-aside\">Сначала хотел прямо такой жестко информативный лонгрид сделать, но потом подумалось, что через текст свои эмоции я недостаточно качественно могу передать, так что немного шитпоста и просто фоточек закину.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/ifedyukin.ru\/blog\/pictures\/photo_2022-06-28_20-13-32.jpg\" width=\"960\" height=\"1280\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Вечер за день до мероприятия — на выходе в поля<\/div>\n<\/div>\n<p>Началось все с выбора площадки — поляны под Рязанью в чаще леса, которую ребята расчищали долго и кропотливо, сразу же намечая где и что будет: 2 чилл-зоны, бар + кухня, сцена, туалет (куда ж без него). Даже расположение мусорок было продумано! План рисовали как лучших шпионских боевиках — на скриншотах спутниковых снимков.<\/p>\n<p class=\"note-main\">Чтобы дойти до поляны, нужно было топать некоторое время по полю, вокруг было очень красиво и... много комаров, но куда ж без этого. Для того, чтобы люди не терялись, был подготовлен фото-гайд с ориентирами, координатами и картой.<\/p>\n<p class=\"note-aside\">Я по этим полям столько кругов за эти дни намотал, столько крови там сцедил комарам, что кажется, что я теперь часть этих полей.<\/p>\n<div class=\"e2-text-video\">\n<video src=\"https:\/\/ifedyukin.ru\/blog\/video\/IMG_1293.MOV#t=0.001\" width=\"720\" height=\"1280\" controls alt=\"\" \/>\n\n<\/div>\n<p>Одна из огромных инсталляций — цветок, свечение которого было видно почти из каждого края плейса<\/p>\n<p>Декораторы и художники создали кучу красивостей: рисунки на деревьях, скульптуры, «фрески» и еще много всяких штук, название которых я не знаю, но без этого не было бы ни атмосферы, ни вайба, который плейс раздавал во время тусовки. Причем работать они начали задолго до выезда на место.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/ifedyukin.ru\/blog\/pictures\/photo_2022-06-28_20-13-16.jpg\" width=\"960\" height=\"1280\" alt=\"\" \/>\n<\/div>\n<p>Я много наблюдал за их работой и немного помогал — непередаваемые эмоции, когда за день бесформенный кусок пенопласта превращается в крыло, цветок, рыбу — что угодно.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/ifedyukin.ru\/blog\/pictures\/photo_2022-06-28_20-13-26.jpg\" width=\"960\" height=\"595\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Чиллзона внутри бара, виден процесс подготовки и скульптура, маскот Рязани, можно сказать<\/div>\n<\/div>\n<p>Инженеры также задолго до начала начали работу: делали чертежи сцены, стойки, закупали материалы, проводили подготовительный напил, покраску и сварку всего и вся, что можно было сделать до приезда на место. Большая часть задумок изначально моделилась в 3D.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/ifedyukin.ru\/blog\/pictures\/photo_2022-06-28_20-13-19.jpg\" width=\"960\" height=\"1280\" alt=\"\" \/>\n<\/div>\n<p>Весь тон тусовке задавала сцена высотой в несколько метров, буквально являлась центром всего. Конструкция получилась довольно устойчивой, мы на верхушке втроем спокойно находились — не спрашивайте зачем.<\/p>\n<p>Окончательный выезд на место состоялся за 2 дня до мероприятия, и некоторые из организаторов там жили все это время. За день до начала приехали волонтеры и работа закипела еще сильнее, да и не прекращалась она до самого конца мероприятия.<\/p>\n<div class=\"e2-text-video\">\n<video src=\"https:\/\/ifedyukin.ru\/blog\/video\/IMG_1269.MOV#t=0.001\" width=\"960\" height=\"1280\" controls alt=\"\" \/>\n\n<\/div>\n<p>Валежник и порубленные старые деревья максимально использовались для оформления и поддержи лесного вайба. Ближе к началу мероприятия пригнали целый фургон со светом, звуком и другим оборудованием и начали все устанавливать и отлаживать. Параллельно с этим ребята строили бар и разворачивали барное оборудование.<\/p>\n<div class=\"e2-text-video\">\n<video src=\"https:\/\/ifedyukin.ru\/blog\/video\/IMG_1272.MOV#t=0.001\" width=\"720\" height=\"1280\" controls alt=\"\" \/>\n\n<\/div>\n<p>Люди приходили как-то очень резко и кучно, в какой-то момент я зашел в бар и увидел толпу, вышел — около него тоже увидел толпу, дошел до чиллзоны — там люди со своими раскладными стульчиками сидят и курят кальян. Красота!<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/ifedyukin.ru\/blog\/pictures\/photo_2022-06-28_20-13-18.jpg\" width=\"960\" height=\"1280\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Бар и довольные люди<\/div>\n<\/div>\n<p>Музыка разогналась где-то к двенадцати-часу, лайнап несколько сдвинулся, я почти не спал два предыдущих дня. И если бы два года назад я бы назвал это разминкой, то в этот раз я не выдержал и немного подремал в чиллухе на коленях у девушки.<\/p>\n<div class=\"e2-text-video\">\n<video src=\"https:\/\/ifedyukin.ru\/blog\/video\/IMG_1306.MOV#t=0.001\" width=\"720\" height=\"1280\" controls alt=\"\" \/>\n\n<\/div>\n<p>Несколько часов лайнапа заняла прямо <i>ебучка<\/i>, которая, видимо, является чем-то вроде «ну это ваш стиль», народ вытоптал все поле, диджеи выжгли всю энергию!<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/ifedyukin.ru\/blog\/pictures\/best-openair-ryazan2022.png\" width=\"826\" height=\"1091\" alt=\"\" \/>\n<\/div>\n<p>Утром под разгон народа я играл свой хаус-сет, к слову, хаус никогда до этого не играл и не то чтобы любил, но мнение поменялось.<\/p>\n<p>Сет я сыграл не полностью, к сожалению, но посводил транс предыдущего диджея и поотвечал на вопросы, чего у меня на хаус музыка не особо похожа.<\/p>\n<p>Есть записанный первый черновой трай моего сета. Когда-нибудь я его пересведу и выложу куда-то, но пока сыроватую версию можно и сюда.<\/p>\n<div class=\"e2-text-audio\">\n<div class=\"e2-text-super-wrapper e2-jouele-wrapper\"><a class=\"jouele\" data-space-control=\"true\" data-length=\"3783\" href=\"https:\/\/ifedyukin.ru\/blog\/audio\/Open-house.mp3\">Open-house.mp3<\/a><\/div>\n<\/div>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/ifedyukin.ru\/blog\/pictures\/photo_2022-06-28_20-13-34.jpg\" width=\"960\" height=\"1280\" alt=\"\" \/>\n<\/div>\n<p>Куча потраченных сил и энергии кучи людей, куча положительных эмоций и историй, парочка новых локальных «мемов» — как минимум поэтому лето уже удалось.<\/p>\n",
            "date_published": "2022-07-12T13:41:53+03:00",
            "date_modified": "2023-04-06T12:27:50+03:00",
            "tags": [
                "community",
                "life"
            ],
            "image": "https:\/\/ifedyukin.ru\/blog\/pictures\/photo_2022-06-28_20-13-32.jpg",
            "_date_published_rfc2822": "Tue, 12 Jul 2022 13:41:53 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "66",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/jquery\/jquery.js",
                    "system\/library\/media-seek\/media-seek.js",
                    "system\/library\/jouele\/jouele.css",
                    "system\/library\/jouele\/jouele.js"
                ],
                "og_images": [
                    "https:\/\/ifedyukin.ru\/blog\/pictures\/photo_2022-06-28_20-13-32.jpg",
                    "https:\/\/ifedyukin.ru\/blog\/pictures\/photo_2022-06-28_20-13-16.jpg",
                    "https:\/\/ifedyukin.ru\/blog\/pictures\/photo_2022-06-28_20-13-26.jpg",
                    "https:\/\/ifedyukin.ru\/blog\/pictures\/photo_2022-06-28_20-13-19.jpg",
                    "https:\/\/ifedyukin.ru\/blog\/pictures\/photo_2022-06-28_20-13-18.jpg",
                    "https:\/\/ifedyukin.ru\/blog\/pictures\/best-openair-ryazan2022.png",
                    "https:\/\/ifedyukin.ru\/blog\/pictures\/photo_2022-06-28_20-13-34.jpg"
                ]
            }
        },
        {
            "id": "64",
            "url": "https:\/\/ifedyukin.ru\/blog\/all\/niti-site\/",
            "title": "Запустили сайт NИTИ",
            "content_html": "<p>Мы с ребятами делаем <mark>в Рязани<\/mark> очень крутой движ — NИTИ, я относительно недавно, но все же. Это тусовки с электронной (и не только) музыкой, крутая площадка, диджейские подкасты, музыка и еще много всего крутого.<\/p>\n<p class=\"note-main\">Пару дней назад у объединения была, так сказать, годовщина. В честь этого события мы анонсировали масштабный оупен-эйр и... барабанная дробь... <a href=\"https:\/\/niti.team\">сайт<\/a>!<\/p>\n<p class=\"note-aside\">Оупен-эйр — это мы в лесу будем делать <a href=\"https:\/\/niti.team\/events\/uniti\">тусовку<\/a> с баром, чилл-зоной, арт-объектами, лайн-апом на десяток часов и кучей замечательных людей.<\/p>\n<p class=\"note-main\">У нас была просто замечательная команда из трех человек, которой мы запустили сайт с нуля, у нас только концепт какой-то был и пара референсов, меньше, чем за месяц.<\/p>\n<p class=\"note-aside\">Наша команда была прямо фулл-ремоут, с полностью асинхронной коммуникацией и всего двумя созвонами за все время: в самом начале и в самом конце, чтобы контент поправить.<\/p>\n<p>Работали по настоящему аджайлу, можно сказать, только спринты были по паре дней, утрирую, но как-то так.<\/p>\n<p>Очень клевые дизайнерские идеи, очень интересные хаки в верстке, чтобы эти идеи ожили, мобильная версия с заделом под приложение — всем рекомендуем ее на телефонах сохранять на рабочий стол, чтобы оно в стэндалон режиме открывалось.<\/p>\n<div class=\"e2-text-picture\">\n<div class=\"fotorama\" data-width=\"1440\" data-ratio=\"1.9834710743802\">\n<img src=\"https:\/\/ifedyukin.ru\/blog\/pictures\/niti.png\" width=\"1440\" height=\"726\" alt=\"\" \/>\n<img src=\"https:\/\/ifedyukin.ru\/blog\/pictures\/image-2.png\" width=\"1004\" height=\"1580\" alt=\"\" \/>\n<\/div>\n<\/div>\n<p>Технологически весь сайт построен на NextJS, чтобы быстро работало и вообще на острие технологий.<br \/>\nК слову, на релизе этот самый Next съел всю оперативу на сервере и вместо картинок юзеры получали 502 ошибку, но теперь все статически экспортируется — рантайм не нужен!<\/p>\n<p>На графике посещений очень ярко выражен момент, когда мы сайт в инстаграме и телеграме анонсировали, красота! А вот та просадочка в начале — это как раз 502 ошибки, хорошо, что поймали быстро.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/ifedyukin.ru\/blog\/pictures\/niti-site.png\" width=\"2264\" height=\"774\" alt=\"\" \/>\n<\/div>\n<p>Осталось заделать наикрутейший интернет-магазин, но пока это в бэклоге. Сейчас в топ-приоритетах — собрать сет на грядущий движ в <s>штанах<\/s> лесу!<\/p>\n",
            "date_published": "2022-06-07T14:52:33+03:00",
            "date_modified": "2023-04-06T12:28:45+03:00",
            "tags": [
                "community",
                "development",
                "entrepreneurship",
                "music"
            ],
            "image": "https:\/\/ifedyukin.ru\/blog\/pictures\/niti.png",
            "_date_published_rfc2822": "Tue, 07 Jun 2022 14:52:33 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "64",
            "_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:\/\/ifedyukin.ru\/blog\/pictures\/niti.png",
                    "https:\/\/ifedyukin.ru\/blog\/pictures\/image-2.png",
                    "https:\/\/ifedyukin.ru\/blog\/pictures\/niti-site.png"
                ]
            }
        },
        {
            "id": "56",
            "url": "https:\/\/ifedyukin.ru\/blog\/all\/vtoroy-vypusk-webpurple-podkasta\/",
            "title": "Второй выпуск подкаста смонтирован",
            "content_html": "<p>Я как-то прошляпил в какой-то момент публикацию этого черновика, а сейчас до него дошел. Не пропадать же добру, правильно?<\/p>\n<p>Андрей Смолко — главный знаток спеки JS в Рязани рассказывает про то, как от проектирования кораблей он перешел к разработке веб-сервисов, учился в Европе и много чего интересного про синтетические данные.<\/p>\n<p>Подкаст в аудио-формате и на других площадках — <a href=\"https:\/\/anchor.fm\/webpurple\/episodes\/S01E02----------JS-e116ij7\">анкор<\/a>.<\/p>\n<p>Фидбэк, предложения, пожелания, залететь в следующий выпуск — <a href=\"https:\/\/forms.gle\/5x192yAGfgK1SAdw8\">форма<\/a>.<\/p>\n<div class=\"e2-text-video\">\n<iframe src=\"https:\/\/www.youtube.com\/embed\/7KccAfKyq5E?enablejsapi=1\" allow=\"autoplay\" frameborder=\"0\" allowfullscreen><\/iframe>\n<p>\n0:00 — Приветствие<br \/>\n1:33 — Экскурс в историю<br \/>\n3:12 — Как поехать учиться в Европу<br \/>\n9:47 — Про магистерскую диссертацию, исследования и первые программы<br \/>\n14:37 — Как вернулся в Россию, в Рязань<br \/>\n17:00 — Про модели кораблей, электронную навигацию и работу в Санкт-Петербурге<br \/>\n21:10 — Первый продакшен код<br \/>\n22:55 — Как Андрей стал программистом и переехал в Рязань<br \/>\n28:30 — Как начал читать спеку JS<br \/>\n37:44 — Кто вдохновляет<br \/>\n42:55 — Бэкенд или фронтенд<br \/>\n46:09 — Компетенции и собеседования<br \/>\n55:12 — Про проект и синтетические данные<br \/>\n1:08:12 — Завершение<br \/>\n<\/p>\n<\/div>\n",
            "date_published": "2021-05-19T11:07:00+03:00",
            "date_modified": "2021-11-03T11:08:29+03:00",
            "tags": [
                "community",
                "development",
                "podcast"
            ],
            "image": "https:\/\/ifedyukin.ru\/blog\/pictures\/remote\/youtube-7KccAfKyq5E-cover.jpg",
            "_date_published_rfc2822": "Wed, 19 May 2021 11:07:00 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "56",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/jquery\/jquery.js",
                    "system\/library\/media-seek\/media-seek.js"
                ],
                "og_images": [
                    "https:\/\/ifedyukin.ru\/blog\/pictures\/remote\/youtube-7KccAfKyq5E-cover.jpg"
                ]
            }
        },
        {
            "id": "54",
            "url": "https:\/\/ifedyukin.ru\/blog\/all\/podcast-pilot-published\/",
            "title": "Пилотный выпуск подкаста в паблике",
            "content_html": "<p>Зарелизил, так сказать, пилотный выпуск подкаста. Со звуком проблемы, но это пока, дальше — лучше!<br \/>\nПока доступно на <a href=\"https:\/\/www.youtube.com\/watch?v=k1MjM5H0UII\">ютубе<\/a> и <a href=\"https:\/\/anchor.fm\/webpurple\/episodes\/S01E01-------Gatsby-er4jdg\">анкоре<\/a>, доставка на другие площадки — в процессе.<\/p>\n<p>Фидбэк и предложения можно в комменты ниже, в комменты на ютуб или анонимно — в <a href=\"https:\/\/forms.gle\/TfFBZgj9pAq1gyeo7\">форму<\/a>.<\/p>\n<div class=\"e2-text-video\">\n<iframe src=\"https:\/\/www.youtube.com\/embed\/k1MjM5H0UII?enablejsapi=1\" allow=\"autoplay\" frameborder=\"0\" allowfullscreen><\/iframe>\n<p>\n0:00 — Приветствие<br \/>\n2:12 — Стартапы и COVID-19 в Германии<br \/>\n5:42 — Социализация после переезда<br \/>\n10:42 — Велосипед и учеба на права в Берлине<br \/>\n13:55 — DevOps, инфраструктура и облака<br \/>\n15:51 — Основное направление работы<br \/>\n17:01 — Про Ruby<br \/>\n18:07 — Глобальная клаудификация<br \/>\n21:12 — Постоянное обучение и выгорание<br \/>\n25:21 — Инженерная тусовка и атмосфера<br \/>\n28:11 — Почему бы не начать свой стартап<br \/>\n30:36 — История сайта WebPurple<br \/>\n35:00 — Технический стек для своего стартапа<br \/>\n41:24 — Завершение<br \/>\n<\/p>\n<\/div>\n",
            "date_published": "2021-02-28T16:26:39+03:00",
            "date_modified": "2021-02-28T16:27:38+03:00",
            "tags": [
                "community",
                "development",
                "podcast"
            ],
            "image": "https:\/\/ifedyukin.ru\/blog\/pictures\/remote\/youtube-k1MjM5H0UII-cover.jpg",
            "_date_published_rfc2822": "Sun, 28 Feb 2021 16:26:39 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "54",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/jquery\/jquery.js",
                    "system\/library\/media-seek\/media-seek.js"
                ],
                "og_images": [
                    "https:\/\/ifedyukin.ru\/blog\/pictures\/remote\/youtube-k1MjM5H0UII-cover.jpg"
                ]
            }
        },
        {
            "id": "52",
            "url": "https:\/\/ifedyukin.ru\/blog\/all\/zapisal-podkast\/",
            "title": "Записал подкаст",
            "content_html": "<p>Уже несколько лет думаю про то, что пора бы сделать подкаст. Но все это время я долго прокрастинировал, придумывал какие-то планы и откладывал, откладывал, откладывал. Зато пообщался с самыми топовыми подкастерами СНГшного JS-коммьюнити (спасибо, HolyJS и RndTech Conf).<\/p>\n<p>В общем мотивация была, желание было, а пинка не было. Но, к счастью, недавно ребята из <a href=\"http:\/\/webpurple.net\/\">WebPurple<\/a> подпнули меня, и я все-таки решил делать <a href=\"https:\/\/anchor.fm\/webpurple\">WebPurple Speech<\/a> — коммьюнити-подкаст про айти, разработку и людей.<\/p>\n<p>Недолго думая, позвал <a href=\"https:\/\/nikitakirsanov.com\/\">Никиту<\/a>, одного из мейнтейнеров сообщества, поучаствовать в пилотном выпуске, так еще и сложилось все очень круто и он оказался в Рязани, так что пилот записали в оффлайне, спасибо ребятам из рязанского епама за переговорку.<\/p>\n<p>Сделал несколько выводов:<\/p>\n<ul>\n<li>Подкасты проще, чем посты — нужно нажать только одну кнопку, чтобы начать запись.<\/li>\n<li>Предварительная подготовка проще, чем я ожидал — накидать интересующие вопросы и все.<\/li>\n<li>Никакой аппаратуры не требуется — айфон отлично пишет звук (не идеально, но я же любитель).<\/li>\n<li>Хотел подкаст, а получилось интервью — надо было продумать, как диалог строить, а не просто вопросы задавать.<\/li>\n<li>Обрабатывать материал дольше, чем писать его — особенно учитывая, что у меня еще и видео есть.<\/li>\n<\/ul>\n<p>Теперь нужно выбрать время, обработать все и опубликовать. А в следующий раз учесть все вот это, да и подумать когда и как устроить следующий раз.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/ifedyukin.ru\/blog\/pictures\/EA8717FF-94E2-440F-B790-C7A29E38CD35.JPG\" width=\"828\" height=\"1208\" alt=\"\" \/>\n<\/div>\n",
            "date_published": "2021-02-18T21:57:22+03:00",
            "date_modified": "2021-02-18T21:57:18+03:00",
            "tags": [
                "community",
                "life"
            ],
            "image": "https:\/\/ifedyukin.ru\/blog\/pictures\/EA8717FF-94E2-440F-B790-C7A29E38CD35.JPG",
            "_date_published_rfc2822": "Thu, 18 Feb 2021 21:57:22 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "52",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": [
                    "https:\/\/ifedyukin.ru\/blog\/pictures\/EA8717FF-94E2-440F-B790-C7A29E38CD35.JPG"
                ]
            }
        },
        {
            "id": "51",
            "url": "https:\/\/ifedyukin.ru\/blog\/all\/clubhouse-first-overview\/",
            "title": "Не понял Clubhouse",
            "content_html": "<p>Из всех щелей трубят про <a href=\"https:\/\/getclubhouseinvite.com\/\">Clubhouse<\/a>, все инвайты выпрашивают, элитная соц. сеть нового поколения. На волне хайпа нафармил инвайт и воодушевленный пошел поглощать контент и смотреть продукт.<\/p>\n<p>Во-первых, мне сразу в голову прилетела ассоциация: вся идея — это тот же <a href=\"https:\/\/zellowork.ru\/\">Zello<\/a> или какая-то другая интернет-рация.<\/p>\n<p>Таксисты, дальнобойщики и не только обсуждают там насущные проблемы и собираются по интересам в комнатки.<\/p>\n<p>Во-вторых, помимо Зелло есть аналогичная функциональность в Телеграме (с недавних пор), Дискорде (и куче его аналогов), даже Фейсбук дает возможность собраться в комнаты по интересам и пообсуждать что-то голосом.<\/p>\n<p>Да, сложновато выделить ведущих, но тот же Дискорд позволяет гибко права раздать, а если хочется сделать подкаст, чтоб все просто слушали, есть куча других платформ.<\/p>\n<div class=\"hr\"><\/div><p>И вот теперь я никак не могу разобраться, а чего оно полетело-то так?<br \/>\nПродукт, который не дает ничего уникального, у которого нет каких-то явно выделяющих его фич, со старой идеей привлекает кучу пользователей — 1.1 миллиона за 6 дней.<\/p>\n<p class=\"note-main\">Сначала я подумал, что там какой-то уникальный и интересный контент, но нет.<\/p>\n<p>Все те же обсуждения доступны в подкастах, чатах и блогах, только теперь этот контент представлен в виде бесконечного числа голосовых сообщений, к которым ты еще и вернуться не можешь.<\/p>\n<p class=\"note-aside\">Весь контент сразу пишется в \/dev\/null.<\/p>\n<p>Более того, половина комнат, в которые я зашел, представляли собой просто чатики-флудильни, где во время рабочего дня люди развлекаются, только мемы голосом нормально не передать.<\/p>\n<p>А весь интересный контент там возникает чисто на волне хайпа благодаря людям, которые и так делают качественный контент на других площадках.<\/p>\n<div class=\"hr\"><\/div><p>Хайп немного объясняет система инвайтов, которая добавляет некоторый шарм элитарности и пара этих крутых историй с выступлениями Цукерберга и Маска.<\/p>\n<p>Кажется, что ситуация будет как с Google.Plus, в которой было много интересного контента и куча людей, пока инвайты были и хайп, а потом все очень быстро убежали из этой сетки, делать-то там нечего, и так она и загнулась.<\/p>\n<p>Либо я опять-таки ничего не понял, продолжаю наблюдение.<\/p>\n",
            "date_published": "2021-02-12T20:51:03+03:00",
            "date_modified": "2023-04-06T12:31:44+03:00",
            "tags": [
                "community",
                "life"
            ],
            "_date_published_rfc2822": "Fri, 12 Feb 2021 20:51:03 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "51",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": []
            }
        },
        {
            "id": "48",
            "url": "https:\/\/ifedyukin.ru\/blog\/all\/frontops-trouble\/",
            "title": "Проблема FrontOps’а",
            "content_html": "<h2>TL;DR<\/h2>\n<ul>\n<li>Фронтопс — перенос девопс практик на фронтенд, так как у фронтенда есть своя специфика.<\/li>\n<li>Основная проблема — многие фронтендеры привыкли работать с хорошими инструментами, не зная, как они работают внутри, не понимая, что происходит с кодом после того, как он написан.<\/li>\n<li>Каждому фронтендеру нужно понимать, как собирается его проект, что происходит после сборки, как и в каком виде код доходит до пользователя, иметь представление об используемых и существующих инструментах<\/li>\n<\/ul>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/ifedyukin.ru\/blog\/pictures\/frontend-devops.png\" width=\"1600\" height=\"747\" alt=\"\" \/>\n<\/div>\n<p>Предыдущие два года на более, чем двух проектах я занимался такой деятельностью, которую обычно называют «FrontOps». Давайте разберемся, какие у фронтопса проблемы и как их решать.<\/p>\n<p><b>Дисклеймер:<\/b> По теме я не раз говорил на митапах <a href=\"https:\/\/webpurple.net\">Webpurple<\/a>, но структурировать все в текст так и не вышло нормально. Пост — просто изливание кучи мыслей, не структурирован, хотя планировалось нечто большое на несколько иную тему, в черновиках лежал больше, чем полгода, но, как <a href=\"https:\/\/marinintim.com\/2020\/publish-anyway\/\">говорил Тим<\/a>, надо признаться, что черновики не допишутся и публиковать как есть, вот публикую. Ниже все исключительно ИМХО.<\/p>\n<p>Повествование я начну как обычно — с небольшого отступления в прошлое. Когда я начинал работать как разработчик, я никогда не был против задач не для разработчика (как сейчас считается): сервер настроить, сконфигурировать прокси, сборщик из пачки sh-скриптов подкрутить, еще что-то. Да, эти задачи я решал постольку-поскольку, не использовал всякие крутые штуки и инструменты, до поры до времени ни про вагрант, ни про ансибл не слышал, но задачи решал и мне в целом нравилось.<\/p>\n<p>Что касается специализаций и развитий навыков, я приверженец T-shape подхода: в основном я фронтендер, но и в DevOps с бэкендом могу. Вот благодаря этому пересечению с девопсом я гордо могу назвать себя FrontOps’ом.<\/p>\n<h2>Появление FrontOps<\/h2>\n<p>Вторая часть слова — Ops. Когда говорят про Ops, вспоминается DevOps. Несколько обидно, что почему-то в <b>Dev<\/b>Ops не всегда включают FrontEnd, <s>шутка про формошлепов<\/s> на это есть свои причины, но начнем с того, что такое DevOps.<\/p>\n<blockquote>\n<p><b>DevOps<\/b> — методология взаимодействия специалистов по разработке (Dev) со специалистами по информационно-технологическому обслуживанию (Ops) и интеграцию их рабочих процессов друг в друга для обеспечения качества продукта.<\/p>\n<p><a href=\"https:\/\/ru.wikipedia.org\/wiki\/DevOps\">Wikipeadia — DevOps<\/a><\/p>\n<\/blockquote>\n<p>В диалогах я слышал что-то вроде: «Какие еще оперейшены во фронтоне?! Че там оперировать, статика же?», — наверно, поэтому как-то это все в отдельное направление и выделилось местами. Изначально, девопс — это больше про бэкенд и все, что около него, как-то так сложилось исторически, во всяком случая я чаще сталкивался с таким, что в рамках девопс-процессов о фронтенде никто особо не думал, и это как-то само должно было решаться. Ведь что нужно бэкенду? Кластер серверов, лоадбалансинг, умный деплоймент с нулевым даунтаймом, скейлинг и много всего сложного и интересного. А что на фронтенде обычно было? Отдать статику (часто через тот же бэкенд) и все, но сейчас времена другие.<\/p>\n<p>В итоге, отпочковался фронтопс. <b>Фронтопс<\/b> — ничто иное, как <b>перенос девопс-практик на фронтенд<\/b>. Те же практики, те же решаемые задачи, просто с некоторой спецификой что ли. Девопс (и фронтопс, выходит, тоже) подразумевает работу по некоторому циклу из определенных шагов с использованием определенных техник и инструментов.<\/p>\n<h2>Проблема FrontEnd ~ Ops<\/h2>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/ifedyukin.ru\/blog\/pictures\/devops-phase.png\" width=\"1280\" height=\"725\" alt=\"\" \/>\n<\/div>\n<p class=\"foot\">Create... а дальше?<\/p>\n<p>После того, как код написали, с ним еще много интересного происходит до того, как он начнет решать задачи пользователя и бизнеса, да и в процессе выполнения этих задач интересное не заканчивается. На бэкенде, разработчики в большинстве своем представляют, что с кодом происходит, после того, как он скомпилировался, так как по-другому там жить довольно сложно, надо все-таки понимать, кто там jar’ник запустил и какие и куда пакеты летают, бэкендерам даже надо понимать, что такое TCP, например (!!!).<\/p>\n<p>В мире фронтенда ситуация несколько иная. На один мой комментарий в ревью «этот код не соберется вот по этой причине, вот линк, почитай, интересная штука» мне отвечали «я простой разработчик, это меня не касается» (утрирую, но примерно так было). WTF? В тот момент я понял, что что-то не так.<\/p>\n<p>Откуда растут ноги этой проблемы? Из времен, когда разработка фронтенда заключалась в запуске сервера статики (и то не всегда) и изменения файликов, которые тут же отображаются в браузере, а деплой заключался в том, чтобы отдать файлики бэкендерам, а они там в jsp перегонят и сами разберутся, или загрузить файлики через FTP на другой сервер. Просто, круто, DX на высоте, код написал и все.<\/p>\n<p>Мир меняется, требования растут, технологии усложняются. Сначала начали гонять файлы через различные инструменты, которые код бандлят и транспилируют, потом этапы стали сложнее и дольше, а файлов стало больше, добавились дополнительные этапы, куча библиотек, фреймворки. С одной стороны, сейчас ситуация совсем другая, но с другой — для многих разработчиков все остается так же с небольшим усложнением:<\/p>\n<ul>\n<li>`git clone` — оп, код у меня;<\/li>\n<li>`npm install` — ну, зависимости у меня, погнали;<\/li>\n<li>`npm start` — ммм, *клик-клац-клик*, все, написал;<\/li>\n<li>`git commit -a && git push` — отлично, таску в резолв.<\/li>\n<\/ul>\n<div style=\"width:100%;height:0;padding-bottom:56%;position:relative;\"><iframe src=\"https:\/\/giphy.com\/embed\/QNFhOolVeCzPQ2Mx85\" width=\"100%\" height=\"100%\" style=\"position:absolute\" frameBorder=\"0\" class=\"giphy-embed\" allowFullScreen><\/iframe>\n<\/div><p><br><\/p>\n<p>С точки зрения разработчика ничего особо не поменялось, но появилась какая-то магия, которая где-то там что-то делает. Разработчик не знает, как оно работает внутри и что происходит с кодом после пуша, да даже не после пуша, а после сохранения файлика, кто над этим файликом колдует на его компьютере, во что превращается этот файлик. Рассмотрим выдуманную историю. В один момент было решено переехать из одного облака в другое и допилить пару крупных фич. Для этого надо в зависимоти от инстанса приложения нужно обращаться к различным сервисам, чуть-чуть подпилить сборку проекта, чтобы он собирал все в несколько бандлов и парочку шрифтов подключить.<\/p>\n<p>Вроде бы задача понятна, но для многих разработчиков фронтенда она нерешаема по одной простой причине: <b>они слишком отдалились от инструментов разработки и не успели подстроиться под их изменения<\/b>, да и думать об этом часто не нужно, и «вообще пусть это девопсы делают, оперейшены все-таки». Но откуда девопс-инженерам знать о том, как код должен собираться вебпаком? А тем более о всяких узких местах, типа хранений шрифтов на том же домене, чтобы лишний dns-запрос не делался?<\/p>\n<p>Много разработчиков на C++ вы знаете, которые не понимают, как линкуются библиотеки и не могут написать make-файл? А фронтендеров таких много, и это часто не проблема фронтендера, да и не проблема это, просто у нас много инструментов, которые легко устанавливаются и все делают сами.<\/p>\n<blockquote>\n<p>Хорошо, когда инструменты настолько удобны, что легко решают все проблемы за тебя. Плохо, когда ты не представляешь, как они это делают.<\/p>\n<\/blockquote>\n<h2>Решаем проблемы<\/h2>\n<p>Фронтопс — это не только девопс + фронтенд, фронтопс — то, что нужно знать фронтенд разработчику, для того, чтобы быть действительно фронтенд разработчиком, ведь закомиченный код — далеко не результат работы. Нужно понимать, что с кодом происходит, куда он потом помещается и как доходит до пользователя.<\/p>\n<p>Если вы понимаете, что происходит с вашим кодом в вашем проекте, напишите к этому документацию, устройте пару созвонов, где покажете остальным участникам команды, что и как просиходит в процессе сборки, непрерывных интеграций, деплоя.<\/p>\n<p>Если вы не понимаете этого, изучите проект и инструменты, которые в нем используются, почитайте документацию к ним, спросите более опытных тиммейтов, сделайте собственный стартер или пет-проджект, накрутите там крутой CI\/CD, оптимальную сборку.<\/p>\n<p>Изучение «оперейшенов» на базовом уровне занимает не так много времени, но это очень ценный и полезный опыт, который положительно скажется на кругозоре и понимании того, как вообще работает проект и какую роль в нем занимает фронтенд.<\/p>\n<h2>Инструменты, о которых нужно иметь представление<\/h2>\n<ul>\n<li>Вебпак, бабел, бандлеры, таск-раннеры (<a href=\"https:\/\/webpack.js.org\/guides\/getting-started\/\">Webpack<\/a>, <a href=\"https:\/\/babeljs.io\/docs\/en\/\">Babel<\/a>, <a href=\"https:\/\/docs.npmjs.com\/misc\/scripts\">npm-scripts<\/a>, <a href=\"https:\/\/gulpjs.com\/\">Gulp<\/a>) — изучите принцип работы сборщиков и компиляторов JavaScript, TypeScript, CSS, поймите разницу между Rollup и Webpack, изучите возможности npm-scripts и Gulp (хоть его и мало кто использует сейчас).<\/li>\n<li>Форматтеры, линтеры, статические анализаторы (<a href=\"https:\/\/eslint.org\/\">ESlint<\/a>, <a href=\"https:\/\/prettier.io\/\">Prettier<\/a>, <a href=\"https:\/\/github.com\/stylelint\/stylelint\">stylelint<\/a>, <a href=\"https:\/\/www.sonarqube.org\/\">SonarQube<\/a>) — хватит спорить на ревью о том, где должна стоять запятая, хватит мутировать иммутабельные значения, автоматизируйте проверку этого.<\/li>\n<li>Git и хуки (<a href=\"https:\/\/github.com\/typicode\/husky\">Husky<\/a>, <a href=\"https:\/\/github.com\/okonet\/lint-staged\">lint-staged<\/a>, <a href=\"https:\/\/try.github.io\/\">Learn Git<\/a>) — изучите Git, для вас не должны быть проблемой ребейзы, которые заканчиваются конфликтами, используйте хуки для автоматического запуска проверок.<\/li>\n<li>Тестирование (<a href=\"https:\/\/jestjs.io\/\">Jest<\/a>, <a href=\"https:\/\/mochajs.org\/\">Mocha<\/a>, <a href=\"https:\/\/jasmine.github.io\/\">Jasmine<\/a>, <a href=\"https:\/\/www.cypress.io\/\">Cypress<\/a>) — изучите инструменты тестирования, способы их использования, виды тестов.<\/li>\n<li>Дополнительные инструменты для проверок проекта (<a href=\"https:\/\/github.com\/ai\/size-limit\">size-limit<\/a>, <a href=\"https:\/\/github.com\/GoogleChrome\/lighthouse-ci\">Lighthouse CI<\/a>) — проверяйте перформанс-метрики вашего проекта прямо на этапе непрерывных интеграций.<\/li>\n<li>CDN, файлы, сервера и прокси (<a href=\"https:\/\/nginx.org\/ru\/\">nginx<\/a>, <a href=\"https:\/\/aws.amazon.com\/ru\/s3\/\">S3<\/a>, <a href=\"https:\/\/aws.amazon.com\/ru\/cloudfront\/\">CloudFront<\/a>, <a href=\"https:\/\/cloudinary.com\/\">Cloudinary<\/a>) — изучите, как файлы могут храниться и раздаваться.<\/li>\n<li>Мониторинг (<a href=\"https:\/\/www.nginx.com\/products\/nginx-amplify\/\">Amplify<\/a>, <a href=\"https:\/\/sentry.io\/welcome\/\">Sentry<\/a>) — настройте мониторинги, отслеживайте, что происходит с кодом при использовании.<\/li>\n<li>Деплой, сервера, докер (<a href=\"https:\/\/github.com\/ansible\/ansible\">Ansible<\/a>, <a href=\"https:\/\/docs.docker.com\/get-started\/\">Docker<\/a>, <a href=\"https:\/\/habr.com\/ru\/post\/122445\/\">SSH<\/a>) — изучите подходы к деплою, варианты запуска приложений, научитесь работать с SSH и консолью — это действительно нужный навык.<\/li>\n<li>CI\/CD (<a href=\"https:\/\/docs.gitlab.com\/ee\/ci\/\">GitLab CI<\/a>) — изучите принципы и подходы к организации CI\/CD, сделайте полезный пайплайн для своего проекта или оптимизируйте существующий.<\/li>\n<\/ul>\n",
            "date_published": "2020-06-07T18:59:53+03:00",
            "date_modified": "2021-01-24T19:00:24+03:00",
            "tags": [
                "community",
                "development",
                "javascript"
            ],
            "image": "https:\/\/ifedyukin.ru\/blog\/pictures\/frontend-devops.png",
            "_date_published_rfc2822": "Sun, 07 Jun 2020 18:59:53 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "48",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": [
                    "https:\/\/ifedyukin.ru\/blog\/pictures\/frontend-devops.png",
                    "https:\/\/ifedyukin.ru\/blog\/pictures\/devops-phase.png"
                ]
            }
        },
        {
            "id": "45",
            "url": "https:\/\/ifedyukin.ru\/blog\/all\/indieweb\/",
            "title": "Indieweb",
            "content_html": "<p>Впервые в индивеб я погрузился тогда, когда у меня появился интернет, правда, я тогда не знал, что это называется “индивеб”. В первые пару месяцев я сделал себе простенький сайт на narod.ru (вроде бы, да и где же еще?), потом переписал его на php, что-то туда постил, что-то там делал, старался развивать его, переписывал все стабильно минимум раз в полгода.<\/p>\n<p>Мне всегда была близка и я периодически проталкивал моим знакомым идею, что у каждого пользователя сети его персональная страничка должна быть не во ВКонтакте или Фейсбуке, а на собственном домене с полным владением контентом и управлением всем, начиная от размера шрифта, заканчивая сводом правил поведения в комментариях. Мне всегда очень нравилась концепция персональных сайтов и блогов, ведь они, в большинстве своем, передают уникальность автора. И вот оказалось, есть такая штука, как индивеб — полноценное движение и сообщество!<\/p>\n<blockquote>\n<p>IndieWeb is a community of people building software to enable personal, independently hosted blogs to independently maintain their social data on their own web domains rather than on large, centralized social networking services.<br \/>\n<a href=\"https:\/\/en.wikipedia.org\/wiki\/IndieWeb\">IndieWeb<\/a><\/p>\n<\/blockquote>\n<p>Самое интересное, что я как-то встречал тематические сайты, читал статьи, смотрел доклады с каких-то митапов, но всегда пропускал это мимо до недавнего времени. Более полно узнал я об индивебе из <a href=\"https:\/\/marinintim.com\/2019\/indieweb\/24\/\">серии постов<\/a> от Тима Маринина.<\/p>\n<p class=\"note\">Поигрался с вебменшенами и фичами индивеба, но по итогу уехал на Эгею, где этого из коробки нет. Может быть, когда-то допилю, а может быть нет. Удобство постинга все-таки победило<\/p>\n<p>Впечатлившись, я несколько пересмотрел свой взгляд на веб в целом, а также допилил немного свой блог — теперь он поддерживает webmention’ы (можно прямо через кнопочку фидбэка справа вверху отправить вебменшен) и… ну, в остальном — пока он не совсем инди, ибо хостится, например, на Netlify, что не совсем канон, однако, самый кайф — это владение своим контентом и свой личный уникальный уголок в сети, а не, например, пачка статей на медиуме. С какой-то стороны мотивирует писать шитпостить именно сюда, а не в твиттер. Постараюсь так и делать, ведь собирался уже много раз.<\/p>\n<p>Тим, спасибо за отличную серию постов! Очень много нового и интересного узнал, был приятно удивлен количеством возможностей, которые дает индивеб. С нетерпением жду продолжения в каком-то еще формате.<\/p>\n<p>Надеюсь, этот вебменшен для Тима успешно отправится emoji-smile<br \/>\nОбязательно прочитайте серию постов от Тима и присылайте вебменшены!<\/p>\n<p><b>UPD.<\/b> Узнал, что W3C опубликовала рекомендации по стандарту Webmention в этот же день 3 года назад. Интересное совпадение.<\/p>\n",
            "date_published": "2020-01-13T18:44:00+03:00",
            "date_modified": "2021-01-24T18:44:14+03:00",
            "tags": [
                "blog",
                "community"
            ],
            "_date_published_rfc2822": "Mon, 13 Jan 2020 18:44:00 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "45",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": []
            }
        },
        {
            "id": "42",
            "url": "https:\/\/ifedyukin.ru\/blog\/all\/holyjs-moscow-2019\/",
            "title": "HolyJS Moscow 2019",
            "content_html": "<p>Как и планировалось, побывал на <a href=\"https:\/\/holyjs-moscow.ru\/\">HolyJS Moscow 2019<\/a>.<\/p>\n<p>Конференция максимально крутая, спикеры тоже. Организовано все было очень круто, площадка выбрана тоже удачно.<\/p>\n<p>Доклады шли в несколько потоков, и выбрать что-то, что может быть тебе интересно, не составляло труда, жаль только, что пропустил Lightning talks секцию. По каждому докладу не вижу смысла что-то подробно расписывать, тут во много будет вкусовщина, но в целом впечатления только положительные, чувствуется уровень подготовки к каждому докладу и колоссальный объем работы, проделанной программным комитетом, организаторами, спикерами.<\/p>\n<p>Очень здорово, что все в рамках конференции равны, общение в дискуссионных зонах действительно живое и интересное, а не, как это иногда бывает, натянутое “потому что надо”. Много впечатлений дали эти дискуссии и общение с деятелями коммьюнити, довольно сильно вдохновляет и толкает делать что-то свое и проявлять какую-то активность. В будущем нужно будет точно попробовать себя в роли спикера на конференциях и митапах за пределами Рязани — не все же одним городом ограничиваться.<\/p>\n<p>Наверно, именно эта конференция стала первым поводом порадоваться тому, что Москва не так далеко от Рязани. Так что теперь, думаю, на все HolyJS в Москве я буду с удовольствием “кататься”, а может быть, и на Питерские тоже. В моем личном рейтинге HolyJS — лучшая конференция для Javascript-разработчиков в России, и это не потому что я о других не слышал, а потому что оно так и есть.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/ifedyukin.ru\/blog\/pictures\/holy-moscow-2019.jpeg\" width=\"2048\" height=\"1536\" alt=\"\" \/>\n<\/div>\n",
            "date_published": "2019-11-15T18:27:59+03:00",
            "date_modified": "2021-01-24T18:28:14+03:00",
            "tags": [
                "community",
                "life"
            ],
            "image": "https:\/\/ifedyukin.ru\/blog\/pictures\/holy-moscow-2019.jpeg",
            "_date_published_rfc2822": "Fri, 15 Nov 2019 18:27:59 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "42",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": [
                    "https:\/\/ifedyukin.ru\/blog\/pictures\/holy-moscow-2019.jpeg"
                ]
            }
        },
        {
            "id": "40",
            "url": "https:\/\/ifedyukin.ru\/blog\/all\/rs-conf-2019\/",
            "title": "RS Conf 2019",
            "content_html": "<p>С 9 по 11 августа в Минске проходила конференция ”<a href=\"https:\/\/rsconf.by\/\">The Rolling Scopes Conference 2019<\/a>”, на которой я побывал. Отмечу, что это первая зарубежная конференция, на которой я побывал, хоть и Москва-Минск считается внутренним рейсом.<\/p>\n<p>В Минске я тоже был впервые, о городе много рассказать не могу, ибо большая часть времени все-таки отошла конференции, но и пост не об этом. Если кратко о городе, то он мне понравился, причем гораздо сильнее той же Москвы. За все время общественным транспортом воспользовался один раз, остальные передвижения либо пешком, либо на самокатах, которые днем легко найти, а вот вечером их разбирают другие любители ночных покатушек на электро-транспорте. Вероятно, общее впечатление несколько нерелевантно, ввиду того, что место проведения конференции было выбрано довольно удачно (точнее улица, где это место было).<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/ifedyukin.ru\/blog\/pictures\/msq-rs-conf-street.jpg\" width=\"1280\" height=\"960\" alt=\"\" \/>\n<\/div>\n<p>Доклады были на русском и английском языках, параллельно на трех сценах. Конференция шла три дня, первый день из которых был днем мобильных разработчиков и дизайнеров, причем сначала мне казалось, что этот день точно не для меня, но все же много нового узнал из докладов на общие темы (паттерны, подходы к разработке) и докладов по дизайну (разделяю ту точку зрения, что разработчики отчасти дизайнеры и наоборот). Забавно, что больше всего всем запомнился не какой-то конкретный доклад, а <a href=\"https:\/\/www.youtube.com\/watch?v=0k-_4WloY6Y\">один из роликов<\/a>, показанный как пример продакшена креативных студий в одном из докладов.<\/p>\n<p><a href=\"https:\/\/twitter.com\/evoneering\/status\/1160243552837931008\">https:\/\/twitter.com\/evoneering\/status\/1160243552837931008<\/a><\/p><p>Оставшиеся два дня были посвящены теме “JS\/FrontEnd”, в эти дни мне было уже более комфортно, что слушать доклады, что участвовать в других активностях.<\/p>\n<p>PS ClassicВ частности «Evolution Gaming» проводили челлендж по минификации кода на JS (минифицировать нужно было ручками, да). Смело могу заявить, что это был первый подобный челлендж за все время на всех конференциях, в котором мне было действительно интересно участвовать, да и на стенде были люди, с которыми было просто интересно просто пообщаться.<br \/>\nИнтерес к челленджу также подогревался открытой доской с результатами и периодическими сообщениями в чат конференции о том, что кто-то вышел вперед. За первое место полагалась PS Classic, в первый день я ее и забрал, во второй день челлендж был не менее интересным, но я решил уже не участвовать (зачем мне еще одна PS Classic).<\/p>\n<div class=\"e2-text-picture\">\n<div class=\"fotorama\" data-width=\"960\" data-ratio=\"0.75\">\n<img src=\"https:\/\/ifedyukin.ru\/blog\/pictures\/msq-rs-conf-ps.jpg\" width=\"960\" height=\"1280\" alt=\"\" \/>\n<img src=\"https:\/\/ifedyukin.ru\/blog\/pictures\/msq-rs-conf-photo.jpg\" width=\"1920\" height=\"2560\" alt=\"\" \/>\n<\/div>\n<\/div>\n<p>Тематика докладов была разнообразной, затронули и просто подходы к разработке, и GDPR, и архитектуру. Спикеры в большинстве своем широко охватывали темы и были не против пообщаться после докладов, как-то дополнительно раскрыть свою точку зрения. Новой информации и знаний получил много, на некоторые проблемы и вопросы посмотрел с другой стороны.<\/p>\n<p>Доклады были интересными, организация отличная, мерч получил, Минск посмотрел, с интересными людьми пообщался. Отличная конференция, по возможности, в следующем году также приеду, а, может быть, и как спикер попробую выступить, если достойную тему найду, не всегда же на локальных мероприятиях только участвовать.<\/p>\n<p>Под приятными впечатлениями от этой конференции решил посетить “HolyJS”, посмотрим, как оно будет.<\/p>\n",
            "date_published": "2019-09-13T18:22:31+03:00",
            "date_modified": "2021-01-24T18:22:49+03:00",
            "tags": [
                "community",
                "javascript",
                "life"
            ],
            "image": "https:\/\/ifedyukin.ru\/blog\/pictures\/msq-rs-conf-street.jpg",
            "_date_published_rfc2822": "Fri, 13 Sep 2019 18:22:31 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "40",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "https:\/\/platform.twitter.com\/widgets.js",
                    "system\/library\/embedded-tweet\/embedded-tweet.js",
                    "system\/library\/jquery\/jquery.js",
                    "system\/library\/fotorama\/fotorama.css",
                    "system\/library\/fotorama\/fotorama.js"
                ],
                "og_images": [
                    "https:\/\/ifedyukin.ru\/blog\/pictures\/msq-rs-conf-street.jpg",
                    "https:\/\/ifedyukin.ru\/blog\/pictures\/msq-rs-conf-ps.jpg",
                    "https:\/\/ifedyukin.ru\/blog\/pictures\/msq-rs-conf-photo.jpg"
                ]
            }
        },
        {
            "id": "29",
            "url": "https:\/\/ifedyukin.ru\/blog\/all\/dockerize-js\/",
            "title": "Docker’изация JavaScript-приложений",
            "content_html": "<p>Поучаствовал в IT-Субботнике, рассказал о Docker’изации JavaScript-приложений.<\/p>\n<div class=\"e2-text-video\">\n<iframe src=\"https:\/\/www.youtube.com\/embed\/xC7-HCPEn6k?enablejsapi=1\" allow=\"autoplay\" frameborder=\"0\" allowfullscreen><\/iframe>\n<\/div>\n",
            "date_published": "2018-11-30T18:03:02+03:00",
            "date_modified": "2021-01-24T18:03:37+03:00",
            "tags": [
                "community",
                "development",
                "devops",
                "javascript"
            ],
            "image": "https:\/\/ifedyukin.ru\/blog\/pictures\/remote\/youtube-xC7-HCPEn6k-cover.jpg",
            "_date_published_rfc2822": "Fri, 30 Nov 2018 18:03:02 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "29",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/jquery\/jquery.js",
                    "system\/library\/media-seek\/media-seek.js"
                ],
                "og_images": [
                    "https:\/\/ifedyukin.ru\/blog\/pictures\/remote\/youtube-xC7-HCPEn6k-cover.jpg"
                ]
            }
        },
        {
            "id": "27",
            "url": "https:\/\/ifedyukin.ru\/blog\/all\/github-activity-overview\/",
            "title": "GitHub Activity Overview",
            "content_html": "<p>GitHub дали возможность показать в профиле большее подробную статистику активности. Выглядит интересно, но хотелось бы ещё что-нибудь про языки\/фреймворки, может быть область деятельности: web, ml, etc, — хотя это пока лишь бета, дальше, думаю, добавят что-то более глобальное.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/ifedyukin.ru\/blog\/pictures\/github-stats.png\" width=\"636\" height=\"445\" alt=\"\" \/>\n<\/div>\n",
            "date_published": "2018-09-04T18:00:00+03:00",
            "date_modified": "2021-01-24T18:00:15+03:00",
            "tags": [
                "community",
                "development"
            ],
            "image": "https:\/\/ifedyukin.ru\/blog\/pictures\/github-stats.png",
            "_date_published_rfc2822": "Tue, 04 Sep 2018 18:00:00 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "27",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": [
                    "https:\/\/ifedyukin.ru\/blog\/pictures\/github-stats.png"
                ]
            }
        },
        {
            "id": "21",
            "url": "https:\/\/ifedyukin.ru\/blog\/all\/webpurple-tg-bot\/",
            "title": "WebPurple Telegram Bot",
            "content_html": "<p>В последние пару недель я пытаюсь активно саморазвиваться, изучать что-то новое и делать чисто из интереса, даже диплом писать начал.<br \/>\nВ первую очередь мой интерес направлен на NodeJS и всё вот это серверное, поэтому дальше BackEnd’а дипломного проекта я не дошёл, но разговор не об этом.<\/p>\n<p>В Рязани наиболее активным и растущим сообществом разработчиков является WebPurple, к которому я себя смело могу отнести, ибо я являюсь активным участником (ну, я так считаю).<\/p>\n<p>Для обсуждения всякого разного был создан чатик в Telegram, ну и чтобы привнести интерактивности, было принято решение сделать какого-нибудь бота, чтоб прямо круто всё было.<\/p>\n<p>Изначально бот предполагался в виде типичного бота из IRC-каналов, но в итоге обсуждения он перешёл в разряд «самостоятельных» ботов. Разработкой решил заниматься я, однако в плане различных особенностей на уровне разработки, языка (NodeJS) и его использования мне помогали коллеги, чему я очень рад и благодаря чему я опять же узнал много нового.<\/p>\n<p>Бот не должен был быть сложным и нагруженным, его задачей было просто джелиться информацией, составленный список функций выглядел как-то так:<\/p>\n<ul>\n<li>По запросу отправлять последние новости;<\/li>\n<li>По запросу отправлять информацию о планируемых мероприятиях;<\/li>\n<li>По запросу отправлять ссылочки на сообщества, репозитории и всякое такое;<\/li>\n<li>Дать юзеру возможность подписаться на рассылку новостей и как только, так сразу слать ему посты.<\/li>\n<\/ul>\n<p>Вроде бы всё, изначально информацию планировалось тащить из API нашего сайта, но потом всё-таки передумали, и теперь тащим всё прямиком из группы ВКонтакте, ибо она в большей части кейсов является как бы первоисточником всего и вся.<\/p>\n<p>Дабы упростить процесс разработки я, недолго думая, ввёл следующую команду в терминал и был рад.<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">npm install --save node-telegram-bot-api<\/code><\/pre><p>Первые сложности возникли, когда я пытался с Long-Pulling соединения всё на WebHook’и переделать, но это я мануалы плохо читал.<br \/>\nПо итогу первая версия, которая просто отдавала «статику» завелась за пару часов. А всё просто потому, что надо учитывать всякие слэши и вот это всё, ну и то, что у меня не чисто бот, а Express, «внутри» которого живёт бот.<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">const TelegramBot = require('node-telegram-bot-api');\r\nconst botUrl = `\/bot${botToken}`;\r\nconst bot = new TelegramBot(botToken, {\r\n  onlyFirstMatch: true,\r\n});\r\n\r\napp.post(botUrl, (req, res) =&gt; {\r\n  bot.processUpdate(req.body);\r\n  res.sendStatus(200);\r\n});\r\n\r\napp.listen(port, () =&gt; {\r\n  console.log(`Express server is listening on ${port}`);\r\n  bot.setWebHook(`https:\/\/example.com${botUrl}`);\r\n});<\/code><\/pre><p>Стоит учесть, что мне было лень разбираться с нормальным выстраиванием процессов разработки бота, поэтому всё отлаживал я прямо на Heroku, деплоя туда новую версию, т. к. всё было быстро, неудобств я не испытывал. Но для вероятных контрибьюторов я упростил задачу и сделал Long-Pooling в development-окружении, а WebHook’и только в production:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">const TelegramBot = require('node-telegram-bot-api');\r\nconst botUrl = `\/bot${botToken}`;\r\nconst bot = new TelegramBot(botToken, {\r\n  onlyFirstMatch: true,\r\n  polling: !isProduction,\r\n});\r\n\r\napp.listen(port, () =&gt; {\r\n  console.log(`Express server is listening on ${port}`);\r\n  if (isProduction) {\r\n    bot.setWebHook(`${hookUrl}${botUrl}`);\r\n  }\r\n});<\/code><\/pre><p>Следющая сложность — многоязычность. Довольно много времени было потрачено на поддержку нескольких языков, чтобы бот, в зависимости от языка, слал то или иное сообщение. Не понятно, зачем оно нужно было, но раз есть, значит есть. Поэтому тексты всех сообщений и регулярных выражений получаются из функции, которая принимает на вход яхык.<br \/>\nНу, и пару раз я думал, что всё сломал, а это просто Telegram кэширует (или что-то ещё с ними делает) настройки языка.<\/p>\n<p>Затем пришла пора работать с API ВКонтакте, обрабатывать хуки от Callback API и вот это всё. Документацию я опять же читал не совсем внимательно, но когда в ответ на запрос нужно отправлять помимо статуса 200 ещё и текст `ok` <b>именно маленькими<\/b> буквами было для меня чуть-чуть неожиданно.<br \/>\nА перед этим на этот же запрос нужно отправлять ответ в виде «сколько-то_там_значного» кода. Чтобы не производить деплой пару раз подряд я вынес эту переменную в ENV.<\/p>\n<p>Callback API — лучшая часть VK API, потому что... использовать его ну очень просто. Получить текст записи, только что опубликованной в группе — элементарно! Однако, я хотел дать пользователям возможность получать контент по некоторому набору категорий, которые задавались в постах хэш-тэгами. Несколько реализаций «парсера» были испробованы, в итоге остановился на варианте ниже, т. к. проще, удобнее, теги можно обработать перед отправкой:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">const formattedText = text.replace(\r\n  regExp,\r\n  (_, type) =&gt; {\r\n    types.push(type);\r\n    return `#${type}`;\r\n  }\r\n);<\/code><\/pre><p>Плюс ко всему теперь на любой запрос нужен хоть какой-то ключ, из сообщества нельзя вытащить список эвентов, организованных им, поэтому пришлось приделывать костыли в виде поиска по группам от имени пользователя и фильтрации нужных групп-эвентов. Т. к. поиск идёт по названиям, то кто-то левый вполне может попасть в выборку, ведь даже список организаторов эвента получить нельзя. Надеюсь, ВК скоро решат эту проблему.<\/p>\n<p>Таким образом получение планируемых эвентов выглядит как-то так:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">fetch(\/* Получаем 5 групп по определённому названию, с типом &quot;event&quot;, старт которых только будет в будущем *\/)\r\n  .then(r =&gt; r.json())\r\n  .then((r) =&gt; {\r\n    \/\/ Для вязкости добавим проверок\r\n    if (r.response &amp;&amp; r.response.items &amp;&amp; r.response.items.length) {\r\n      const groups = r.response.items.map(g =&gt; g.id);\r\n      fetch(\/* О каждой группе получим информацию *\/)\r\n        .then(res =&gt; res.json())\r\n        .then((res) =&gt; {\r\n          if (res.response &amp;&amp; res.response.length) {\r\n            const processEvent = vkEventProcess(uid, bot);\r\n            res.response\r\n              .sort((a, b) =&gt; a.start_date - b.start_date)\r\n              .reduce(\r\n                \/\/ Тут &quot;чейним&quot; отправку сообщений, чтобы был точный порядок\r\n                (promise, event) =&gt; promise.then(\r\n                  () =&gt; processEvent(event),\r\n                  err =&gt; console.log(err),\r\n                ),\r\n                Promise.resolve(),\r\n              );\r\n          }\r\n        });\r\n    } else {\r\n      bot.sendMessage(uid, getNoEventsMessage(lang));\r\n    }\r\n  });<\/code><\/pre><p>Получение ключа пользователя для сервера — отдельная повесть, в неё я углубляться не буду, просто скажу, что раньше было лучше... и проще с этим всем. Да и с документацией API дела лучше обстояли, во всяком случае не было подобного:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/ifedyukin.ru\/blog\/pictures\/vk_api-member_status.png\" width=\"580\" height=\"165\" alt=\"\" \/>\n<\/div>\n<p class=\"foot\">Описание `member_status`<\/p>\n<p>Потом были этапы отладки, поиска багов и вот этого всего «предрелизного». Затем проведены интеграции, написаны тесты, небольшой README, добавлена возможность нормальной локальной отладки (был бы localetunnel, была б сказка, но там всё от параметров сети сильно зависит), CI, простой деплой на собственный инстанс Heroku и... «релиз».<\/p>\n<div id=\"vk_post_-94098151_899\"><\/div><script type=\"text\/javascript\">\r\n  (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0]; if (d.getElementById(id)) return; js = d.createElement(s); js.id = id; js.src = \"\/\/vk.com\/js\/api\/openapi.js?151\"; fjs.parentNode.insertBefore(js, fjs); }(document, 'script', 'vk_openapi_js'));\r\n  (function() {\r\n    if (!window.VK || !VK.Widgets || !VK.Widgets.Post || !VK.Widgets.Post('vk_post_-94098151_899', -94098151, 899, 'kqc7UUQ3k248p5n5UAQ4ts0q-is')) setTimeout(arguments.callee, 50);\r\n  }());\r\n<\/script>\n<p><br><\/p>\n<p>После релиза я обнаружил, что событие «Репост» у ВКонтакте работает не совсем так, как я ожадал, поэтому пришлось быстренько фиксить, но все подписчики бота тогда уже получили невалидное сообщение.<\/p>\n<p>Пост изначально планировался каким-то более содержательным и интересным, но из-за своей лени я остановился просто на перечислении сложностей, которые возникли в процессе разработки. Это всё-таки просто мой дневник в стиле «а что я вообще тогда делал».<\/p>\n<p>Посмотреть на бота можно здесь: <a href=\"https:\/\/t.me\/WebPurple_bot\/\">Telegram Bot<\/a>.<br \/>\nПоучаствовать в разработке, предложить функционал и сообщить о багах можно здесь: <a href=\"https:\/\/github.com\/ifedyukin\/WebPurple-tg-bot\">GitHub<\/a>.<\/p>\n",
            "date_published": "2018-01-25T17:39:46+03:00",
            "date_modified": "2021-01-24T17:40:41+03:00",
            "tags": [
                "community",
                "development",
                "javascript"
            ],
            "image": "https:\/\/ifedyukin.ru\/blog\/pictures\/vk_api-member_status.png",
            "_date_published_rfc2822": "Thu, 25 Jan 2018 17:39:46 +0300",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "21",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [
                    "system\/library\/highlight\/highlight.js",
                    "system\/library\/highlight\/highlight.css"
                ],
                "og_images": [
                    "https:\/\/ifedyukin.ru\/blog\/pictures\/vk_api-member_status.png"
                ]
            }
        }
    ],
    "_e2_version": 4098,
    "_e2_ua_string": "Aegea 11.1 (v4098)"
}