CoderLIfe
37 subscribers
33 photos
1 video
10 links
Немного про жизнь кодера, интересности и рутина. Про IT в целом. Свое мнение по некоторым вопросом. Немного кода. Минимум заумности. Может немного юмора.
#it
#php
#develop
#javascript
#coder
#itlife

Админ @LimboFog
加入频道
Стреляю себе в ногу 🎯🏹

🤦‍♀️🛠🧹Случился недавно небольшой фейл, пустяковое дело на самом деле. Но если задуматься то произошел он из за нарушения основного принципа программирования. Не то чтобы это какой то очень примечательный случай но хорошо подойдет для разбора.

👨‍🏫🙇‍♂️🚴‍♀️Итак начнем с первой картинки. Там 2 функции, первая инитит какие то значения, а вторая приводит время из вида "00:00" в формат "00". Проблема в том что иногда время приходило с разделителем запятой вместо двоеточия. Нужно было это срочно хотфиксить, а так как голову в тот момент включить было лень (очень небольшой казалась проблема) то сделано было как на второй картинке.

⭕️🛑⛔️А именно в первой функции инитере просто в двух местах взял и зареплейсил запятую на двоеточие. Поленился заглянуть в функцию toStringFormat(), а зря). Именно в этот момент произошло нарушение, а конкретно был задублирован фрагмент (хоть и небольшой) кода. И кара не заставила себя ждать, в event.start и event.finish пришли значения NULL. Конечно метод replace вызванный из NULL сразу же все завалил))).

Вот так вот. 1️⃣ Поленился заглянуть в toStringFormat, а там NULL как видите был учтен. 2️⃣ Также поленился посмотреть интерфейс Event, в котором тоже обозначено что эти поля могут быть нулами. Правильный вариант как понимаете на 3 картинке.



P.S. Это не прямо реальный код из прода (как то это не хорошо реальный код выкладывать) а переработанный, просто чтобы отразить суть, реальный код там немного сложнее был. По этому если в коде заметите какие то несостыковки не удивляйтесь как он вообще работал. Это простоя его отформатировал чтобы передать суть, там могут быть недочеты)))
Упорядочиваем знания.📚🗒📖

🉐🈵🈺🈯️🈳
Итак все кто хоть как то работает с вебом думаю знает что есть некие HTML сущности, спецсимволы, коды символов, кодировки. Но думаю что многие также не понимают кристально чем одно отличается от другого и какой вообще у всего этого смысл. Я например над этим никогда не парился и когда мне нужно было отобразить какой то символ которого нет на клавиатуре, я просто гуглил что то типа "Знак рубля html сущность" и вставлял либо вот такую последовательность "₽", либо прямо копировал сам символ "₽". Ну либо вот еще возьмем амперсанд, тут еще больше вариантов. Его можно ввести с клавиатуры, можно вот в виде такой сущности "&", можно вот так "&", можно просто скопировать "&". В общем настало время разложить все по полочкам.


Начнем с того что определимся какие вообще у нас есть варианты ввода символов и дадим им правильные названия:
1️⃣ - Символы которые можно ввести с клавиатуры. Это и есть непосредственно символ (последовательность байтов).
2️⃣ - Символы которые мы просто копируем и можем вставить в текст. Как например этот "₽", но которых нет на клавиатуре. Это то же самое что и в первом пункте, но только этого нет на клавиатуре, это так же непосредственно символ (последовательность байтов).
3️⃣ - Вот такая запись "&" (амперсанд). Это называется спецсимвол HTML.
4️⃣ - Далее идет вот такой вид записи "&" (тоже амперсанд). Это называется HTML сущность.
5️⃣ - И последним пунктом укажу вот такую запись U+0026. Это код символа в юникоде.


