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

Админ @LimboFog
Download Telegram
Очень удобная штука, позволяет сделать в проекте иконки в виде шрифтов. Как например Glyphicon в Бутстрапе.
Но при этом не нужно будет подключать ни какие библиотеки.

1️⃣ На сайте icomoon.io создаем новое приложение.
2️⃣ Выбираем нужные иконки, нажимаем создать шрифт и скачиваем все что получилось.
3️⃣ То что скачалось разархивируем в папку с проектом.
4️⃣ И того из того что скачается нам нужен только файл style.css там лежат необходимые стили и содержимое папки fonts, там непосредственно шрифты.
5️⃣ У меня в тестовом проекте только индексный файл, по этому все что нужно сделать - это подключить к нему скачанный файл style.css.
6️⃣ Затем добавим в индексный файл простые дивы с классами указанными в style.css.
7️⃣ Вот и все, смотрим, что у нас получилось.

icomoon.io
Небольшая задачка по PHP

========================================
Правильный ответ - "что то третее"

Почему? Потому что как и везде для каждого скалярного типа данных в PHP предусмотрена определенная длинна. Например для типа int она будет равна либо 32 либо 64 бита, в зависимости от вашей системы. У меня например на убунте это 64 бита то есть 9 223 372 036 854 775 807, в 32 разрядной винде это будет 2 147 483 647.

То есть получается что когда строку '99999999999999999999999999999999999' мы приводим к integer то максимум что мы туда можем записать - это 9 223 372 036 854 775 807 (в моем случае)
Надо быть осторожным с функцией CONCAT в MYSQL

Потому что она имеет один неочевидный момент в своем поведении. Если хоть один из аргументов переданных ей NULL то весь результат будет также NULL

Вот пример. Есть у нас такая таблица с customers
+----+-—-------+----—-----+
| id | name | deposit |
+----+--—------+-----—----+
| 1 | misha | 500 |
| 2 | sveta | 700 |
| 3 | oleg | 234 |
| 4 | inga | NULL |
+----+----——--+--—------+

И хотим мы вывести в красивом виде пользователей с их депозитами. Для этого написали такой вот запрос

select 
concat(name, ' - ', deposit, 'RUB')
from customers;

Но результат окажется не совсем тот который нужен.
+----------------------------————--------+
| concat(name, ' - ', deposit, 'RUB') |
+--------------------------————----------+
| misha - 500RUB |
| sveta - 700RUB |
| oleg - 234RUB |
| NULL |
+---------------------------————---------+

Строка с покупателем inga отобразилась как NULL.
Чтобы этого избежать нужно в функцию добавить условие, проверки значения на NULL

select 
concat(name, ' - ',
if (deposit is null, 0, deposit), 'RUB')
from customers;

Вот теперь все в порядке, получили то что и ожидалось.
+-----------------------------+
| concat |
+-----------------------------+
| misha - 500RUB |
| sveta - 700RUB |
| oleg - 234RUB |
| inga - 0RUB |
+-----------------------------+
Представления чисел в PHP

⁉️ Все привыкли к представлению чисел во всех ЯП в десятичном формате, это практично и удобно, но не нужно забывать что числа можно предствить не только в этом формате. Хоть этим и редко пользуются, но все же знать это все таки нужно.

❗️❗️❗️Сейчас будет немного теории, после которой вы сможете пройти тесть по данному материалу.

Итак - представления чисел в PHP

1️⃣ - Всем известный десятичный формат. Тут думаю не стоит ни чего объяснять, все его прекрасно знают
 $decimal = 385 

2️⃣ - Двоичный формат. Позволяет записать число в виде нулей и единиц. Для того чтобы сообщить интерпретатору что далее пойдет двоичная запись числа служит префикс 0b
 $binary = 0b100101

3️⃣ - Восьмеричный формат. Использует числа от 0 до 8. Для идентификации того что далее идет число в восьмеричном формате перед числом ставится ведущий ноль.
 $octal = 0375

