This media is not supported in your browser
VIEW IN TELEGRAM
#статья дня
Ну чо, котаны, есть занятная история с GitHub.
Исследователь Шерон Бризинов решил проверить, что вообще происходит с коммитами, которые мы с вами удаляем через git reset и force push: https://trufflesecurity.com/blog/guest-post-how-i-scanned-all-of-github-s-oops-commits-for-leaked-secrets
Спойлер — никуда они не исчезают.
GitHub продолжает хранить все те ваши коммиты с ключами и секретами бесплатных и не очень API, даже если нам кажется, что мы всё подчистили.
Собственно, идея исследования простая: если коммиты не пропадают, значит, в них вполне могут оставаться секреты — ключи, токены и прочие радости.
Шерон пошёл и просканировал архив GitHub за несколько лет. Нашёл он там немало интересного, включая утечки, которые потом оценили на баг-баунти в 25 тысяч долларов.
Чтобы процесс не был ручным, он вместе с Truffle Security сделал инструмент Force Push Scanner.
Этот сканер вытаскивает пуши, достаёт зависшие коммиты и прогоняет их через TruffleHog, чтобы поймать секреты. Получился вполне практичный open source, которым можно пользоваться прямо сейчас.
Вывод в итоге грустный, но очевидный: удалить коммит — не значит избавиться от проблемы. GitHub всё хранит, и если секрет уже засветился, его надо менять, а не надеяться на «забывчивость» платформы.
Лучше, конечно, не допускать таких ошибок вовсе, но если уж случилось — придётся действовать радикально.
P. S. у этой статьи есть не менее занятная предыстория, которая дополняет общую картину: https://medium.com/@sharon.brizinov/how-i-made-64k-from-deleted-files-a-bug-bounty-story-c5bd3a6f5f9b
#github
Ну чо, котаны, есть занятная история с GitHub.
Исследователь Шерон Бризинов решил проверить, что вообще происходит с коммитами, которые мы с вами удаляем через git reset и force push: https://trufflesecurity.com/blog/guest-post-how-i-scanned-all-of-github-s-oops-commits-for-leaked-secrets
Спойлер — никуда они не исчезают.
GitHub продолжает хранить все те ваши коммиты с ключами и секретами бесплатных и не очень API, даже если нам кажется, что мы всё подчистили.
Собственно, идея исследования простая: если коммиты не пропадают, значит, в них вполне могут оставаться секреты — ключи, токены и прочие радости.
Шерон пошёл и просканировал архив GitHub за несколько лет. Нашёл он там немало интересного, включая утечки, которые потом оценили на баг-баунти в 25 тысяч долларов.
Чтобы процесс не был ручным, он вместе с Truffle Security сделал инструмент Force Push Scanner.
Этот сканер вытаскивает пуши, достаёт зависшие коммиты и прогоняет их через TruffleHog, чтобы поймать секреты. Получился вполне практичный open source, которым можно пользоваться прямо сейчас.
Вывод в итоге грустный, но очевидный: удалить коммит — не значит избавиться от проблемы. GitHub всё хранит, и если секрет уже засветился, его надо менять, а не надеяться на «забывчивость» платформы.
Лучше, конечно, не допускать таких ошибок вовсе, но если уж случилось — придётся действовать радикально.
P. S. у этой статьи есть не менее занятная предыстория, которая дополняет общую картину: https://medium.com/@sharon.brizinov/how-i-made-64k-from-deleted-files-a-bug-bounty-story-c5bd3a6f5f9b
#github
1👍23🤩1
#фишка дня
Иногда встаёт задача не просто проиллюстрировать статью, но обрезать (кропнуть) исходное изображение. И желательно так, чтобы результат был адаптивен и адекватно реагировал на масштабирование.
Джейк Арчибальд предлагает решение на SVG и foreignObject: https://codepen.io/alinaki/pen/KKLXvwz
Вообще, весьма красиво. Да, можно генерировать кропы на сервере, но это, как минимум, лишние телодвижения. А тут – одна картинка, чистый и понятный код.
#svg #img #foreignObject #crop #бородач
Иногда встаёт задача не просто проиллюстрировать статью, но обрезать (кропнуть) исходное изображение. И желательно так, чтобы результат был адаптивен и адекватно реагировал на масштабирование.
Джейк Арчибальд предлагает решение на SVG и foreignObject: https://codepen.io/alinaki/pen/KKLXvwz
Вообще, весьма красиво. Да, можно генерировать кропы на сервере, но это, как минимум, лишние телодвижения. А тут – одна картинка, чистый и понятный код.
#svg #img #foreignObject #crop #бородач
❤15
#новость дня
Ой, а вчера-то Linux исполнилось 34 года. Хотите вы этого или нет, но плодами этих трудов вы все пользуетесь прямо или косвенно.
Лично я на Linux как на основной ОС сидел с 2006 года по 2018. Фотошоп и игры через WINE, а потом и Фотошоп стал не нужен с приходом Figma.
Ну почему перестал использовать, пожалуй, понятно 🍏
Ну что, ещё, как минимум, 34 года впереди?
Что на ваших машинах, котаны? В комментарии я скину пару скриншотов старых со своих.
#linux #birthday
Ой, а вчера-то Linux исполнилось 34 года. Хотите вы этого или нет, но плодами этих трудов вы все пользуетесь прямо или косвенно.
Лично я на Linux как на основной ОС сидел с 2006 года по 2018. Фотошоп и игры через WINE, а потом и Фотошоп стал не нужен с приходом Figma.
Ну почему перестал использовать, пожалуй, понятно 🍏
Ну что, ещё, как минимум, 34 года впереди?
Что на ваших машинах, котаны? В комментарии я скину пару скриншотов старых со своих.
#linux #birthday
👍14
#фишка дня
Сидишь такой и не вдупляешь, что происходит в пулл или мёрдж-реквесте?
GitHub и GitLab соответственно
Или, возможно, пытаешься вспомнить, а как ты вообще задачу решил? Надо же описание внести какое-то, а в голове туман...
Современный ответ: так проведи ревью от Copilot!
Но а) не везде он включён б) не везде разрешён к применению в PR/MR в) в GitLab вообще ничего нет.
Ничего страшного, на это есть решение!
Кто-то из олдов наверняка помнит, что вот этот раздельный вид в веб-интерфейсе с удалёнными и добавленными строками — штука сравнительно новая. Ещё во времена царя-гороха царило понятие diff- или patch-файлов. Вот ссылка на вики: https://en.wikipedia.org/wiki/Patch_(Unix)
Формат простой до безумия:
Я думаю, людям, прошивающим всякие там андроиды и ардуинки процесс хорошо известен: скачиваешь исходники библиотеки или конфига, скачиваешь patch-файл от анона с форума и накладываешь его командой, буквально,
Ладно, к чему этот экскурс вообще?
А к тому, что изменения из PR/MR легко можно получить в таком же виде! Все добавления и изменения в одном файле.
Просто берите ссылку на ваш реквест и добавьте к нему
А что делать потом? Cкормить это ChatGPT или Gemini или что там в вашей компании разрешено конечно же!
LLM-ки отлично справляются с разбором таких вещей! И на понятном языке и объяснят, что происходит, и найдут косяки, и напишут описание.
Вкусно? Не то слово! Пользуемся.
#git #patch #ai
Сидишь такой и не вдупляешь, что происходит в пулл или мёрдж-реквесте?
GitHub и GitLab соответственно
Или, возможно, пытаешься вспомнить, а как ты вообще задачу решил? Надо же описание внести какое-то, а в голове туман...
Современный ответ: так проведи ревью от Copilot!
Но а) не везде он включён б) не везде разрешён к применению в PR/MR в) в GitLab вообще ничего нет.
Ничего страшного, на это есть решение!
Кто-то из олдов наверняка помнит, что вот этот раздельный вид в веб-интерфейсе с удалёнными и добавленными строками — штука сравнительно новая. Ещё во времена царя-гороха царило понятие diff- или patch-файлов. Вот ссылка на вики: https://en.wikipedia.org/wiki/Patch_(Unix)
Формат простой до безумия:
++++ добавлено
---- удалено
Я думаю, людям, прошивающим всякие там андроиды и ардуинки процесс хорошо известен: скачиваешь исходники библиотеки или конфига, скачиваешь patch-файл от анона с форума и накладываешь его командой, буквально,
patch
. Я так делал с Rockbox для iPod недавно, например.Ладно, к чему этот экскурс вообще?
А к тому, что изменения из PR/MR легко можно получить в таком же виде! Все добавления и изменения в одном файле.
Просто берите ссылку на ваш реквест и добавьте к нему
.patch
. Вот так: https://patch-diff.githubusercontent.com/raw/edvardchen/eslint-plugin-i18next/pull/145.patchА что делать потом? Cкормить это ChatGPT или Gemini или что там в вашей компании разрешено конечно же!
LLM-ки отлично справляются с разбором таких вещей! И на понятном языке и объяснят, что происходит, и найдут косяки, и напишут описание.
Вкусно? Не то слово! Пользуемся.
#git #patch #ai
👍24❤3🤩2
#статья дня
Все, наверное, знают о том, что существует поведенческий таргетинг — который определяет, какая реклама вам больше интересна.
И под капотом такой системы — полноценная big data-инфраструктура: события пишутся в логи, проходят обработку и попадают в key-value хранилище, откуда их читает рантайм показа рекламы.
Причем система должна работать так надежно, чтобы каждое событие обработалось ровно один раз (exactly-once), и так быстро, чтобы уложиться в миллисекунды на весь цикл.
Как этого добиться — рассказал в статье Руслан Савченко, разработчик динамических таблиц YTsaurus: https://habr.com/ru/companies/yandex/articles/939078/
Из интересного:
— События шардируются по хешу идентификатора. Это гарантирует, что все события одного пользователя обрабатываются одним воркером в рамках локальной транзакции.
— Дошли до низкоуровневой оптимизации аллокатора памяти и работы с ядром Linux, чтобы убрать провалы на высоких перцентилях.
— Вместо перезаписи всего protobuf-профиля система пишет бинарные дельты (через xdelta). Агрегатные колонки накладывают все накопившиеся дельты на оригинальный protobuf — получаем актуальную версию объекта
Все решения, на самом деле, можно применять не только к профилям. Прикольно, что в статье куча графиков — помогают разобраться. Советую почитать на досуге
#highload #db #database
Все, наверное, знают о том, что существует поведенческий таргетинг — который определяет, какая реклама вам больше интересна.
И под капотом такой системы — полноценная big data-инфраструктура: события пишутся в логи, проходят обработку и попадают в key-value хранилище, откуда их читает рантайм показа рекламы.
Причем система должна работать так надежно, чтобы каждое событие обработалось ровно один раз (exactly-once), и так быстро, чтобы уложиться в миллисекунды на весь цикл.
Как этого добиться — рассказал в статье Руслан Савченко, разработчик динамических таблиц YTsaurus: https://habr.com/ru/companies/yandex/articles/939078/
Из интересного:
— События шардируются по хешу идентификатора. Это гарантирует, что все события одного пользователя обрабатываются одним воркером в рамках локальной транзакции.
— Дошли до низкоуровневой оптимизации аллокатора памяти и работы с ядром Linux, чтобы убрать провалы на высоких перцентилях.
— Вместо перезаписи всего protobuf-профиля система пишет бинарные дельты (через xdelta). Агрегатные колонки накладывают все накопившиеся дельты на оригинальный protobuf — получаем актуальную версию объекта
Все решения, на самом деле, можно применять не только к профилям. Прикольно, что в статье куча графиков — помогают разобраться. Советую почитать на досуге
#highload #db #database
👍5❤4🫡3
This media is not supported in your browser
VIEW IN TELEGRAM
#статья дня
А нет такого, что новые технологии фронтенда нет смысла изучать, пока их не разжуют Шадид, Комо или Вес Бос? :)
Не, ну серьёзно. Вот читаешь ты блоги разработчиков Хрома или, простите, Вебкита. Что получаешь?
Получаешь нечто слишком рано, слишком мало, слишком сухо и сложно. Ну, буквально, посмотрите на статью про якорное позиционирование в блоге WebKit aka Safari: https://webkit.org/blog/17240/a-gentle-introduction-to-anchor-positioning/
A gentle introduction... куда уж более gentle: ни одного интерактивного примера, код минимален.
И тут давайте Шадида возьмём, буквально утром сегодня выпустил: https://ishadeed.com/article/anchor-positioning/
Уже начиная с шапки становится понятно о чём речь!
Каждый пример как всегда снабжён интерактивом, а если браузер не поддерживает пока якоря — всегда есть переключатель на видео.
Как всегда, глубокое почтение Шадиду за работу и рекомендация к прочтению! Якоря — уже не за горами, как минимум, можно заполифиллить.
#css #anchor
А нет такого, что новые технологии фронтенда нет смысла изучать, пока их не разжуют Шадид, Комо или Вес Бос? :)
Не, ну серьёзно. Вот читаешь ты блоги разработчиков Хрома или, простите, Вебкита. Что получаешь?
Получаешь нечто слишком рано, слишком мало, слишком сухо и сложно. Ну, буквально, посмотрите на статью про якорное позиционирование в блоге WebKit aka Safari: https://webkit.org/blog/17240/a-gentle-introduction-to-anchor-positioning/
A gentle introduction... куда уж более gentle: ни одного интерактивного примера, код минимален.
И тут давайте Шадида возьмём, буквально утром сегодня выпустил: https://ishadeed.com/article/anchor-positioning/
Уже начиная с шапки становится понятно о чём речь!
Каждый пример как всегда снабжён интерактивом, а если браузер не поддерживает пока якоря — всегда есть переключатель на видео.
Как всегда, глубокое почтение Шадиду за работу и рекомендация к прочтению! Якоря — уже не за горами, как минимум, можно заполифиллить.
#css #anchor
👍12❤4🤩2👎1
Будни разработчика
#фишка дня Сидишь такой и не вдупляешь, что происходит в пулл или мёрдж-реквесте? GitHub и GitLab соответственно Или, возможно, пытаешься вспомнить, а как ты вообще задачу решил? Надо же описание внести какое-то, а в голове туман... Современный ответ:…
С полей сообщают, что добавление
А чем меньше символов — тем дешевле и быстрее обработка.
Вот бы всё можно было представить в таком виде...
P. S. На BitBucket тоже работает!
.diff
к адресу пулл-реквеста делает то же самое, но в формате .diff
, который чуть менее многословный, чем .patch
!А чем меньше символов — тем дешевле и быстрее обработка.
Вот бы всё можно было представить в таком виде...
P. S. На BitBucket тоже работает!
Wikipedia
diff
В вычислительной технике diff — утилита сравнения файлов, выводящая разницу между содержанием двух файлов. Эта программа выводит построчно изменения, сделанные в файле (для текстовых файлов). Современные реализации поддерживают также двоичные файлы. Вывод…
❤7
12 сентября в Москве пройдёт big tech night. Это как ночь музеев, только в мире IT. Формат придумали в Яндексе, а Сбер, X5, Т-Банк и Lamoda присоединились к проекту.
На одну ночь офисы компаний превратятся в фестивальные площадки, где будут доклады про технологии, иммерсивные экскурсии, квесты и IT-стендапы. Пять офисов — пять площадок с разными программами.
В программе три трека — хард-трек про всё, что связано с технологиями; софт-трек про управление командой и развитие гибких навыков. И фест-трек, где можно открыть что-то новое — сходить на алгоритмическую вечеринку, сразиться на киберспортивном турнире, поучаствовать в экскурсиях и не только.
Доклады, которые зашли мне больше всего:
«GPT-функции в Алисе: backstage»
Павел Капля, руководитель продуктовой разработки Алисы, расскажет, как в AI-ассистента внедряют агентную модель на базе function calling. Будет много инженерных нюансов про адаптацию технологии в реальных условиях и обеспечение предсказуемости поведения и надежности системы.
«Теория систем и инженерная практика»
Филипп Дельгядо, архитектор департамента из lekton.io, объяснит базовые понятия теории систем и покажет, как они помогают при проектировании современных решений. Еще будет разбор некоторых паттернов проектирования через призму системного подхода.
Я буду подключаться к онлайн-студии. Для неё планируется особая программа: интервью с Николаем Савушкиным о рекомендательных системах, разговор с Маратом Мавлютовым про автономных роботов-доставщиков, дискуссии и интерактивные форматы в духе Late Night Show.
👉 Регистрация уже открыта.
На одну ночь офисы компаний превратятся в фестивальные площадки, где будут доклады про технологии, иммерсивные экскурсии, квесты и IT-стендапы. Пять офисов — пять площадок с разными программами.
В программе три трека — хард-трек про всё, что связано с технологиями; софт-трек про управление командой и развитие гибких навыков. И фест-трек, где можно открыть что-то новое — сходить на алгоритмическую вечеринку, сразиться на киберспортивном турнире, поучаствовать в экскурсиях и не только.
Доклады, которые зашли мне больше всего:
«GPT-функции в Алисе: backstage»
Павел Капля, руководитель продуктовой разработки Алисы, расскажет, как в AI-ассистента внедряют агентную модель на базе function calling. Будет много инженерных нюансов про адаптацию технологии в реальных условиях и обеспечение предсказуемости поведения и надежности системы.
«Теория систем и инженерная практика»
Филипп Дельгядо, архитектор департамента из lekton.io, объяснит базовые понятия теории систем и покажет, как они помогают при проектировании современных решений. Еще будет разбор некоторых паттернов проектирования через призму системного подхода.
Я буду подключаться к онлайн-студии. Для неё планируется особая программа: интервью с Николаем Савушкиным о рекомендательных системах, разговор с Маратом Мавлютовым про автономных роботов-доставщиков, дискуссии и интерактивные форматы в духе Late Night Show.
👉 Регистрация уже открыта.
❤5🤩3👍2🤡2
Media is too big
VIEW IN TELEGRAM
#заметка дня
Эпопея с пультом на Flutter продолжается! И в этот раз мне захотелось реализовать трансляцию фото (ну и видео) на телевизор.
Да, в 2025 году есть Chromecast, MirrorLink и AirPlay. Но хоть MirrorLink моим телевизором 2018 года выпуска и поддерживается, основной мой телефон — iPhone, а в AirPlay телевизор не умеет.
Да и задачи у этих троих чуть-чуть иные, нежели просто галерею фотографий посмотреть. Трансляция экрана это совсем не то же самое, что показать картинку или видео.
Потому на помощь нам приходит технология двадцатилетней давности, которая до сих пор поддерживается везде — DLNA!
В 2003 году тогдашние гиганты индустрии объединились и создали Digital Living Network Alliance, описав соответствующие стандарты и протоколы. В духе индустрии, использовались основанные на XML протоколы обмена данными и уже расмотренный когда-то мной SSDP.
Как это всё работает?
Когда мы сканируем сеть по SSDP, устройства сообщают в ответ поддерживаемые протоколы, схемы работы порты. И одна из таких схем работы —
Ну и мы отправляем телевизору запрос:
В этот же момент роли меняются. Ваш компьютер или телефон становятся сервером, а телевизор — клиентом. Телевизор (или другой плеер) скачивает переданный в CurrentURI файл. Естественно, надо этот самый сервер у себя на телефоне или компьютере запустить!
А уже второй командой посылаем Play:
И всё, всё работает. Главное, чтобы телевизор понимал, что ему передали. Заодно ещё метадату можно накинуть.
Да, в 2017 году альянс распустили, но DLNA работает буквально везде, где нужно. Просто называть стали по разному: Samsung AllShare, LG SmartShare, Sony Video/Music/Photo. А так, телевизоры, NAS-ы, куча приложений для всех платформ... Это очень простой, хоть и избыточный, протокол.
Да и реализовать это было весьма просто и интересно.
Кстати, можете сами попробовать побаловаться, есть минимальная имплементация DLNA с названием nano-dlna: https://github.com/gabrielmagno/nano-dlna
А большего и не надо.
#flutter #dart #dlna
Эпопея с пультом на Flutter продолжается! И в этот раз мне захотелось реализовать трансляцию фото (ну и видео) на телевизор.
Да, в 2025 году есть Chromecast, MirrorLink и AirPlay. Но хоть MirrorLink моим телевизором 2018 года выпуска и поддерживается, основной мой телефон — iPhone, а в AirPlay телевизор не умеет.
Да и задачи у этих троих чуть-чуть иные, нежели просто галерею фотографий посмотреть. Трансляция экрана это совсем не то же самое, что показать картинку или видео.
Потому на помощь нам приходит технология двадцатилетней давности, которая до сих пор поддерживается везде — DLNA!
В 2003 году тогдашние гиганты индустрии объединились и создали Digital Living Network Alliance, описав соответствующие стандарты и протоколы. В духе индустрии, использовались основанные на XML протоколы обмена данными и уже расмотренный когда-то мной SSDP.
Как это всё работает?
Когда мы сканируем сеть по SSDP, устройства сообщают в ответ поддерживаемые протоколы, схемы работы порты. И одна из таких схем работы —
/MediaRenderer/AVTransport/Control
. Ну и мы отправляем телевизору запрос:
POST /MediaRenderer/AVTransport/Control HTTP/1.1
HOST: 192.168.1.42:1400
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#SetAVTransportURI"
<?xml version="1.0"?>
<s:Envelope xmlns:s="https://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<u:SetAVTransportURI xmlns:u="urn:schemas-upnp-org:service:AVTransport:1">
<InstanceID>0</InstanceID>
<CurrentURI>https://192.168.1.10:8000/picture.jpg</CurrentURI>
<CurrentURIMetaData></CurrentURIMetaData>
</u:SetAVTransportURI>
</s:Body>
</s:Envelope>
В этот же момент роли меняются. Ваш компьютер или телефон становятся сервером, а телевизор — клиентом. Телевизор (или другой плеер) скачивает переданный в CurrentURI файл. Естественно, надо этот самый сервер у себя на телефоне или компьютере запустить!
А уже второй командой посылаем Play:
POST /MediaRenderer/AVTransport/Control HTTP/1.1
HOST: 192.168.1.42:1400
CONTENT-TYPE: text/xml; charset="utf-8"
SOAPACTION: "urn:schemas-upnp-org:service:AVTransport:1#Play"
<?xml version="1.0"?>
<s:Envelope xmlns:s="https://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<u:Play xmlns:u="urn:schemas-upnp-org:service:AVTransport:1">
<InstanceID>0</InstanceID>
<Speed>1</Speed>
</u:Play>
</s:Body>
</s:Envelope>
И всё, всё работает. Главное, чтобы телевизор понимал, что ему передали. Заодно ещё метадату можно накинуть.
Да, в 2017 году альянс распустили, но DLNA работает буквально везде, где нужно. Просто называть стали по разному: Samsung AllShare, LG SmartShare, Sony Video/Music/Photo. А так, телевизоры, NAS-ы, куча приложений для всех платформ... Это очень простой, хоть и избыточный, протокол.
Да и реализовать это было весьма просто и интересно.
Кстати, можете сами попробовать побаловаться, есть минимальная имплементация DLNA с названием nano-dlna: https://github.com/gabrielmagno/nano-dlna
А большего и не надо.
#flutter #dart #dlna
1❤19👍8🫡1
This media is not supported in your browser
VIEW IN TELEGRAM
#такое дня
Когда вам в очередной раз станет стыдно, что вы сделали какой-то костыль, вспомните, что бегущую строку в CSS ещё совсем недавно нельзя было сделать без дублирования элементов: https://t.iss.one/htmlshit/3721
А если и это не помогает, вспомните, что где-то там есть компания Apple, которая не осилила сделать «бесконечный» (или хотя бы автовозвратный) список часов и минут в будильнике, поэтому продублировала 0-23 на часах (0-12 в AM/PM) и 0-59 на минутах много-много раз. Очень. Много. Раз.
Кого-то, впрочем, это только больше расстроит. Ведь и платят им больше.
#apple #ios #бред
Когда вам в очередной раз станет стыдно, что вы сделали какой-то костыль, вспомните, что бегущую строку в CSS ещё совсем недавно нельзя было сделать без дублирования элементов: https://t.iss.one/htmlshit/3721
А если и это не помогает, вспомните, что где-то там есть компания Apple, которая не осилила сделать «бесконечный» (или хотя бы автовозвратный) список часов и минут в будильнике, поэтому продублировала 0-23 на часах (0-12 в AM/PM) и 0-59 на минутах много-много раз. Очень. Много. Раз.
Кого-то, впрочем, это только больше расстроит. Ведь и платят им больше.
#apple #ios #бред
🤩13❤5🫡3
#заметка дня
На связи glebcha, который иногда с большим удовольствием предлагает идеи новых статей автору канала (старому другу) и, с недавнего времени, пишет сам в канал.
Недавно появилась интересная задача - отображать список вкладок редактора вне области скролла как в любом редакторе кода, например в IDEA.
Сразу же составил список технологий себе в помощь и в их списке оказалось событие scrollend для более эффективного формирования списка вкладок вне области прокрутки.
И вроде бы все отлично, но как обычно "есть один нюанс"....и это Safari. Ссылка на активный баг.
Но не стоит расстраиваться, решение нашлось в виде полифилла (не идеального, но отличного).
Проверяйте доступности браузерного api перед использованием и помните - "нет нереализуемых задач, всё лишь вопрос мотивации и времени".
P.S.
Напишите если вам интересны более хардкорные заметки по разработке редактора SQL-запросов в нашей команде CedrusData.
#safari #scroll #scrollend
На связи glebcha, который иногда с большим удовольствием предлагает идеи новых статей автору канала (старому другу) и, с недавнего времени, пишет сам в канал.
Недавно появилась интересная задача - отображать список вкладок редактора вне области скролла как в любом редакторе кода, например в IDEA.
Сразу же составил список технологий себе в помощь и в их списке оказалось событие scrollend для более эффективного формирования списка вкладок вне области прокрутки.
И вроде бы все отлично, но как обычно "есть один нюанс"....и это Safari. Ссылка на активный баг.
Но не стоит расстраиваться, решение нашлось в виде полифилла (не идеального, но отличного).
Проверяйте доступности браузерного api перед использованием и помните - "нет нереализуемых задач, всё лишь вопрос мотивации и времени".
P.S.
Напишите если вам интересны более хардкорные заметки по разработке редактора SQL-запросов в нашей команде CedrusData.
#safari #scroll #scrollend
👍10
Синдром самозванца, разрастающийся state и эволюция фронтенда в продукте
20 сентября Яндекс Вертикали собирают фронтендеров на ежегодном митапе Vertis JS, чтобы обсудить главные страхи и современные инструменты разработчиков.
Помимо докладов, в программе активности-ритуалы:
▫️Beer manifestation — для тех, кто готов поделиться своей историей
▫️Whispercoding, где каждый участник добавляет свою строчку к письму, пока зрители нашёптывают новые условия
Всё это — вместе с ребятами из Вертикальных сервисов: Авто.ру, Яндекс Путешествий и Яндекс Аренды.
📍 Санкт-Петербурге, БЦ Феррум
📌 Полная программа и регистрация
20 сентября Яндекс Вертикали собирают фронтендеров на ежегодном митапе Vertis JS, чтобы обсудить главные страхи и современные инструменты разработчиков.
Помимо докладов, в программе активности-ритуалы:
▫️Beer manifestation — для тех, кто готов поделиться своей историей
▫️Whispercoding, где каждый участник добавляет свою строчку к письму, пока зрители нашёптывают новые условия
Всё это — вместе с ребятами из Вертикальных сервисов: Авто.ру, Яндекс Путешествий и Яндекс Аренды.
📌 Полная программа и регистрация
Please open Telegram to view this post
VIEW IN TELEGRAM
👎5❤1🤡1
Media is too big
VIEW IN TELEGRAM
#фишка дня
Вроде как, я постоянно пользуюсь девтулзами хрома. Дебаггер, сеть, редактирование кук и стораджей, просмотр данных производительности... а о такой простой и эффективной штуке не знал.
Итак, выделяете какой-то элемент на вкладке Elements, потом идёте в консоль — и этот элемент становится доступен под алиасом
Более того, в
Есть ещё
А есть $$ — это querySelectorAll...
В общем, вот документация: https://developer.chrome.com/docs/devtools/console/utilities
Из очень удобных штук — шортхенд
Да, документации и фишкам сто лет в обед, но я как-то туда не особо заглядывал. А стоило бы!
И да, для чистоты эксперимента: в Firefox тоже есть подобное, но сильно поменьше: https://firefox-source-docs.mozilla.org/devtools-user/web_console/helpers/index.html
#chrome #devtools
Вроде как, я постоянно пользуюсь девтулзами хрома. Дебаггер, сеть, редактирование кук и стораджей, просмотр данных производительности... а о такой простой и эффективной штуке не знал.
Итак, выделяете какой-то элемент на вкладке Elements, потом идёте в консоль — и этот элемент становится доступен под алиасом
$0
!Более того, в
$0-$4
по порядку хранится история этих выделений! А в $_
— последнее вычисленное в консоли выражение.Есть ещё
$(selector)
— это шортхенд для querySelector, косящий под jQuery.А есть $$ — это querySelectorAll...
В общем, вот документация: https://developer.chrome.com/docs/devtools/console/utilities
Из очень удобных штук — шортхенд
keys()
для получения ключей объекта. И monitorEvents()
— чтобы узнать обо всех слушателях переданного события без ковыряния в UI.Да, документации и фишкам сто лет в обед, но я как-то туда не особо заглядывал. А стоило бы!
И да, для чистоты эксперимента: в Firefox тоже есть подобное, но сильно поменьше: https://firefox-source-docs.mozilla.org/devtools-user/web_console/helpers/index.html
$0
там есть, а $1
уже нет. keys()
есть, а monitor()
— нет. В общем, сойдёт. #chrome #devtools
1👍22🤩2❤1