#заметка дня
Продолжаем эпопею про написание пульта для телевизора на Flutter.
Мы с вами уже умеем верстать виджеты, находить телевизор широковещательным сообщением, выбирать его, открывать и закрывать на нём приложения и знаем, как искать их идентификаторы.
Потихоньку подбираемся к самому главному: как, собственно, посылать команды, точнее, нажатия кнопок.
А делается это довольно просто.
1. Постучались на WebSocket API, передав название приложения. Почему-то в моём случае стучаться пришлось на secure-вариант (ws vs wss, это как http vs https), разрешив использование самоподписанных сертификатов (потом расскажу, что не так).
2. Телевизор спросит разрешение на удалённое управление. И вот тут придётся подтверждать с пульта или джойстика на телевизоре, других вариантов нет. В ответ будет прислан токен. Чтобы больше не спрашивал — все дальнейшие запросы должны содержать в себе идентификатор приложения и токен, собственно. Как параметры запроса:
3. Формируем команду, на которую, естественно, опять нет никакой документации. Но когда это нам мешало? Копаемся в issues легендарной (в узком кругу) библиотеки Samsungctl, находим нужный формат.
4. Отправляем.
5. ...
6. Пищим от восторга.
На этом месте будет небольшая ода Джаваскрипту: нет на свете языка, который бы позволил быстрее настряпать всякие тестовые куски кода, вне зависимости от того, нужен вам UI, или нет. Ну, может, Python что-то способен противопоставить. Тяп-ляп и готов код, чтобы быстро проверить теорию или соответствие стандарта вашему телевизору: https://gist.github.com/bekharsky/80fce4263304eedcec7a46045b1a0ebd
Представьте, как было бы обидно, написать это всё на Dart и обнаружить, что мой телевизор старее, чем нужно. Впрочем, там не сильно сложнее, сделаю сегодня.
И посоветуйте, кто чем вебсокеты отлаживает. Что-нибудь вроде Postman, но не Postman.
К слову, если у кого-нибудь есть телевизоры Samsung и кому не лень, проверьте код выше (он просто выключает звук) и напишите модель в комментарии, пожалуйста (как узнать модель — смотрите ссылку в первых словах поста, там про API телевизора). Это мне потом очень поможет :)
Удачи в ваших пет-проектах, котаны.
P. S. если кому интересно, вот тут человек на Go автоматизирует браузер телевизора, чтобы дашборды Grafana запустить. Целый кладезь команд и подсказок. Красивое: https://gist.github.com/freman/8d98742de09d476c4d3d9e5d55f9db63
#flutter #dart #websockets
Продолжаем эпопею про написание пульта для телевизора на Flutter.
Мы с вами уже умеем верстать виджеты, находить телевизор широковещательным сообщением, выбирать его, открывать и закрывать на нём приложения и знаем, как искать их идентификаторы.
Потихоньку подбираемся к самому главному: как, собственно, посылать команды, точнее, нажатия кнопок.
А делается это довольно просто.
1. Постучались на WebSocket API, передав название приложения. Почему-то в моём случае стучаться пришлось на secure-вариант (ws vs wss, это как http vs https), разрешив использование самоподписанных сертификатов (потом расскажу, что не так).
2. Телевизор спросит разрешение на удалённое управление. И вот тут придётся подтверждать с пульта или джойстика на телевизоре, других вариантов нет. В ответ будет прислан токен. Чтобы больше не спрашивал — все дальнейшие запросы должны содержать в себе идентификатор приложения и токен, собственно. Как параметры запроса:
?name=xxx&token=yyy
.3. Формируем команду, на которую, естественно, опять нет никакой документации. Но когда это нам мешало? Копаемся в issues легендарной (в узком кругу) библиотеки Samsungctl, находим нужный формат.
4. Отправляем.
5. ...
6. Пищим от восторга.
На этом месте будет небольшая ода Джаваскрипту: нет на свете языка, который бы позволил быстрее настряпать всякие тестовые куски кода, вне зависимости от того, нужен вам UI, или нет. Ну, может, Python что-то способен противопоставить. Тяп-ляп и готов код, чтобы быстро проверить теорию или соответствие стандарта вашему телевизору: https://gist.github.com/bekharsky/80fce4263304eedcec7a46045b1a0ebd
Представьте, как было бы обидно, написать это всё на Dart и обнаружить, что мой телевизор старее, чем нужно. Впрочем, там не сильно сложнее, сделаю сегодня.
И посоветуйте, кто чем вебсокеты отлаживает. Что-нибудь вроде Postman, но не Postman.
К слову, если у кого-нибудь есть телевизоры Samsung и кому не лень, проверьте код выше (он просто выключает звук) и напишите модель в комментарии, пожалуйста (как узнать модель — смотрите ссылку в первых словах поста, там про API телевизора). Это мне потом очень поможет :)
Удачи в ваших пет-проектах, котаны.
P. S. если кому интересно, вот тут человек на Go автоматизирует браузер телевизора, чтобы дашборды Grafana запустить. Целый кладезь команд и подсказок. Красивое: https://gist.github.com/freman/8d98742de09d476c4d3d9e5d55f9db63
#flutter #dart #websockets
❤11👍2
This media is not supported in your browser
VIEW IN TELEGRAM
#фишка дня
Я писал как-то о том, что одной из одновременно полезных и раздражающих вещей в CSS-препроцессорах является возможность создавать вложенность, nesting.
Склеивать селекторы, классы в БЭМ и не только, вкладывать теги... Удобно? Писать — да, поддерживать — не очень. Вот тут: https://t.iss.one/htmlshit/1643
К чему это я?
К тому, что Chrome 112 начал поддерживать CSS Nesting! Официальный! Который теперь часть спецификации: https://www.w3.org/TR/css-nesting-1/
Ну и на видео показан процесс отладки этого дела в DevTools.
Статья в блоге разработчиков Chrome: https://developer.chrome.com/articles/css-nesting/, хороший способ вспомнить, что к чему.
Моё мнение остаётся прежним: для псевдоклассов, псевдоэлементов или влияния на соседей (+, ~) — очень хорошо. Для формирования БЭМ (склеивания классов) — нет.
Всем nesting, котаны!
#css #nesting
Я писал как-то о том, что одной из одновременно полезных и раздражающих вещей в CSS-препроцессорах является возможность создавать вложенность, nesting.
Склеивать селекторы, классы в БЭМ и не только, вкладывать теги... Удобно? Писать — да, поддерживать — не очень. Вот тут: https://t.iss.one/htmlshit/1643
К чему это я?
К тому, что Chrome 112 начал поддерживать CSS Nesting! Официальный! Который теперь часть спецификации: https://www.w3.org/TR/css-nesting-1/
.nesting {
color: hotpink;
> .is {
color: rebeccapurple;
> .awesome {
color: deeppink;
}
}
}
Ну и на видео показан процесс отладки этого дела в DevTools.
Статья в блоге разработчиков Chrome: https://developer.chrome.com/articles/css-nesting/, хороший способ вспомнить, что к чему.
Моё мнение остаётся прежним: для псевдоклассов, псевдоэлементов или влияния на соседей (+, ~) — очень хорошо. Для формирования БЭМ (склеивания классов) — нет.
Всем nesting, котаны!
#css #nesting
❤14👍4
#статья дня
Что самое опасное может сказать фронтенд-разработчик, верстающий макет или готовящий ui-kit?
Опустим сейчас (несуществующее) разделение на настоящий и ненастоящий фронтенд.
Вот это:
— Я умею нормально называть классы, они у меня всегда уникальные!
Окей, дай мне гарантию, что ты не ошибёшься на десятке страниц, нескольких десятках комбинаций компонентов и все твои коллеги такие же смышлёные. Ещё скажи, в композицию умеешь и специфичность на лету посчитаешь.
Ребят, штуки вроде пространств имён, БЭМ, OOCSS, CSS-in-JS, CSS modules появились не потому что их разработчики глупы или ленивы. Они появились потому что все мы люди и толпа может быть как умнее одного человека, так и бесконечно глупее. Ок, если не глупее, то, как минимум невнимательнее.
Ведь подобная ситуация она везде, не только в вёрстке.
Ну вот давайте возьмём для примера Next.js. За базу там взяты CSS-модули, поэтому уже один только этот факт делает вопрос: «А css-модули уже устарели, да?», — некорректным.
Да, «гладить» фреймворк против шерсти не стоит. Да, создать глобальный класс для компонента способом, не предусмотренным документацией (созданием отдельного глобального скоупа) будет проблемой (То же самое касается и css-in-js).
Но зато насколько легче решаются остальные 99% задач!
Короче, чтобы вам сегодня сделать своё понимание кода и его сборки чуть лучше и заодно понять сопутствующие проблемы CSS-модулей горячо рекомендую эту статью: https://habr.com/ru/post/688844/
Как включить их в сборку, как типизировать. Зачем вообще типизировать и как экспорты по умолчанию всё портят.
Прекрасно и максимально понятно написано. Заодно скилл вебпака подтянете :)
#css #cssmodules #webpack #бородач
Что самое опасное может сказать фронтенд-разработчик, верстающий макет или готовящий ui-kit?
Опустим сейчас (несуществующее) разделение на настоящий и ненастоящий фронтенд.
Вот это:
— Я умею нормально называть классы, они у меня всегда уникальные!
Окей, дай мне гарантию, что ты не ошибёшься на десятке страниц, нескольких десятках комбинаций компонентов и все твои коллеги такие же смышлёные. Ещё скажи, в композицию умеешь и специфичность на лету посчитаешь.
Ребят, штуки вроде пространств имён, БЭМ, OOCSS, CSS-in-JS, CSS modules появились не потому что их разработчики глупы или ленивы. Они появились потому что все мы люди и толпа может быть как умнее одного человека, так и бесконечно глупее. Ок, если не глупее, то, как минимум невнимательнее.
Ведь подобная ситуация она везде, не только в вёрстке.
Ну вот давайте возьмём для примера Next.js. За базу там взяты CSS-модули, поэтому уже один только этот факт делает вопрос: «А css-модули уже устарели, да?», — некорректным.
Да, «гладить» фреймворк против шерсти не стоит. Да, создать глобальный класс для компонента способом, не предусмотренным документацией (созданием отдельного глобального скоупа) будет проблемой (То же самое касается и css-in-js).
Но зато насколько легче решаются остальные 99% задач!
Короче, чтобы вам сегодня сделать своё понимание кода и его сборки чуть лучше и заодно понять сопутствующие проблемы CSS-модулей горячо рекомендую эту статью: https://habr.com/ru/post/688844/
Как включить их в сборку, как типизировать. Зачем вообще типизировать и как экспорты по умолчанию всё портят.
Прекрасно и максимально понятно написано. Заодно скилл вебпака подтянете :)
#css #cssmodules #webpack #бородач
👍10❤1🥰1💩1
#такое дня
Давайте дадим слово защитникам Tailwind.
Что заставляет вас учить целый DSL вместо того, чтобы просто использовать CSS?
Пишете ли вы код на Tailwind вручную, или генерируете конструктором?
Пробовали ли другие Atomic-подходы? Пробовали ли БЭМ?
Вы все поголовно из бакенда?
Давайте, господа, вам слово. А то мне аж страшно.
#tailwind #atomic
Давайте дадим слово защитникам Tailwind.
Что заставляет вас учить целый DSL вместо того, чтобы просто использовать CSS?
Пишете ли вы код на Tailwind вручную, или генерируете конструктором?
Пробовали ли другие Atomic-подходы? Пробовали ли БЭМ?
Вы все поголовно из бакенда?
Давайте, господа, вам слово. А то мне аж страшно.
#tailwind #atomic
😁13👏5👍1🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
#фишка дня
Как сымитировать эффект печатной машинки на одном лишь CSS?
Очень просто! Используйте функцию анимации steps и анимируйте ширину ступенчато. Остальное скройте: https://codepen.io/alinaki/pen/vYVNdOO
Ну разве что символы придётся посчитать самому...
#css #animation #typewriter
Как сымитировать эффект печатной машинки на одном лишь CSS?
Очень просто! Используйте функцию анимации steps и анимируйте ширину ступенчато. Остальное скройте: https://codepen.io/alinaki/pen/vYVNdOO
Ну разве что символы придётся посчитать самому...
#css #animation #typewriter
👍18❤1
This media is not supported in your browser
VIEW IN TELEGRAM
#прекрасное дня
Ни больше ни меньше. Прекрасное. Потому что я не могу это описать каким-то другим словом.
Я вообще сел другой пост писать, но наткнулся на эти карточки в моей твиттер-ленте.
Не, я понимаю, мода на 3D-карточки в лендингах давно прошла, все эти перевороты и шевеления мышкой… Это всё прошлое десятилетие.
Но ребят, я за всю свою карьеру и представить не мог, что можно настолько точно передать эффект переливающейся металлизированной карточки настолько точно манипулируя одним только положением фона! Это какое-то безумное умение сочитать mix-blend-mode, градиенты и SVG-фильтры.
Вам срочно надо зайти и посмотреть самим: https://deck-24abcd.netlify.app/
Ну и гитхаб, конечно: https://github.com/simeydotme/pokemon-cards-css
Крышу сносит, потрясающе. И без WebGL.
#css #3d #gradient #бородач
Ни больше ни меньше. Прекрасное. Потому что я не могу это описать каким-то другим словом.
Я вообще сел другой пост писать, но наткнулся на эти карточки в моей твиттер-ленте.
Не, я понимаю, мода на 3D-карточки в лендингах давно прошла, все эти перевороты и шевеления мышкой… Это всё прошлое десятилетие.
Но ребят, я за всю свою карьеру и представить не мог, что можно настолько точно передать эффект переливающейся металлизированной карточки настолько точно манипулируя одним только положением фона! Это какое-то безумное умение сочитать mix-blend-mode, градиенты и SVG-фильтры.
Вам срочно надо зайти и посмотреть самим: https://deck-24abcd.netlify.app/
Ну и гитхаб, конечно: https://github.com/simeydotme/pokemon-cards-css
Крышу сносит, потрясающе. И без WebGL.
#css #3d #gradient #бородач
🔥31👍1🥱1
#til дня
Вот есть у вас какая-то библиотека, которой можно передать некие обработчики событий. Особенно этим славятся карусели, кастомные селекты и прочие т. н. плагины.
Почему плагины? Потому что многие из них или до сих пор являются плагинами к jQuery, или буквально вырасли из них. Так уж повелось.
И вот эти самые обработчики событий получают доступ к
Куда нас пошлёт TypeScript с этим? Правильно, в «this implicitly has any type».
А что делать-то? Как указать тип this в методе?
Всё очень просто: начиная ещё с версии 2.0 для указания типа
И так же с любым конструктором объектов или функцией, принимающей коллбэки как аргумент.
Такой вот сумбурный TIL сегодня, да. Сразу можно увидеть, что у меня руки по локоть в легаси.
#typescript #бородач
Вот есть у вас какая-то библиотека, которой можно передать некие обработчики событий. Особенно этим славятся карусели, кастомные селекты и прочие т. н. плагины.
Почему плагины? Потому что многие из них или до сих пор являются плагинами к jQuery, или буквально вырасли из них. Так уж повелось.
И вот эти самые обработчики событий получают доступ к
this
, к инстансу объекта (функции, класса). Например, Selectize.js, покажем какой-то блок над селектом:
function onDropdownClose(value: string) {
this?.$input.parent().find(‘.alert’).html(value);
}
$(‘select’).selectize({
hideSelected: true,
openOnFocus: true,
onDropdownClose,
})
Куда нас пошлёт TypeScript с этим? Правильно, в «this implicitly has any type».
А что делать-то? Как указать тип this в методе?
Всё очень просто: начиная ещё с версии 2.0 для указания типа
this
его нужно передать как первый аргумент в функцию. Не бойтесь, остальные implicit аргументы оно не затрёт. Итого:
function onDropdownClose(this: SelectizeInstance, value: string)
И так же с любым конструктором объектов или функцией, принимающей коллбэки как аргумент.
Такой вот сумбурный TIL сегодня, да. Сразу можно увидеть, что у меня руки по локоть в легаси.
#typescript #бородач
👍13❤🔥5
#заметка дня
Сервис GitHub Pages известен всем. Это один из самых простых способов разместить ваш статичный и не очень сайт в сети. Особенно учитывая, что вы скорее всего на гитхабе свои проекты и держите.
Какие альтернативы помимо классических хостингов, выделенных серверов и конструкторов?
Ну, мне известно две: Netlify Drop и Cloudflare Pages (боже, как оригинально).
Drop отличается потрясающей простотой: дропнули папку с проектом и всё, отсюда и название. Ещё домен можно свой подключить.
А вариант от Cloudflare, помимо прочего, умеет в:
- интеграцию с GitHub
- пресеты для Next.js/11ty и других фреймворков
- всё обычные возможности Cloudflare для доменов
- аналитику
- разграничение доступа через feature-ветки
Запускайте свои проекты не только локально, котаны!
#pages #github #cloudflare #netlify #drop
Сервис GitHub Pages известен всем. Это один из самых простых способов разместить ваш статичный и не очень сайт в сети. Особенно учитывая, что вы скорее всего на гитхабе свои проекты и держите.
Какие альтернативы помимо классических хостингов, выделенных серверов и конструкторов?
Ну, мне известно две: Netlify Drop и Cloudflare Pages (боже, как оригинально).
Drop отличается потрясающей простотой: дропнули папку с проектом и всё, отсюда и название. Ещё домен можно свой подключить.
А вариант от Cloudflare, помимо прочего, умеет в:
- интеграцию с GitHub
- пресеты для Next.js/11ty и других фреймворков
- всё обычные возможности Cloudflare для доменов
- аналитику
- разграничение доступа через feature-ветки
Запускайте свои проекты не только локально, котаны!
#pages #github #cloudflare #netlify #drop
👍19❤5
#фишка дня
В iOS Safari есть такая фишка: при удерживании пальца на, например, ссылке появляется всплывающее окошко с её предпросмотром. Но иногда это вообще не к месту, потому надо бы найти способ отключить.
Как всегда, способ этот не очень-то стандартный. Спасибо, Apple, чо.
#safari #callout #бородач
В iOS Safari есть такая фишка: при удерживании пальца на, например, ссылке появляется всплывающее окошко с её предпросмотром. Но иногда это вообще не к месту, потому надо бы найти способ отключить.
Как всегда, способ этот не очень-то стандартный. Спасибо, Apple, чо.
#safari #callout #бородач
👍14😁3🔥1
#инструмент дня
Иногда случается ситуация, когда никак иначе, кроме как парсингом страниц, данные не собрать.
Я не говорю сейчас о рипах с сайтов конкурентов. У меня была ситуация – надо было собрать списки магазинов небольшой сети, которые просто валялись по разным региональным шаблонным ресурсам.
Тогда я воспользовался https://github.com/cheeriojs/cheerio, написав простой скрипт на node.js. Это похоже на реализацию селекторов в jQuery, но для Node.js. Разобрал данные и сохранил в JSON.
Оказывается, есть и более кондовые утилиты.
Например, https://github.com/mgdm/htmlq и https://stedolan.github.io/jq
Первый, как нетрудно догадаться, может обработать HTML, а второй — JSON. И всё из командной строки :)
Например, найти все ссылки на странице:
Можно и просто целые куски HTML выдирать, и селекторы использовать. А дальше — все возможности командной строки и скриптов для обработки.
Ну а jq может стать частью вашей CI/CD системы, разгребсти ответы от API GitHub, например, и выдать их в читаемом виде.
#tools #html #json #cli #бородач
Иногда случается ситуация, когда никак иначе, кроме как парсингом страниц, данные не собрать.
Я не говорю сейчас о рипах с сайтов конкурентов. У меня была ситуация – надо было собрать списки магазинов небольшой сети, которые просто валялись по разным региональным шаблонным ресурсам.
Тогда я воспользовался https://github.com/cheeriojs/cheerio, написав простой скрипт на node.js. Это похоже на реализацию селекторов в jQuery, но для Node.js. Разобрал данные и сохранил в JSON.
Оказывается, есть и более кондовые утилиты.
Например, https://github.com/mgdm/htmlq и https://stedolan.github.io/jq
Первый, как нетрудно догадаться, может обработать HTML, а второй — JSON. И всё из командной строки :)
Например, найти все ссылки на странице:
curl --silent https://www.rust-lang.org/ | htmlq --attribute href a
Можно и просто целые куски HTML выдирать, и селекторы использовать. А дальше — все возможности командной строки и скриптов для обработки.
Ну а jq может стать частью вашей CI/CD системы, разгребсти ответы от API GitHub, например, и выдать их в читаемом виде.
#tools #html #json #cli #бородач
GitHub
GitHub - cheeriojs/cheerio: The fast, flexible, and elegant library for parsing and manipulating HTML and XML.
The fast, flexible, and elegant library for parsing and manipulating HTML and XML. - cheeriojs/cheerio
👍13🔥2❤1
This media is not supported in your browser
VIEW IN TELEGRAM
#codepen дня
Вам никогда не казалось, что подвалы сайтов незаслуженно обижены?
Скроллишь, скроллишь себе бесконечную загрузку твитов или постов в ленте, футер появляется на секунду — и тут же снова улетает с экрана, не успев сообщить что-то важное…
Стив Гарднер попытался визуализировать происходящее, вышло офигенно, целая история: https://codepen.io/ste-vg/pen/PoQgvBK
#scroll #бородач
Вам никогда не казалось, что подвалы сайтов незаслуженно обижены?
Скроллишь, скроллишь себе бесконечную загрузку твитов или постов в ленте, футер появляется на секунду — и тут же снова улетает с экрана, не успев сообщить что-то важное…
Стив Гарднер попытался визуализировать происходящее, вышло офигенно, целая история: https://codepen.io/ste-vg/pen/PoQgvBK
#scroll #бородач
🔥23😢5👍1
#ссылка дня
Да-да, я знаю, знаю что команда разработчиков React недавно наконец-то выпустили долгожанную документацию.
Но кто из нас не любит красивые учебники и пособия? Не, ну, может, кто-то и не любит...
Тем не менее, встречайте: React Visualized: https://react.gg/visualized
Крайне забавная штука с интерактивными элементами, объясняющая базовые и не очень принципы React, откуда появились и какие задачи решают: пропсы, стейт, эффекты, рефы, порталы.
Будет дополняться, впрочем :)
#react #reference
Да-да, я знаю, знаю что команда разработчиков React недавно наконец-то выпустили долгожанную документацию.
Но кто из нас не любит красивые учебники и пособия? Не, ну, может, кто-то и не любит...
Тем не менее, встречайте: React Visualized: https://react.gg/visualized
Крайне забавная штука с интерактивными элементами, объясняющая базовые и не очень принципы React, откуда появились и какие задачи решают: пропсы, стейт, эффекты, рефы, порталы.
Будет дополняться, впрочем :)
#react #reference
🔥23👍7❤4
#заметка дня
Мобильная разработка, как ни крути, выходит ближе к железу и понимать в ней нужно чуть больше.
Да, это опять я со своим нытьём про Dart и Flutter, которое можно найти по тегу #remote. И сегодня мы поговорим о сокетах. Конкретно — WebSockets.
Вы наверняка должны были задуматься, откуда в вебсокетах приставка "веб". И ответ на самом деле простой: потому что они реализованы поверх протокола HTTP, для чего используется, очевидно, некий HTTP-клиент. В браузерах свой, в Node.js свой, в мобильных фреймворках свой.
Что из этого следует, например? Ну, что сертификаты наруливаются согласно спецификации HTTPS. И тут начинается самое интересное.
Нода и браузеры вам прощают вообще все. Предполагается, что веб-разработчику вообще не надо толком думать, а что там внутри.
Вот у телевизоров Samsung сертификат самоподписанный. Вебсокеты по протоколу wss (websocket secure) работать с таким откажутся, но всё, что надо сделать в JS — передать опцию allowUnauthorized. Всё, полетели жисоны.
Что надо сделать в том же Dart/Flutter?
Перегрузить (заменить, override) библиотечный HTTP-клиент!
Вот так:
И дальше есть выбор, делать это на глобальном уровне, или передать в конструктор. В моём случае — глобально, поскольку API тоже спрятан за самоподписанным сертификатом:
И такое на каждом шагу. Нельзя просто так взять и...
Может, поэтому мобильным разработчикам зачастую больше платят? 🤔
#flutter #remote #dart #websocket
Мобильная разработка, как ни крути, выходит ближе к железу и понимать в ней нужно чуть больше.
Да, это опять я со своим нытьём про Dart и Flutter, которое можно найти по тегу #remote. И сегодня мы поговорим о сокетах. Конкретно — WebSockets.
Вы наверняка должны были задуматься, откуда в вебсокетах приставка "веб". И ответ на самом деле простой: потому что они реализованы поверх протокола HTTP, для чего используется, очевидно, некий HTTP-клиент. В браузерах свой, в Node.js свой, в мобильных фреймворках свой.
Что из этого следует, например? Ну, что сертификаты наруливаются согласно спецификации HTTPS. И тут начинается самое интересное.
Нода и браузеры вам прощают вообще все. Предполагается, что веб-разработчику вообще не надо толком думать, а что там внутри.
Вот у телевизоров Samsung сертификат самоподписанный. Вебсокеты по протоколу wss (websocket secure) работать с таким откажутся, но всё, что надо сделать в JS — передать опцию allowUnauthorized. Всё, полетели жисоны.
Что надо сделать в том же Dart/Flutter?
Перегрузить (заменить, override) библиотечный HTTP-клиент!
Вот так:
class SamsungHttpOverrides extends HttpOverrides {
@override
HttpClient createHttpClient(SecurityContext? context) {
return super.createHttpClient(context)
..badCertificateCallback =
(X509Certificate cert, String host, int port) => true;
}
}
И дальше есть выбор, делать это на глобальном уровне, или передать в конструктор. В моём случае — глобально, поскольку API тоже спрятан за самоподписанным сертификатом:
HttpOverrides.global = SamsungHttpOverrides();
И такое на каждом шагу. Нельзя просто так взять и...
Может, поэтому мобильным разработчикам зачастую больше платят? 🤔
#flutter #remote #dart #websocket
😱8
#ссылка дня
Периодически этот канал позиционируется ещё и как канал «личинки тимлида». За что мне регулярно прилетает в лицо: «Ты почти два года тимлид, какая ты личинка».
Какая-какая, бабочки.
Но суть-то в том, что должность официально не тимлид, а engineering manager. То есть моя задача не только и не столько быть лидером и примером для команды (кек), как заниматься управленческой деятельностью. И тут я всё ещё личинка. И в среднем EMы являются личинками года три, пока не переходят на уровень менеджеров менеджеров.
И я очень вовремя наткнулся на большое исследование руководителей разработки: https://devcrowd.ru/tl23/companies/
Средний размер команды (вы знали, что команда из 8-10 человек называется two pizza team? Безос придумал. Я не согласен 🤡), участие в комьюнити, развитие, технические скиллы, карьера, где тимлиды черпают знания, лидеры мнений, гендерный дисбаланс и так далее. Очень много и очень подробно.
Сижу вот, изучаю...
#teamlead #em #m6
Периодически этот канал позиционируется ещё и как канал «личинки тимлида». За что мне регулярно прилетает в лицо: «Ты почти два года тимлид, какая ты личинка».
Какая-какая, бабочки.
Но суть-то в том, что должность официально не тимлид, а engineering manager. То есть моя задача не только и не столько быть лидером и примером для команды (кек), как заниматься управленческой деятельностью. И тут я всё ещё личинка. И в среднем EMы являются личинками года три, пока не переходят на уровень менеджеров менеджеров.
И я очень вовремя наткнулся на большое исследование руководителей разработки: https://devcrowd.ru/tl23/companies/
Средний размер команды (вы знали, что команда из 8-10 человек называется two pizza team? Безос придумал. Я не согласен 🤡), участие в комьюнити, развитие, технические скиллы, карьера, где тимлиды черпают знания, лидеры мнений, гендерный дисбаланс и так далее. Очень много и очень подробно.
Сижу вот, изучаю...
#teamlead #em #m6
🔥9👍3❤1
#инструмент дня
Пока мы тут эмодзи вместо курсора учились делать — https://t.iss.one/htmlshit/1861 — небезызвестный Wes Bos запилил целый стартап на тему. Я не шучу, там буквально на главной так написано: https://fav.farm/
В чём суть? Передаёте ссылку вида https://fav.farm/🤡 и получаете фавиконку для вашего сайта. Ну или курсор. Как получаете? В посте выше написано, как.
Но это не было бы так интересно, если бы не одно «но»: Safari не поддерживает SVG в фавиконках. Так что же делать?
Wes придумал запилить на Deno.js скрипт, который генерирует PNG из эмодзи, выдёргивая его из шрифта...
...а чтобы стало веселее — дёргает он их из шрифта от Samsung. А, как вы знаете, эмодзи на самсунгах максимально убогие 😈
В общем, казалось бы, какая простая идея, а прокачать скиллы решения проблем можно даже на ней.
#emoji #favicon #deno
Пока мы тут эмодзи вместо курсора учились делать — https://t.iss.one/htmlshit/1861 — небезызвестный Wes Bos запилил целый стартап на тему. Я не шучу, там буквально на главной так написано: https://fav.farm/
В чём суть? Передаёте ссылку вида https://fav.farm/🤡 и получаете фавиконку для вашего сайта. Ну или курсор. Как получаете? В посте выше написано, как.
Но это не было бы так интересно, если бы не одно «но»: Safari не поддерживает SVG в фавиконках. Так что же делать?
Wes придумал запилить на Deno.js скрипт, который генерирует PNG из эмодзи, выдёргивая его из шрифта...
...а чтобы стало веселее — дёргает он их из шрифта от Samsung. А, как вы знаете, эмодзи на самсунгах максимально убогие 😈
В общем, казалось бы, какая простая идея, а прокачать скиллы решения проблем можно даже на ней.
#emoji #favicon #deno
🔥16❤1
#инструмент дня
Нужна карусель изображений на сайт? jQuery-плагины не катят? Swiper.js чёртов огромный монстр и уже набил оскомину? Slick.js глючный? Owl не поддерживается? Нужна интеграция с React, Vue, Svelte?
Встречайте: https://splidejs.com/
Splide написан на TypeScript. Лёгкий, быстрый, куча интеграций. Десятки примеров использования сразу на главной странице. Не портит SEO страниц. Lighthouse тоже очень даже зелёный.
Нет зависимостей и поддержка от IE10.
Просто праздник какой-то.
#slider #carousel #gallery #swiper #бородач
Нужна карусель изображений на сайт? jQuery-плагины не катят? Swiper.js чёртов огромный монстр и уже набил оскомину? Slick.js глючный? Owl не поддерживается? Нужна интеграция с React, Vue, Svelte?
Встречайте: https://splidejs.com/
Splide написан на TypeScript. Лёгкий, быстрый, куча интеграций. Десятки примеров использования сразу на главной странице. Не портит SEO страниц. Lighthouse тоже очень даже зелёный.
Нет зависимостей и поддержка от IE10.
Просто праздник какой-то.
#slider #carousel #gallery #swiper #бородач
🔥27👍4
#нытьё дня
Итак, тема нытья сегодня: "Почему разработчики ОС с таким упорством вставляют палки в колёса переключателям языков ввода?".
Поясню, что я имею в виду. Начнём с Windows 11.
Мой личный ноутбук — ThinkPad с финской клавиатурой. При установке Windows я указал Eng (US) и Ru (Ru) раскладки клавиатуры, а ОС...
...подсунула мне финскую раскладку для британского английского! Неудаляемую!
Почему неудаляемую? Потому что британский английский языковой я не устанавливал вообще. Чтобы удалить, пришлось поставить языковой пакет, добавить в него финскую раскладку, тут же её удалить и удалить языковой пакет.
Кто просил это делать изначально? Вопрос риторический.
Теперь Linux. Конкретно — версии с GNOME.
Баг, повествующий о потере фокуса с поля ввода при переключении языка висит в трекере уже много лет. А точнее — 10. Да, он помечен как просроченный, но проблема-то никуда не делась. И важность "Low" или "Medium". Ну то есть разработчикам похер. А ты, тем временем, чтобы переименовать папку или ввести поле тянулся каждый раз не только переключить язык, но и поставить фокус на место.
Плюс, если у тебя Alt-Shift, во многих приложениях начинали срабатывать индикаторы горячих клавиш (VS Code, например), что тоже сбивало фокус если ты использовал для переключения раскладки не штатную шину GNOME, а что-то стороннее или просто настроил в Tweak Tools.
Теперь перейдём к macOS, которая тоже умудрилась насолить.
На ноутбуках и клавиатурах года так с 2021 есть клавиша с символом глобуса. Как нетрудно догадаться, она переключает раскладку. Но:
1. Кнопка на внешней клавиатуре раньше не работала с ноутбуками, у которых такой кнопки нет (2019 год, например).
2. ОС показывает всплывающее окно, что вызывает задержку переключения до двух секунд
3. Но этого окошку было мало и пару версий macOS назад если курсор мыши находился в месте, где появляется окошко — автоматически выбиралась раскладка, попадающая под курсор. Гениально.
Ну с этим бороться было просто, хоть и смешно:
1. Включаем переключение языка через CapsLock
2. Переназначаем Fn-клавишу на CapsLock
3. CapsLock лично я переназначаю на всех своих машинах на Cmd (mac) или Ctrl (Win, Lin). Потому что я не пианист.
В общем, казалось бы — идее переключения раскладки уже лет пятьдесят. Но находятся индивидуумы, которые хотя всё придумать заново.
P. S. многие проблемы решает однозначное переключение языка кастомным хоткеем сразу на нужный.
#macos #windows #linux
Итак, тема нытья сегодня: "Почему разработчики ОС с таким упорством вставляют палки в колёса переключателям языков ввода?".
Поясню, что я имею в виду. Начнём с Windows 11.
Мой личный ноутбук — ThinkPad с финской клавиатурой. При установке Windows я указал Eng (US) и Ru (Ru) раскладки клавиатуры, а ОС...
...подсунула мне финскую раскладку для британского английского! Неудаляемую!
Почему неудаляемую? Потому что британский английский языковой я не устанавливал вообще. Чтобы удалить, пришлось поставить языковой пакет, добавить в него финскую раскладку, тут же её удалить и удалить языковой пакет.
Кто просил это делать изначально? Вопрос риторический.
Теперь Linux. Конкретно — версии с GNOME.
Баг, повествующий о потере фокуса с поля ввода при переключении языка висит в трекере уже много лет. А точнее — 10. Да, он помечен как просроченный, но проблема-то никуда не делась. И важность "Low" или "Medium". Ну то есть разработчикам похер. А ты, тем временем, чтобы переименовать папку или ввести поле тянулся каждый раз не только переключить язык, но и поставить фокус на место.
Плюс, если у тебя Alt-Shift, во многих приложениях начинали срабатывать индикаторы горячих клавиш (VS Code, например), что тоже сбивало фокус если ты использовал для переключения раскладки не штатную шину GNOME, а что-то стороннее или просто настроил в Tweak Tools.
Теперь перейдём к macOS, которая тоже умудрилась насолить.
На ноутбуках и клавиатурах года так с 2021 есть клавиша с символом глобуса. Как нетрудно догадаться, она переключает раскладку. Но:
1. Кнопка на внешней клавиатуре раньше не работала с ноутбуками, у которых такой кнопки нет (2019 год, например).
2. ОС показывает всплывающее окно, что вызывает задержку переключения до двух секунд
3. Но этого окошку было мало и пару версий macOS назад если курсор мыши находился в месте, где появляется окошко — автоматически выбиралась раскладка, попадающая под курсор. Гениально.
Ну с этим бороться было просто, хоть и смешно:
1. Включаем переключение языка через CapsLock
2. Переназначаем Fn-клавишу на CapsLock
3. CapsLock лично я переназначаю на всех своих машинах на Cmd (mac) или Ctrl (Win, Lin). Потому что я не пианист.
В общем, казалось бы — идее переключения раскладки уже лет пятьдесят. Но находятся индивидуумы, которые хотя всё придумать заново.
P. S. многие проблемы решает однозначное переключение языка кастомным хоткеем сразу на нужный.
#macos #windows #linux
❤9👍3🤔2💩1
#фишка дня
Я надеюсь, вас не смутит, что я сюда теперь буду иногда скидывать заметки для Windows PowerShell. Просто у меня очередной приступ усталости от Linux на десктопе, так что на личный ноутбук вернул Windows 11. Не знаю, надолго ли.
Вернул — потому что OEM. Не суть.
Так вот. Если вы ставите различные утилиты для разработки, от Git, Node.js через Volta до Android и Flutter SDK, вам нужно постоянно обновлять пути в переменной среды — Env — и перезаходить в консоль, чтобы утилиты стали доступны к исполнению.
Ну если вы не лох какой и пользуетесь консолью, конечно.
Так вот, первое, что меня убило — недостаточно просто запустить новую вкладку в Windows Terminal, как я бы сделал в любом эмуляторе терминала в macOS и Linux. Надо перезапускать всё приложение. Мерзость.
Чтобы этого избежать, нужно выполнить следующую команду:
И всё встаёт на свои места.
#windows #powershell
Я надеюсь, вас не смутит, что я сюда теперь буду иногда скидывать заметки для Windows PowerShell. Просто у меня очередной приступ усталости от Linux на десктопе, так что на личный ноутбук вернул Windows 11. Не знаю, надолго ли.
Вернул — потому что OEM. Не суть.
Так вот. Если вы ставите различные утилиты для разработки, от Git, Node.js через Volta до Android и Flutter SDK, вам нужно постоянно обновлять пути в переменной среды — Env — и перезаходить в консоль, чтобы утилиты стали доступны к исполнению.
Ну если вы не лох какой и пользуетесь консолью, конечно.
Так вот, первое, что меня убило — недостаточно просто запустить новую вкладку в Windows Terminal, как я бы сделал в любом эмуляторе терминала в macOS и Linux. Надо перезапускать всё приложение. Мерзость.
Чтобы этого избежать, нужно выполнить следующую команду:
$Env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine")
.И всё встаёт на свои места.
#windows #powershell
💩15👍9❤🔥1🤔1
#расширение дня
Ну что, пришло время поговорить о серьезных вещах!
А что может быть серьезнее ошибок TypeScript? Правильно, ничего. Уж слишком они формальные. И мы на самом деле уже с вами обсуждали расширение, переводящее их в человеческий вид: https://t.iss.one/htmlshit/1601
И вот есть ещё одно, стремительно набирающее популярность: https://github.com/yoavbls/pretty-ts-errors
Ссылка на VS Code store: https://marketplace.visualstudio.com/items?itemName=yoavbls.pretty-ts-errors
Работает с Node и Deno, React и Vue, Solid и Qwik. Далее везде, в общем.
Пробуем, рассказываем о результатах.
Прокачивайте скиллы, котаны.
#typescript #ts #vscode
Ну что, пришло время поговорить о серьезных вещах!
А что может быть серьезнее ошибок TypeScript? Правильно, ничего. Уж слишком они формальные. И мы на самом деле уже с вами обсуждали расширение, переводящее их в человеческий вид: https://t.iss.one/htmlshit/1601
И вот есть ещё одно, стремительно набирающее популярность: https://github.com/yoavbls/pretty-ts-errors
Ссылка на VS Code store: https://marketplace.visualstudio.com/items?itemName=yoavbls.pretty-ts-errors
Работает с Node и Deno, React и Vue, Solid и Qwik. Далее везде, в общем.
Пробуем, рассказываем о результатах.
Прокачивайте скиллы, котаны.
#typescript #ts #vscode
❤7🔥3👍1
#баг дня
input size=“1” в Firefox слишком широкий. Логика подсказывает нам, что он должен так-то быть в один символ шириной.
Песочница: https://jsbin.com/zavefac/edit?output
Багтрекер: https://bugzilla.mozilla.org/show_bug.cgi?id=1782385
С комментария в приложенном куске кода я в целом в голос прорал: «
Вот и он, кстати: https://searchfox.org/mozilla-central/rev/92e8568bbe7c8bf64f7a8ee958291877d960d7d8/layout/forms/nsTextControlFrame.cpp#209-232
Вроде как для моноширинных шрифтов все отрабатывает как надо. Но что-то пошло не так.
#firefox #bug #бородач
input size=“1” в Firefox слишком широкий. Логика подсказывает нам, что он должен так-то быть в один символ шириной.
Песочница: https://jsbin.com/zavefac/edit?output
Багтрекер: https://bugzilla.mozilla.org/show_bug.cgi?id=1782385
С комментария в приложенном куске кода я в целом в голос прорал: «
To better match IE»
…Вот и он, кстати: https://searchfox.org/mozilla-central/rev/92e8568bbe7c8bf64f7a8ee958291877d960d7d8/layout/forms/nsTextControlFrame.cpp#209-232
Вроде как для моноширинных шрифтов все отрабатывает как надо. Но что-то пошло не так.
#firefox #bug #бородач
🔥4😁4