Разберем теперь все по порядку.
1️⃣ и 2️⃣ пункты это по сути одно и то же. Когда ты вводишь что то с клавиатуры или просто копируешь и вставляешь символ, то происходит вставка в документ непосредственно символа в его битовом виде (то есть нули и единицы) и эти нули и единицы уже автоматически преобразовываются в соответствующий им символ. Это самый низкоуровневый способ.
3️⃣ пункт - это спецсимволы HTML. По стандарту HTML когда видит "&#" он начинает обрабатывать это как спецсимвол. Это сделано для того что в мире всяких символов очень много (вроде бы около трех миллионов сейчас описано, но это не точно) и все их нельзя поместить на клавиатуру и по этому был придуман такой вот вид записи для HTML. По сути все символы описаны в юникоде (о нем чуть далее) а спецсимволы HTML это просто ссылка на него.
4️⃣ пункт - HTML сущность. Есть целый ряд символов которые используются для управления отображением текста, например угловые скобки обозначают тэги, но иногда нужно вывести эту скобку как текст и при этом не сломать верстку. Для этого и придумали сущности, это по сути укороченный и более понятный вид спецсимвола, который так же ссылается на символ из юникода.
5️⃣ пункт это символ Юникода. Юникод служит не для отображения символов а для их хранения, по сути это просто хранилище символов где все символы пронумерованы, описаны и показаны как примерно они должны выглядеть. Конкретная реализация символа зависит от шрифта, но примерный вид и значение каждого символа есть в юникоде.

⚠️ P.S. снова получился длинный пост, но я старался кратко. В свое оправдание - думаю он правда будет полезным.
Хочу написать серию статей про битовые операции. Это будет первая.

🕸🕸🕸🕸🕸
В вебе данный тип операций не особо распространен, и используется довольно редко. Я однажды использовал, как раз для реализации масок доступа о которых сегодня и напишу. Но знать про них все же наверное нужно, хотябы для развития кругозора и знания всех возможностей языка. А то вдруг на собеседовании спросят, а вы вот прочитаете и ответите).

⚠️🚸
Итак сегодня разберем побитовое И (&) и побитовое ИЛИ (|).
В темные дебри не будем лезть, кратко и по существу, как они работают.💤🌀

1️⃣ - побитовое И. Представим два числа в двоичном виде, и запишем их одно над однм пусть это будут 6 и 4. Теперь под ними запишем третье число в двоичном виде где вставим 1 если оба бита которые находятся друг над другом равны 1 и вставим ноль если хоть один из битов нулевой. Итоговое число перведем в десятичное, и получим 4. Итого 6 & 4 == 4. Тут нужно понимать что битовые операции даже такие как И и ИЛИ это не логические операции и они возвращают число а не булево значение.
1 1 0  =>  6
1 0 0 => 4
1 0 0 => 4

2️⃣ - побитовое ИЛИ. Принцип тот же самый, только тут запишем внизу 1 если хоть один из битов стоящих друг над другом равен 1. Итого получим 6 | 4 == 6
1 1 0  =>  6
1 0 0 => 4
1 1 0 => 6

👹👺🤡🤖
И зачем нам все это надо? Далее смотрим на картинку и пытаемся вникнуть. Например есть у нас разграничение пользователей по возможностям редактировать что либо на сайте. Например редактировать статьи (код доступа 2), комментарии (доступ 4), удалять статьи (доступ 8), удалять комментарии (доступ 16), удалять других пользователей (32). Запишем это все в двоичном виде одно над одним (смотрите картинку). Теперь благодаря побитовым операциям каждому юзеру мы можем выдать маску, которая будет отвечать за его права. Например у юзера будет маска 6. Теперь когда он попытается удалить чей то комент просто выполним 16 & 6. Если результат нулевой, то доступа нет, если не нулевой то доступ есть. В данном случае доступа нет.