4️⃣ - Шестнадцатеричный. Число записывается в шестнадцатеричной системе. Идентифицируется по префиксу 0x
 $hex = 0xAB4
🎲 Тест «Представление чисел в PHP»
Небольшой тест который легко можно пройти ознакомившись с постом выше. В каждом вопросе в левом верхнем углу будет подсказка-объяснение ответа. Можно на нее кликнуть и прочитать.
🖊 5 вопросов · 1 мин
Раскрашиваем console.log 🎨🤹‍♂️

🖥⁉️Иногда полезно бывает вывести в консоль текст другого цвета, или подчеркнутый, или большие буквы. И это довольно легко сделать.

👏 Для форматирования текста используется специальная директива "%с". Текст который будет идти после нее отформатинуется в соответствии с CSS стилями переданными во втором параметре в console.log()

Итого для форматирования текста нужно всего две вещи:
1️⃣ - Указать перед текстом директиву "%c"
2️⃣- Вторым параметром передать CSS стили для форматирования.

Вот как это выглядит:

console.log('%cБольшие красные буквы', 'color: red; font-size: 25px;')

console.log('%cБольшие красные буквы на желтом фоне', 'color: red; font-size: 25px; background: yellow;')

console.log('%cБольшие красные буквы в рамке', 'color: red; font-size: 25px; border: 2px solid #fff;')

console.log('%cБольшие зеленые буквы в рамке', 'color: green; padding: 10px; font-size: 25px; border: 2px solid #fff;')

console.log('%cБольшие красные буквы в рамке', 'color: red; font-size:
Нужен ли "идеальный" код

Недавно закончил работу над одним личным проектом, который натолкнул меня на размышления на эту тему. Начиналось все собственно как обычно с большим энтузиазмом и рвением и твердой решимостью написать код как по книгам - соблюдая все лучшие практики, изолируя все что можно, вынося все зависимости. Если хоть немного класс не соответствовал SOLID он переписывался, если логика хоть немного становилась путанной то все опять же переписывалось.

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

Попробую проанализировать почему так вышло.
1 - Это то, что проект был новый для меня, такого раньше никогда не делал, и было невозможно продумать заранее все подводные камни. В итоге часто получалось так, что после долгого обдумывания и планирования приступив к работе, сталкивался с какой нибудь проблемой, которая не позволял использовать данное решение и все приходилось начинать заново. Избежать этого помогло бы создание прототипа. То есть простого на коленке собраного приложения без всяких заморочек с кодом и оптимизацией. Его цель была бы лишь в том чтобы понять каков должен быть конечный вид продукта.

2 - Угасание энтузиазма. С каждой неудачей и переписыванием кода, энтузиазма становилось все меньше и меньше, и то что начиналось с горящими глазами в конце превратилось в рутину. До конца проект так и не удалось реализовать. Хоть до какой то осмысленной стадии его довести получилось только приложив массу усилий. Как можно решить эту проблему, опять же нужно выделять главное и реализовывать это частями. Если вы пишете какой то по вашему мнению очень крутой код постоянно его правите, думаете, переписываете, снова думаете, снова переписываете. То очень велика вероятность, что вы не знаете что делаете. И в этом случае очень велика вероятность что энтузиазма не хватит до финишной прямой и проект так и останется серединка-на-половинку.

Какой вывод в целом можно сделать? То что идеальный код - это конечно хорошо, но только когда вы точно знаете что делаете. Ели что то делаете впервые, лучше сперва создать прототип, понять что действительно нужно, как это должно работать и уже после этого переписать все это, но уже хорошо.

И еще один момент - работающий через задницу прототип будет лучше чем неработающий вовсе "крутой проект"

P.S. это всего лишь небольшие размышления и естественно все не так однозначно и стопроцентно. Но здравое зерно в них точно есть.

P.P.S. ты просто мегакрут если смог осилить это до конца!
Стреляю себе в ногу 🎯🏹

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

👨‍🏫🙇‍♂️🚴‍♀️Итак начнем с первой картинки. Там 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