Шаблонизаторы
Всегда недолюбливал синтаксис шаблонизаторов в PHP. Ну вот хоть убейте не вижу в них большого смысла. Вот как раз недавно наткнулся на вот такой вот кусок кода в пыховском файле. Там конечно намешена и логика и отображение и в целом этот код не очень, но на нем можно хорошо проиллюстрировать мысль что не так сильно уж шаблонизаторы упрощают жизнь.
Вот кусок этого кода на PHP:
Смысл в том, что сам по себе шаблонизатор не делает код сильно понятнее если к этому не стремиться. Просто переписав "лапшу" на шаблонизаторе она не перестанет быть лапшой.
Вот например не мой взгляд код который действительно понятный и лаконичный и на PHP и на TWIG:
Всегда недолюбливал синтаксис шаблонизаторов в PHP. Ну вот хоть убейте не вижу в них большого смысла. Вот как раз недавно наткнулся на вот такой вот кусок кода в пыховском файле. Там конечно намешена и логика и отображение и в целом этот код не очень, но на нем можно хорошо проиллюстрировать мысль что не так сильно уж шаблонизаторы упрощают жизнь.
Вот кусок этого кода на PHP:
//PHP - вытащил пример из реального кодаА вот как он бы выглядел если бы был написан с использованием шаблонизатора TWIG:
<? if $user['balance_type']!=2 { ?>
<div class="panel panel-default">
<!--какой то html-->
</div>
<? } ?>
//переписал его на TWIG (разница небольшая)И вот хоть убейте меня не вижу я тут большой разницы, ну эти два говнокода абсолютно одинаковые и ни как шаблонизатор не сделал из него что то похожее на "best practices" код.
{% if balance_type !=2 %}
<div class="panel panel-default">
<!--какой то html-->
</div>
{% endif %}
Смысл в том, что сам по себе шаблонизатор не делает код сильно понятнее если к этому не стремиться. Просто переписав "лапшу" на шаблонизаторе она не перестанет быть лапшой.
Вот например не мой взгляд код который действительно понятный и лаконичный и на PHP и на TWIG:
//phpТут в переменной передается просто имя класса которое ставить например блок в display: none. Подойдет конечно не для всех случаев но смысл думаю ясен.
<div class="panel panel-default <?=$is_none?>">
<!--какой то html-->
</div>
//twig
<div class="panel panel-default {{ is_none }}">
<!--какой то html-->
</div>
#продвижениебизнеса
#оффтоп
✅ Ха-ха
Американец продал свой пикап автосалону и не снял с него рекламу своего бизнеса. Ну и где же он его увидел в следующий раз? Конечно же у террористов.
С зениткой в кузове!
❌ После этого мужик получил много звонков в свою фирму)))
Возьмем на заметку как новый рекламный канал.
#оффтоп
✅ Ха-ха
Американец продал свой пикап автосалону и не снял с него рекламу своего бизнеса. Ну и где же он его увидел в следующий раз? Конечно же у террористов.
С зениткой в кузове!
❌ После этого мужик получил много звонков в свою фирму)))
Возьмем на заметку как новый рекламный канал.
🥳👏👍
В последнем релизе Telegram ввел некоторые новые фичи, наиболее значимой и не побоюсь этого слова долгожданной из которые являются папки. Когда эту возможность только анонсировали - очень ждал ее, потому как - это сильно упростит жизнь и позволит систематизировать чаты.
❗️❗️❗️🤦♀️🤦♂️🤷♀️🤷♂️
И вот релиз, и вот первые разочарования. Ну правда, может это я конечно что то не допонял, но вот такой странной реализации этого функционала ни как не ожидал. Если создать папку и положить в нее какие то чаты то я естественно ожидаю что эти чаты пропадут у меня из общего потока и будут отображаться только в этой папке. Но почему то разработчики посчитали такое поведение неправильным. И сделали так, что после того как я засунул всякие спамные чаты в отдельную папку они мало того, что не пропали у меня из общего потока, так теперь еще и сама папка мне сигнализирует что в ней лежат непрочитанные сообщения. Блин ну как так то.
✅Опять же на мой взгляд - это то случай когда не надо было ни чего изобретать и пытаться что то улучшить, а просто взять уже всем привычную логику и перенести ее к себе. Любой человек работает с папками у себя на компе и он привык к этой логике, ну вот не чего тут по моему изобретать. Ну как говориться как есть так и хорошо.
❤️🌈Все равно Telegram крутой, может когда то и переделают)))
В последнем релизе Telegram ввел некоторые новые фичи, наиболее значимой и не побоюсь этого слова долгожданной из которые являются папки. Когда эту возможность только анонсировали - очень ждал ее, потому как - это сильно упростит жизнь и позволит систематизировать чаты.
❗️❗️❗️🤦♀️🤦♂️🤷♀️🤷♂️
И вот релиз, и вот первые разочарования. Ну правда, может это я конечно что то не допонял, но вот такой странной реализации этого функционала ни как не ожидал. Если создать папку и положить в нее какие то чаты то я естественно ожидаю что эти чаты пропадут у меня из общего потока и будут отображаться только в этой папке. Но почему то разработчики посчитали такое поведение неправильным. И сделали так, что после того как я засунул всякие спамные чаты в отдельную папку они мало того, что не пропали у меня из общего потока, так теперь еще и сама папка мне сигнализирует что в ней лежат непрочитанные сообщения. Блин ну как так то.
✅Опять же на мой взгляд - это то случай когда не надо было ни чего изобретать и пытаться что то улучшить, а просто взять уже всем привычную логику и перенести ее к себе. Любой человек работает с папками у себя на компе и он привык к этой логике, ну вот не чего тут по моему изобретать. Ну как говориться как есть так и хорошо.
❤️🌈Все равно Telegram крутой, может когда то и переделают)))
#лайфхак
Иногда бывает нужно в одном запросе соединить две таблицы по связи один ко многим, но не так как это сделает JOIN, соединив одну строку с несколькими связанными. Нужно чтобы получилась одна строка в которой есть поле содержащее строки из связанной таблицы.
Тут можно сделать 2 запроса и потом их обработать нужным образом, или если вы используете фреймоворк там это тоже реализовано, но все равно там делается 2 запроса которые потом уже обрабатываются.
Вот способ как можно это сделать в одном запросе. Для этого нужно будет использовать возможности mySql по работе с Json. А именно функции GROUP_CONCAT - эта функция конкатенирует результаты всего запроса, и функцию JSON_OBJECT которая создает Json строку.
Допустим имеем две следующие таблицы:
ORDERS
+----+------——-+
| id | name |
+----+---——----+
| 1 | ivan |
| 2 | elena |
| 3 | anonim |
+----+----——---+
GOODS
+----+-----———------+------—----+
| id | noscript | order_id |
+----+-------———----+----—------+
| 1 | phone | 1 |
| 2 | headphones | 1 |
| 3 | laptop | 2 |
| 4 | keyboard | 2 |
| 5 | camera | 3 |
+----+--------———---+------—-----+
Они связаны через поле goods.order_id. Предположим что мы хотим получить все товары которые заказала Елена. Чтобы у нас были такие поля order_id, order_name, order_goods. В поле order_goods будут лежать все строки из таблицы goods связанные с данным заказом.
Запрос будет выглядеть вот так:
Иногда бывает нужно в одном запросе соединить две таблицы по связи один ко многим, но не так как это сделает JOIN, соединив одну строку с несколькими связанными. Нужно чтобы получилась одна строка в которой есть поле содержащее строки из связанной таблицы.
Тут можно сделать 2 запроса и потом их обработать нужным образом, или если вы используете фреймоворк там это тоже реализовано, но все равно там делается 2 запроса которые потом уже обрабатываются.
Вот способ как можно это сделать в одном запросе. Для этого нужно будет использовать возможности mySql по работе с Json. А именно функции GROUP_CONCAT - эта функция конкатенирует результаты всего запроса, и функцию JSON_OBJECT которая создает Json строку.
Допустим имеем две следующие таблицы:
ORDERS
+----+------——-+
| id | name |
+----+---——----+
| 1 | ivan |
| 2 | elena |
| 3 | anonim |
+----+----——---+
GOODS
+----+-----———------+------—----+
| id | noscript | order_id |
+----+-------———----+----—------+
| 1 | phone | 1 |
| 2 | headphones | 1 |
| 3 | laptop | 2 |
| 4 | keyboard | 2 |
| 5 | camera | 3 |
+----+--------———---+------—-----+
Они связаны через поле goods.order_id. Предположим что мы хотим получить все товары которые заказала Елена. Чтобы у нас были такие поля order_id, order_name, order_goods. В поле order_goods будут лежать все строки из таблицы goods связанные с данным заказом.
Запрос будет выглядеть вот так:
SELECT *, (В результате в поле goods мы получим валидный Json со всеми товарами из таблицы
SELECT GROUP_CONCAT(
JSON_OBJECT(
'goods_id', id,
'goods_noscript', noscript
)
) FROM goods WHERE order_id = ord.id) as goods
FROM orders ord
WHERE id = 2
{
"goods_id": 3,
"goods_noscript": "laptop"
},
{
"goods_id": 4,
"goods_noscript": "keyboard"
}Небольшой кейс, поможет предотвратить некоторые баги
Если при написании запросов к базе вы используете чистый SQL, то в запросах на INSERT старайтесь всегда указывать описание полей в которые идет вставка, даже если вы вставляете данные во все поля таблицы.
✅ Вот такой запрос будет более предпочтительнее
Если при написании запросов к базе вы используете чистый SQL, то в запросах на INSERT старайтесь всегда указывать описание полей в которые идет вставка, даже если вы вставляете данные во все поля таблицы.
✅ Вот такой запрос будет более предпочтительнее
INSERT INTO users_table❌ Чем вот такой
(field1, field2, ..., field_last)
VALUES (val1, val2, val3, ..., val_last)
INSERT INTO users_table⁉️Почему? Потому что во втором случае если вы решите в таблицу users_table добавить например еще одно поле, то вам нужно будет и в запрос добавить еще одно значение, а найти все такие запросы не всегда бывает просто. В первом же варианте при таком раскладе в новое поле при инсерте будет записано дефолтное значение, второй вариант выкинет ошибку.
VALUES (val1, val2, ..., val_last)
This media is not supported in your browser
VIEW IN TELEGRAM
#забавы
Очень забавный проект на js. Даже несмотря на то что пока компонентов не так много, выглядит все очень лампово. Я лично минут на 40 залип экспериментируя и сочетая компоненты. В итоге изготовил вот такой вулкан, который конечно же уничтожит прекрасный живой мир).
Есть также возможность увековечить свою поделку 🤣🤦🏻♂️
Вот тут песочница
Вот его GitHub
Очень забавный проект на js. Даже несмотря на то что пока компонентов не так много, выглядит все очень лампово. Я лично минут на 40 залип экспериментируя и сочетая компоненты. В итоге изготовил вот такой вулкан, который конечно же уничтожит прекрасный живой мир).
Есть также возможность увековечить свою поделку 🤣🤦🏻♂️
Вот тут песочница
Вот его GitHub
Почта на десять минут
📍📬Иногда бывает очень нужно зарегистрироваться на каком либо ресурсе повторно, но создавать для этого отдельную почту просто лень. В таких случаях будет очень полезен данный сервис. Он предоставляет вам рандомный адрес на 10 минут. Если 10 минут мало то его можно продлевать. Если нужен другой адрес, пожалуйста сервис предоставит еще один.
В общем штука может быть крайне полезна 👍✅
https://10minutemail.net/
📍📬Иногда бывает очень нужно зарегистрироваться на каком либо ресурсе повторно, но создавать для этого отдельную почту просто лень. В таких случаях будет очень полезен данный сервис. Он предоставляет вам рандомный адрес на 10 минут. Если 10 минут мало то его можно продлевать. Если нужен другой адрес, пожалуйста сервис предоставит еще один.
В общем штука может быть крайне полезна 👍✅
https://10minutemail.net/
10 Minute Mail
Temporary disposable email service to beat spam. Avoid spam with a free, secure 10 minutes email address. Use our service as often as you like.
Наш не ответ "Кремниевой долине"
🚷 => 🤖
Тут недавно Инополис выложил сериал про программистов. Говорят что снят самими программистами, ну это конечно же не точно и проверять я это не буду. По крайней мере режиссер и актеры вроде бы как профессиональные. Но к сценарию программисты все же думаю руку приложили.
В сторону глупые человеки)
📻 => 📺 => 💻
Но не в этом суть. Посмотрел первые несколько серий и надо сказать мне понравилось. Про реализм говорить не буду, ну его этот реализм, тут все таки кино). И вот прям и сценарий нормальный, понравилось что не стали копировать "Кремниевую долину", получилось интересно. И актеры не раздражают. В общем прикольный сериал получился, пока было не стыдно смотреть. Надеюсь и дальше все будет ок.
Сцена с "питанием" прям плюс)))
Посмотреть можно тут
🚷 => 🤖
Тут недавно Инополис выложил сериал про программистов. Говорят что снят самими программистами, ну это конечно же не точно и проверять я это не буду. По крайней мере режиссер и актеры вроде бы как профессиональные. Но к сценарию программисты все же думаю руку приложили.
В сторону глупые человеки)
📻 => 📺 => 💻
Но не в этом суть. Посмотрел первые несколько серий и надо сказать мне понравилось. Про реализм говорить не буду, ну его этот реализм, тут все таки кино). И вот прям и сценарий нормальный, понравилось что не стали копировать "Кремниевую долину", получилось интересно. И актеры не раздражают. В общем прикольный сериал получился, пока было не стыдно смотреть. Надеюсь и дальше все будет ок.
Сцена с "питанием" прям плюс)))
Посмотреть можно тут
Родные костыли
🚴♀️🚲🚲🚲🚲🚲🚲🚲🚲🚲
Бывают костыли двух видов. Одни хотя бы работают. Ну я думаю не стоит объяснять что не так с левым примером и при каких обстоятельствах он будет работать не правильно.
⚙️🤦🏻♂️
Ну вот зачем было это придумывать, когда первая же поисковая ссылка выдала просто отличную реализацию. Да типа нельзя для всего найти готовое решение, и свои решения тоже надо уметь писать, но блин они же должны хоть работать, пусть криво, пусть неочевидно но хоть как. Это так сказать необходимый минимум для существования велосипеда.
✅ Вот кстати нормальная реализация:
Склонение числительных в javanoscript
🚴♀️🚲🚲🚲🚲🚲🚲🚲🚲🚲
Бывают костыли двух видов. Одни хотя бы работают. Ну я думаю не стоит объяснять что не так с левым примером и при каких обстоятельствах он будет работать не правильно.
⚙️🤦🏻♂️
Ну вот зачем было это придумывать, когда первая же поисковая ссылка выдала просто отличную реализацию. Да типа нельзя для всего найти готовое решение, и свои решения тоже надо уметь писать, но блин они же должны хоть работать, пусть криво, пусть неочевидно но хоть как. Это так сказать необходимый минимум для существования велосипеда.
✅ Вот кстати нормальная реализация:
Склонение числительных в javanoscript
Как получить оффер в Европейской IT компании?
Что спрашивают на собеседованиях, и какие дают тех. задания?
Актуально?
Подписывайся👇🏻
https://news.1rj.ru/str/It_europe
Что спрашивают на собеседованиях, и какие дают тех. задания?
Актуально?
Подписывайся👇🏻
https://news.1rj.ru/str/It_europe
Telegram
Программист в Европе
Путь от фрилансера к востребованному программисту в Европе.
Как я искал работу в Польше, Германии и Англии
Чат программистов:
T.me/programChat
По вопросам сотрудничества: @kocherzhynska
Как я искал работу в Польше, Германии и Англии
Чат программистов:
T.me/programChat
По вопросам сотрудничества: @kocherzhynska
This media is not supported in your browser
VIEW IN TELEGRAM
#забавы
Интересная рисовалка
🎨 Попалась вот такая интересная рисовалка. Смысл в том что когда начинаешь что то рисовать, она предлагает похожие варианты картинок исходя из того что ты рисуешь. Хоть вариантов выбора не так чтобы очень много, но было очень забавно поиграться. В общем мне показалась полезная штука, теперь использую ее.
======================
P.S. очень понравилось как сделан туториал по использованию. Прямо образец, как надо делать, просто и понятно.
======================
✅ Вот ссылка
Интересная рисовалка
🎨 Попалась вот такая интересная рисовалка. Смысл в том что когда начинаешь что то рисовать, она предлагает похожие варианты картинок исходя из того что ты рисуешь. Хоть вариантов выбора не так чтобы очень много, но было очень забавно поиграться. В общем мне показалась полезная штука, теперь использую ее.
======================
P.S. очень понравилось как сделан туториал по использованию. Прямо образец, как надо делать, просто и понятно.
======================
✅ Вот ссылка
#pattern
Шаблон проектирования - состояние
В формате поста шаблон описать довольно сложно. По этому постараюсь передать самую суть. В детали реализации углубляться не будем, да и не к чему это. Поехали.
Пример приближенный к реальной жизни.
Мы программируем машину (класс Car). Машина может находится в трех состояниях (пусть за это отвечает поле $state)
1 - с выключенным двигателем
2- с запущенным двигателем, но не в движении
3 - в движении соответственно с запущенным двигателем
Из функционала у нее есть пока только возможность включить фары, причем если двигатель выключен, то должны загореться габариты. Если двигатель заведен, то должны загореться фары. Если машина находится в движении, то и фары и габариты.
Попробовав запрограммировать это без использования шаблона мы скорее всего получим примерно такую функцию
1 - Когда мы будем добавлять состояния (например задний ход) нам придется добавлять еще условия.
2 - Когда мы будем добавлять новый функционал (например управление сигналом) он тоже будет зависеть от $state и туда тоже нужно будет добавлять такой же "if"
3 - Если нужно изменить поведение при каком то из состояний то нужно будет отыскать все эти "ифы" и внутри уже работающего кода внести все правки (уверен что с первого раза это не удастся)
Теперь давайте попробуем то же самое запрограммировать с использованием шаблона.
Первое что сделаем - это в переменную $state положим объект который имеет доступ к родительскому классу, то есть к Car и его методам. Таких объектов__ $state__ у нас будет в данном случае три. Каждый отвечает за свое состояние, то есть вызывает из родителя определенные функции. Один $state вызывает только метод turnOnParkingLights(), другой turnOnHeadLights(), третий оба эти метода. Для этого в $state у нас будет метод handle() Итого мы получим примерно следующий код.
1 - При добавлении состояния нам не нужно искать все "ифы" и править их, достаточно добавить новый __$state___
2 - При добавлении нового функционала мы добавляем всего одну функцию в родительский класс, без условий. А весь рабочий код добавляем в файлы состояний.
3 - Меняя какое то поведение мы делаем это в изолированном файле состояния, не затрагивая родительский класс, а значит имеем меньше шансов сломать рабочий код.
P.S. Как и говорил это урезанный вариант шаблона, просто если описать все подробно, не думаю что это будет хоть сколько интересно читать. Тут цель передать самую суть, а уже когда шаблон будет непосредственно применяться, можно и почитать более подробный разбор. Кстати вот тут очень здорово все шаблоны описаны, рекомендую ознакомиться кому интересно. Спасибо.
Шаблон проектирования - состояние
В формате поста шаблон описать довольно сложно. По этому постараюсь передать самую суть. В детали реализации углубляться не будем, да и не к чему это. Поехали.
Пример приближенный к реальной жизни.
Мы программируем машину (класс Car). Машина может находится в трех состояниях (пусть за это отвечает поле $state)
1 - с выключенным двигателем
2- с запущенным двигателем, но не в движении
3 - в движении соответственно с запущенным двигателем
Из функционала у нее есть пока только возможность включить фары, причем если двигатель выключен, то должны загореться габариты. Если двигатель заведен, то должны загореться фары. Если машина находится в движении, то и фары и габариты.
Попробовав запрограммировать это без использования шаблона мы скорее всего получим примерно такую функцию
function lightHandle()В этой функции есть аж 3 большие проблемы.
{
if ($state === 'off') {
turnOnParkingLights();
} else if ($state === 'on') {
turnOnHeadLights();
} else if ($state === 'move') {
turnOnParkingLights();
turnOnHeadLights();
}
}
1 - Когда мы будем добавлять состояния (например задний ход) нам придется добавлять еще условия.
2 - Когда мы будем добавлять новый функционал (например управление сигналом) он тоже будет зависеть от $state и туда тоже нужно будет добавлять такой же "if"
3 - Если нужно изменить поведение при каком то из состояний то нужно будет отыскать все эти "ифы" и внутри уже работающего кода внести все правки (уверен что с первого раза это не удастся)
Теперь давайте попробуем то же самое запрограммировать с использованием шаблона.
Первое что сделаем - это в переменную $state положим объект который имеет доступ к родительскому классу, то есть к Car и его методам. Таких объектов__ $state__ у нас будет в данном случае три. Каждый отвечает за свое состояние, то есть вызывает из родителя определенные функции. Один $state вызывает только метод turnOnParkingLights(), другой turnOnHeadLights(), третий оба эти метода. Для этого в $state у нас будет метод handle() Итого мы получим примерно следующий код.
//код основной функцииИтого как мы этим решили 3 наши проблемы:
function lightHandle()
{
$state->handle();
}
//$state1
function handle()
{
$parentClass->turnOnParkingLights();
}
//$state2
function handle()
{
$parentClass->turnOnHeadLights();
}
//$state3
function handle()
{
$parentClass->turnOnHeadLights();
$parentClass->turnOnHeadLights();
}
1 - При добавлении состояния нам не нужно искать все "ифы" и править их, достаточно добавить новый __$state___
2 - При добавлении нового функционала мы добавляем всего одну функцию в родительский класс, без условий. А весь рабочий код добавляем в файлы состояний.
3 - Меняя какое то поведение мы делаем это в изолированном файле состояния, не затрагивая родительский класс, а значит имеем меньше шансов сломать рабочий код.
P.S. Как и говорил это урезанный вариант шаблона, просто если описать все подробно, не думаю что это будет хоть сколько интересно читать. Тут цель передать самую суть, а уже когда шаблон будет непосредственно применяться, можно и почитать более подробный разбор. Кстати вот тут очень здорово все шаблоны описаны, рекомендую ознакомиться кому интересно. Спасибо.
refactoring.guru
Состояние
Состояние — это поведенческий паттерн проектирования, который позволяет объектам менять поведение в зависимости от своего состояния. Извне создаётся впечатление, что изменился класс объекта.
#лайфхак
Красивый вывод git log
Сандартный вывод git log сложно назвать понятным и информативным. Отчасти по этому приходится пользоваться дополнительными инструментами. Но эту проблему очень легко решить, т.к. git log имеет очень много опций. Так давайте сделаем его понятным и красивым. как на третей картинке.
1. Отформатируем вывод командой
--format - вывод информации производить в соответствии формату
%Cred - задает цвет вывода (тут красный)
%Creset - цвет заканчивается
%h - хэш коммита
%cn - имя автора
%s - описание коммита
%cr - относительное время
2. Чтобы каждый раз не вводить это все руками добавим этот вывод в аллиас, командой
Красивый вывод git log
Сандартный вывод git log сложно назвать понятным и информативным. Отчасти по этому приходится пользоваться дополнительными инструментами. Но эту проблему очень легко решить, т.к. git log имеет очень много опций. Так давайте сделаем его понятным и красивым. как на третей картинке.
1. Отформатируем вывод командой
git log --graph --format=format:"%Cred%h%Creset | %cn => %Cgreen%s%Creset (%Cblue%cr%Creset)"--graph - показывать граф с коммитами
--format - вывод информации производить в соответствии формату
%Cred - задает цвет вывода (тут красный)
%Creset - цвет заканчивается
%h - хэш коммита
%cn - имя автора
%s - описание коммита
%cr - относительное время
2. Чтобы каждый раз не вводить это все руками добавим этот вывод в аллиас, командой
git config --global alias.lg 'log --graph --format=format:"%Cred%h%Creset | %cn => %Cgreen%s%Creset (%Cblue%cr%Creset)"'Все теперь мы добавили для этого вывода простой и понятный алиас. Все что нам нужно теперь это им пользоваться.
git lg
🥚Сегодня вроде как Пасха, тогда вот парочка незамысловатых "пасхалок"
1️⃣ Пользователи "фейсбука" видимо часто подвергаются атакам. Ну не зря же там большими красными буквами вас попросят остановиться 🙅♂️
2️⃣ А вот ребята из "Тинькофф" даже консоль используют для продвижения. Там они ищут разработчиков и собирают баги. Считаешь что потянешь? тогда пиши им, почта в консоли) 📨
3️⃣ Тот кто юзает убунту, может попробовать поставить себе пакет moo. Ха-ха, а ведь серьезные люди! 🐄
Спасибо, надеюсь ни кто не обижен 🤷♂️
1️⃣ Пользователи "фейсбука" видимо часто подвергаются атакам. Ну не зря же там большими красными буквами вас попросят остановиться 🙅♂️
2️⃣ А вот ребята из "Тинькофф" даже консоль используют для продвижения. Там они ищут разработчиков и собирают баги. Считаешь что потянешь? тогда пиши им, почта в консоли) 📨
3️⃣ Тот кто юзает убунту, может попробовать поставить себе пакет moo. Ха-ха, а ведь серьезные люди! 🐄
Спасибо, надеюсь ни кто не обижен 🤷♂️
This media is not supported in your browser
VIEW IN TELEGRAM
XSS ну или наполовину XSS
Недавно просматривал один агрегатор в поисках каналов в телеграме и увидел вот такую интересную штуку. В графе где указано название канала, пользователь ввел очень длинный текст. Из за этого строка растянулась в высоту и перекрыла кнопки навигации, сделав их неактивными 😭😭😭. Усугубилось все тем что та часть которая все перекрыла - прозрачная и создается полное ощущение что кнопки просто не работают, а на самом деле просто поверх этих кнопок лежит прозрачный контейнер. 🤷♂️👏
Конкретно в данном случае врядли это нанесло большой ущерб, а в представьте например если бы на каком то условном "авито" чье то объявление перекрыло навигацию. Думаю кто-то, а может быть и не один искал работу. 🚷
✅ И да это конечно не совсем XSS, но внедрение в принципе удалось, хоть и не специально.
❗️❗️❗️Мораль - всегда проверяй пользовательский ввод.
Недавно просматривал один агрегатор в поисках каналов в телеграме и увидел вот такую интересную штуку. В графе где указано название канала, пользователь ввел очень длинный текст. Из за этого строка растянулась в высоту и перекрыла кнопки навигации, сделав их неактивными 😭😭😭. Усугубилось все тем что та часть которая все перекрыла - прозрачная и создается полное ощущение что кнопки просто не работают, а на самом деле просто поверх этих кнопок лежит прозрачный контейнер. 🤷♂️👏
Конкретно в данном случае врядли это нанесло большой ущерб, а в представьте например если бы на каком то условном "авито" чье то объявление перекрыло навигацию. Думаю кто-то, а может быть и не один искал работу. 🚷
✅ И да это конечно не совсем XSS, но внедрение в принципе удалось, хоть и не специально.
❗️❗️❗️Мораль - всегда проверяй пользовательский ввод.
Очень удобная штука, позволяет сделать в проекте иконки в виде шрифтов. Как например Glyphicon в Бутстрапе.
Но при этом не нужно будет подключать ни какие библиотеки.
1️⃣ На сайте icomoon.io создаем новое приложение.
2️⃣ Выбираем нужные иконки, нажимаем создать шрифт и скачиваем все что получилось.
3️⃣ То что скачалось разархивируем в папку с проектом.
4️⃣ И того из того что скачается нам нужен только файл style.css там лежат необходимые стили и содержимое папки fonts, там непосредственно шрифты.
5️⃣ У меня в тестовом проекте только индексный файл, по этому все что нужно сделать - это подключить к нему скачанный файл style.css.
6️⃣ Затем добавим в индексный файл простые дивы с классами указанными в style.css.
7️⃣ Вот и все, смотрим, что у нас получилось.
icomoon.io
Но при этом не нужно будет подключать ни какие библиотеки.
1️⃣ На сайте icomoon.io создаем новое приложение.
2️⃣ Выбираем нужные иконки, нажимаем создать шрифт и скачиваем все что получилось.
3️⃣ То что скачалось разархивируем в папку с проектом.
4️⃣ И того из того что скачается нам нужен только файл style.css там лежат необходимые стили и содержимое папки fonts, там непосредственно шрифты.
5️⃣ У меня в тестовом проекте только индексный файл, по этому все что нужно сделать - это подключить к нему скачанный файл style.css.
6️⃣ Затем добавим в индексный файл простые дивы с классами указанными в style.css.
7️⃣ Вот и все, смотрим, что у нас получилось.
icomoon.io