🤖 🎃 👾
Далее мы можем комбинировать маски. Например нам нужна маска которая может редактировать статьи и комментарии и удалять статьи, тогда делаем просто 2 | 4 | 8, получаем 14. То есть юзер с маской 14 может все это делать. Проверим 2 & 14, 4 & 14, 8 & 14 все эти операции вернут результат больше 0 значит все эти действия такой маске позволены.
git rm --cached

Что это за команда, что делает, зачем она вообще нужна⁉️

🖊📚📗🗂📎
Разберем такой кейс. У вас есть проект, вы там работаете, комитите что-то, пушите и т.д. И в один момент вам понадобилось чтобы файл README.txt например, перестал отслеживаться гитом. То есть чтобы вы вносили в него правки, но изменению не отображались. Для этого вы добавляете этот файл в .gitignore, но чуда не происходит. Даже несмотря на то что он теперь в игноре, изменения в нем все равно отображаются. Почему так происходит и как сделать чтобы работало так как надо?

⚙️⚙️⚙️⚙️⚙️
Все очень просто. Git устроен так что если какой либо файл уже попал в индекс (то есть уже однажды был закомичен) то он продолжит отслеживать этот файл несмотря на .gitignore. Чтобы исключить его из отслеживания есть 2 пути.

1️⃣ - ну такое. Это костыльный вариант, хотя многие именно так и делают. Нужно удалить файл который вы хотите прекратить отслеживать, затем закомитить его удаление, затем добавить этот файл в .gitignore и уже после этого можете вернуть этот файл обратно и вот после этого он перестанет отслеживаться гитом.

2️⃣ - более правильный и продвинутый метод - это использовать команду git rm --cached. Что делает эта команда - она удаляет файлы переданные ей из индекса. То есть после того как вы сделаете git rm --cached README.txt гит выпилит этот файл из индекса и он будет отображаться как какбудто только что созданный и еще ни разу ни закомиченный. После этого можно уже добавить этот файл в .gitignore и продолжить работу. README.txt больше не отслеживается. Согласитесь что это выглядит намного профессиональнее.

⚠️ P.S. GIT супермощьная штука и крайне важная в командной разработке, его надо знать хорошо. 👨‍🏫
Вторая серия про побитовые операции
Сегодня посмотрим на исключающее ИЛИ (^)

⚠️⚠️⚠️
Суть исключающего ИЛИ в том, что оно дает единицу только в том случае, если только один из операнодов единица.

✍️📝✏️
Давайте рассмотрим на примере 3 ^ 4. Далее смотрим на картинку. Сначала представим тройку и четверку в двоичном виде. Получаем 011 и 100. Затем сравниваем поочереди каждый бит с соответствующим и записываем 1 если только один из сравниваемых битов это единица, в остальных случаях записываем ноль. Получается 111, что будет 7 если перевести в десятичную систему. Итого 3 ^ 4 = 7.

‼️⁉️
У исключающего ИЛИ есть одна интересная особенность. Это полностью обратимая операция. То есть если к результату первого нашего примера еще раз применить исключающее ИЛИ с тем же операндом, то в результате мы получим исходное число. Вот так 7 ^ 4 = 3.

🉐🉐㊙️㊗️
Это как говорят можно применить в простейшей шифрограмме. То есть один человек например перводит текст в числа и делает над ними операцию исключающего ИЛИ с каким то заранее договоренным числом. Затем тот хочет прочитать это, делает еще раз исключающее ИЛИ с этим же числом и получает в результате исходный текст.

🧮📏📐
Вот например я при помощь метода JS charCodeAt() и операнда 5 закодировал некоторую фразу. Кому интересно можете раскодировать ее.
109 96 105 105 106 37 114 106 119 105 97
Минутка абсурда
Или почему в MYSQL кодировка UTF-8 на самом деле не UTF-8

🧭🕰⌛️💰
Этот небольшой материал возможно сохранит вам в будущем пару часов мануалов и гугления. Все дело в том что если вы попытаетесь в MYSQL сохранить эмодзи символы, то скорее всего у вас не получится. Потому что как большинство нормальных людей при создании таблицы вы указали ей кодировку UTF-8. Как известно эмодзи символы состоят из 4 байт в отличии от например букв алфавита, которые состоят из 2 байт. И все бы ничего ведь кодировка UTF-8 поддерживает четырехбайтные символы, но дело в том что в MYSQL кодировка UTF-8 не является таковой, так как по известным только создателям причинам они решили ее урезать и теперь в MYSQL она поддерживает только 3 байта максимум 🤦‍♂️🤦‍♀️🤣. По этому когда вы захотите сохранить четырехбайтную строку типа эмодзи, то получите что то типа:
 Incorrect string value: '\xF0\x9F\x93\x9E \xF0...' for column 'data' at row 1

🚴‍♀️🦿🧠🦽🦼👏
Чтобы решить созданную самими же проблему, была сделана кодировка utf8mb4, которая уже и есть настоящая UTF-8 и поддерживает четырехбайтные строки.

⚠️Если вы планируете хранить в базе смайлики, то указываете кодировку utf8mb4.
Чистый код

⚠️👍Передача логического значения функции — воистину ужасная привычка. Она немедленно усложняет сигнатуру метода, громко провозглашая, что функция выполняет более одной операции.

©️Р. Мартин, «Чистый код»

Наткнулся на статью, озаглавленную вот этой цитатой. И очень удивился почему не обратил на нее внимания при прочтении, цитата то ведь шикарная. И вправду не смог вспомнить случая когда передача булевого значения делала бы что то хорошее. Не долго покопавшись в коде нашел примерчик. И еще раз убедился в правоте. Ведь действительно в коде вызов будет гораздо более читаемым, сравните сами

//getUserId() и getLevelAcces() понятно, а вот что за true!?
getSome(getUserId(), getLevelAcces(), true);

//ну тут все ясно
getSomeAll(getUserId(), getLevelAcces());
Запутываем код еще больше

☝️🧙‍♂️
Наверное в каждом языке есть свои интересные фичи. Когда впервые про них узнаешь они кажутся очень классными и так и хочется их использовать в своем проекте. Сегодня о таких фичах и поговорим. Для примера возьму магические методы в PHP, а конкретно __invoke.

🔨🔧💻🔬🔭
То что хотелось бы донести - это то что в абсолютном большинстве случаем, когда я встречал такие фичи в коде, они были абсолютно не оправданы и только усложняли понимание написанного. Все это можно было бы написать тривиальными методами и это было бы в разы понятнее. Но судя по всему автор увидел интересную фишечку и непременно решил ее использовать, не смотря на то нужна ли она или нет. Могу сравнить это только с тем как забивать гвозди микроскопом. Результат то будет возможно и одинаковый, но блин зачем?

❇️❇️❇️
Вот на первой картинке кусок кода. Понять его не так то просто, не правда ли. Его реализация на второй картинке. А теперь представьте что классов может быть не только One и Two, а например таких классов может быть пять и они разбросаны по всему проекту. И конечно же они не объявляются там где используются, а приходят в виде параметра как на третей картинке. Уверяю вы проведете незабываемое время за разгадыванием того как же работает этот код, и что он вообще делает?

✏️📝🛂🔰
Что хочу сказать, давайте использовать определенные инструменты если они действительно нужны. И всякий раз думать а насколько будет понятен мой код если я использую тот или иной инструмент.
Что то я отстал от геймдева)

👨‍🦯🧙‍♂️👨‍🦳
Причем отстал так не хило, похоже что на целую вечность. А именно - вчера случайно наткнулся на новость что GTA V теперь раздают бесплатно. И больше из любопытства, чем от желания поиграть решил "купить". Интересно же посмотреть на аттракцион невероятной щедрости, да и тут как бы 1500 р. сэкономил)

👀😳
В общем начал скачивать и немного, так скажем, удивился. Весит то игрушка 95G однако. 95 Карл! Это ж вся моя жизнь, и еще плюс 94G. Я конечно давненько не играл, ни во что, может оно конечно так сейчас и принято но блин.

🤧😭😢
Кстати в стиме она до сих пор платная, должно быть обидно тем кто ее реально покупал, соболезную мир жесток.

😡🤬🤯
В общем так я и не поиграл, сначала пришлось сто пятьсот аккаунтов зарегать, привязать, подтвердить, запротоколировать, завизировать блин, а потом еще игра качалась, потом лаунчер, еще какая то хрень. В общем когда запустил просто проверил что работает, но уже не до игры было.

Если еще кому то надо то вот ссылка.
Кодируем картинки

🖼🔛🖥
Способ, как можно сократить количество запросов к серверу, а значит и нагрузку - закодировать картинки в base64. Особенно это эффективно будет если у вас например множество мелких картинок, за каждой из который браузер делает запрос на сервер.

⚠️ Нам нужны будут две вещи - это сама кодировка base64 и специальный протокол Data URL.

Base64 - это кодировка, которая позволяет перевести данные, в том числе и двоичные, в последовательность символов. Такую последовательность в последующем можно передать например по http, например с помощью POST запроса.

Data URL - протокол, позволяющий встроить практически любые данные прямо в документ. То есть относительно нашего примера с картинкой - браузер, встретив Data URL не будет делать запрос на сервер, а просто преобразует его обратно в картинку и отобразит. Data URL имеет вид data:[MIME тип данных][данные в base64]

🖼 🔛 🈵🈴㊙️🉐
Чтобы закодировать картинку в base64 есть много онлайн инструментов, разбирать как это происходит думаю нет смысла.


Вот пример Data URL, его вы можете вставить прямо в адресную строку, можно вставить в атрибут "src" тэга "img" и браузер отобразит эту картинку (конечно если картинка очень большая, то и строка Data URL тоже будет очень длинная):

data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDADIiJSwlHzIsKSw4NTI7S31RS0VFS5ltc1p9tZ++u7Kfr6zI4f/zyNT/16yv+v/9////////wfD/////////////2wBDATU4OEtCS5NRUZP/zq/O////////////////////////////////////////////////////////////////////wAARCAAKAAoDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwCR3aFniic+VkZbGfLz/n/JqwtnblRhd3HXceaLJQbRRgc5z781l1nex1qLk2k7W/E//9k=
This media is not supported in your browser
VIEW IN TELEGRAM
🤷‍♂️🤹‍♂️🎲

Немного развлекательный пост, а то последнее время было слишком много текста.

Вот такая вот забавная игрушка с помощью которой можно взорвать например статейку про винду на Лурке, ну или про кота Шрёдингера на худой конец (статейка кстати более чем годная).

А вот страница приложения чтобы поиграться.
Пароль для wi-fi

Вопрос конечно холиварный, вот например в Ubuntu 19.10 считается что он должен быть не короче 8 символов. Ну ладно, ну пусть при создании и настройки wi-fi будет ограничение в 8 символов, но блин при подключении! Ну правда чем может быть обусловлено данное ограничение? Сегодня попытался подключиться к сети пароль у которой был из 6 символов и не смог. Потому что родное убунтовское диалоговое окошко говорит что пароль должен быть не менее 8 символов. Замкнутый круг. В следующем релизе предлагаю вообще запретить подключение к сетям не прошедшим сертификацию "Wi-fi seSurity consortium" (выдуманная организация, будет проверять сеть на безопасность, политкорректность и COVID-19).
Лично мое мнение в отношении паролей - длинна и набор символов должен быть такой какой хочет пользователь. Если мне хочется пароль из 4 символов, то разрешите мне оставить такой пароль.

P.S. модалка на картинке не оригинальная, взял из интернета, потому как когда оригинальная открыта еще и скриншоты не работают.