PhpMetrics инструмент статического анализа для PHP

Нашел очень интересный инструмент для анализа кода - PhpMetrics.

Мне понравилось легкость его установки и больше количество разных метрик.

Конечно, нельзя приводить свой код к такому виду, чтобы он соответствовал всем этим метрикам. В таком случае вероятно код станет ещё хуже.

Такие инструменты я думаю больше всего подходят Техлидам или Архитекторам. В генерируемых графиках есть такие метрики как Нестабильность и Абстрактность приведенные в книге Роборта Мартина "Чистая Архитектура". Он пишет про эти метрики в Принципе Устойчивых Абстракций. И именно эта метрика мне больше понравилась.

А по цикломатический сложности и по метрике поддерживаемости кода я читал противоречивые мнения и многие критикуют их за не очевидность. В случае с "поддерживаемостью" вы получите какую-то цифру и это не даст понимания вам хорошо это или плохо и что нужно сделать. А цикломатическая сложность может просто показать вам несколько трудно будет покрыть код тестом и все.

Я сам не сторонник метрик. Я думаю, что все таки программирование это такой вид деятельности, где сложно оценить эффективность по каким-то метрикам. А вот как отклонение от рекомендаций думаю вполне можно применять. В таком случае нужно будет выделить основные метрики и смотреть насколько мы от них отклонились.

Про эти и другие метрики можете прочитать в приведенных ниже ссылках.

https://habr.com/ru/post/456150/
https://habr.com/ru/company/intel/blog/106082/

Также можете обратить на другие статические анализаторы для PHP:

  1. Psalm
  2. PHPStan
  3. PHP Depend
Читать дальше >

Ошибка npm Install на Laravel Homestead или Vagrant

При попытке запустить команду "npm install" на чистом Homestead у меня эта операция завершалась ошибкой:

vagrant@foo:~/code$ npm install
npm ERR! path /home/vagrant/code/node_modules/cliui/node_modules/ansi-regex/package.json.3499778098
npm ERR! code ENOENT
npm ERR! errno -2
npm ERR! syscall open
npm ERR! enoent ENOENT: no such file or directory, open '/home/vagrant/code/node_modules/cliui/node_modules/ansi-regex/package.json.3499778098'
npm ERR! enoent This is related to npm not being able to find a file.
npm ERR! enoent

npm ERR! A complete log of this run can be found in:
npm ERR! /home/vagrant/.npm/_logs/2019-07-15T14_34_13_985Z-debug.log
Читать дальше >

Принципы 5S

В 1951 году в японской промышленности появилась методология повышения качества, называвшаяся TPM (Total Productive Maintenance). Она была ориентирована прежде всего на сопровождение , а не на производство. Доктрина TPM базировалась на так называемых "принципах 5S".

Философия 5S состоит из следующих концепций:

- Сэйри. или организация. Абсолютно необходимо знать, где что находится и в этом помогают такие методы, как грамотный выбор имен.

- Сэйтон, или аккуратность. Фрагмент кода должен находиться там, где читатель ожидает его найти.

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

- Сэйкэцу, или стандартизация. Группа достигает согласия по поводу того, как поддерживать чистоту на рабочем месте.

- Сюцукэ, или дисциплина. Программит должен быть достаточно дисциплинированным, чтобы следовать правилам. Он должен часто размышлять о своей работе и быть готовым к изменениям.

Читать дальше >

Начало работы с DigitalOcean

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

Небольшая предыстория. Полтора года назад для небольшого проекта мне нужно было выбрать хостинг. Обычные хостинги нам не подходили и я начал искать VPS. Присматривался к украинским, знакомые админы советовали Hetzner. Довольно часто я читал статьи DigitalOcean и отзывы довольно хорошие были, поэтому решил попробовать. Взяли самый минимальный вариант: 5$ в месяц - 1 ядро, 512Мб памяти, 20Гб SSD диска. Изначально проект не должен был быть нагруженным :) В базе было 40 млн записей и весил 14 Гб, обновляться база будет крайне редко и основное чтение. Часто запрашиваемые данные собрал в отдельную таблицу, чтобы не приходилось джойнить кучу таблиц при запросе. Запустили. Через 2 недели в сутки начало посещать 100-120 тыс. Сервер уже еле тужился, но 1500 посетителей одновременно мог держать, конечно людей было наверное и больше и процент отказов при 1500 было больше. Решили перейти на 20$ в месяц. У DigitalOcean это очень удобно сделано. Даунтайм был 1-2 минуты и у нас был уже сервак с двумы процами и 2 Gb памятю, но без увеличения диска. Потому-что если увеличить диск, то потом обратно откатиться на предыдущий тариф не получится и при увеличении диска даунтайм будет больше. Такое удобство мне очень понравилось. Поэтому и в этот раз решил поднять проект на этом сервисе, а в голове оказалось уже ничего не осталось и приходится заново читать все.

Читать дальше >

Если вы случайно поменяли права на директорию /etc и её содержимое.

Как я исправил обратно не помню, но помню что гуглил и менял обратно права. Но лучше советовали переустановить систему, если вам это не накладно.

Мне было лень переустанавливать и поэтому погуглив нашел пару инструкций выполнив которые я надеялся что вернул все на свои места.

Но вот вчера обнаружил, что не могу подключиться к PostgreSQL. Параллельно заметил, что у меня есть зависшие Vagrant. Я их не смог выгружить через vagrant destroy. Там было много ошибок и я думал, что это как-то связано. Но потом подумал, что возможно эта проблема никак не относится к Постргесс. Возможно это из-за того, что я установил новый виртуалбокс пока вагрант был запущен и тепер я не могу нормально удалить вагрант.

Есть такая команда 

pg_lsclusters

Она показывает рабочие кластеры. Запустил эту команду, а так путь к логу. Открыл лог и вижу такую ошибку:

Fix postgresql error FATAL: could not access private key file "/etc/ssl/private/ssl-cert-snakeoil.key": Permission denied

Не сразу до меня дошло, что это из-за моей случайной опечатки в прошлом, когда я сменил права на директорию /etc/

Нашел решение тоже в гугле: https://gist.github.com/GabLeRoux/0c60f9be0c28b6b41f64cb55474b0ccb#file-fix-ssl-cert-snakeoil-key-ubuntu-postgresql-sh-L5

 

# > It happened to me and it turned out that I removed erroneously the postgres user from "ssl-cert" group, set it back with
gpasswd -a postgres ssl-cert

# Fixed ownership and mode
sudo chown root:ssl-cert  /etc/ssl/private/ssl-cert-snakeoil.key
sudo chmod 740 /etc/ssl/private/ssl-cert-snakeoil.key

# now postgresql starts! (and install command doesn't fail anymore)
sudo /etc/init.d/postgresql start
Читать дальше >

Алгоритм Дейкстры

Алгоритм Дейкстры - алгоритм на графах, изобретённый нидерландским учёным Эдсгером Дейкстрой в 1959 году. Находит кратчайшие пути от одной из вершин графа до всех остальных. 

Если поиск в ширину позволяет найти путь с минимальным количеством пересадок из точки А в точку В, то алгоритм Дейкстры позволяет найти самый быстрый путь из точки А в точку В. 

Когда работаете с алгоритмом Дейкстры, с каждым ребром графа связывается число, называемое весом. Алгоритм Дейкстры работает с взвешенным графом и только с направленными ациклическими графами, которые нередко обозначаются сокращением DAG (Directed Acyclic Graph). Таким образом граф должен быть взвешенным, направленным и без циклов. 

Граф с весами называется взвешенным графом.

Читать дальше >

Графы: поиск в ширину (BFS, Breadth-First Search)

Граф — абстрактный математический объект, представляющий собой множество вершин графа и набор рёбер, то есть соединений между парами вершин.

Такое определение у графа в википедии. Простыми словами это набор точек и линий которые связывают точки. Граф моделирует набор связей между разными объектами и каждый граф состоит из узлов и ребер. Узел может быть напрямую соединен с несколькими другими узлами. Эти узлы называются соседями.

Поиск в ширину позволяет найти кратчайшее рассторяние между двумя объектами. Кратчайший в данном случае это количество шагов, состояний или изменений.

Например, с помощью поиска в ширину можно:

- написать программу для игры в шашки, которая вычисляет кратчайший путь к победе;

- реализовать проверку правописания (минимальное количество изменений, чтобы поправить ошибку);

- найти ближайшего врача;

- добраться до определенного места минимальным количеством пересадок;

 

Читать дальше >

Алгоритмы сортировки

Алгоритмы сортировки упорядочивают элементы по определённому критерию.

Сортировка вставками

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

В первой итерации внешнего цикла будет только один цикл внутреннего, во втором цикле будет 2 внутренних цикла т.е с ростом количества циклов растет и количество внутреннего цикла.

Временная сложность алгоритма — O(n2)

Читать дальше >

Бинарный поиск

Бинарный поиск - это алгоритм, который на входе получает отсортированный список элеменитов. Если элемент, который вы ищете, присутствует в списке,
то бинарный поиск возвращает ту позицию, в которой он был найден. В противном случае бинарный поиск возвращает null. При бинарном поиске каждый раз исключается половина элементов.

Читать дальше >

Оценка сложности алгоритмов

Как оценить насколько быстрая написанная нами программа? Как оценить скорость программы?

Измерить временной шкалой? Минуты, секунды и милисекунды? Но в таком случае одна и та же программа на разных компьютерах будет показывать разные результаты.

Мы можем считать количество операций. И тогда наши показатели не будут зависеть от машины, где запускается программа.

Представим сложность алгоритма как некую зависимость от количества входных данных - n. Тогда мы можем записать примерные виды сложности алгоритмов:

534*n3 + 16*n2 + 256

2n4 + 10

Какой из этих алгоритмов быстрее работает?

Для оценки мы берем только наихудщие случаи с точностью до коэффициента. Представим что n стремится к большому числу. В таком случает понятно, что константы не играют болшой роли. И в практике оценки алгоритма принято брать только худшие слагаемые. Худшие имеются ввиду те, что быстрее всех растет. Если входные данные небольшие, то они быстро работают при любых алгоритмах и нет необходимости. Таким образом мы приходим к таким упрощениям:

n3

n4

 Видно, что второй алгоритм дольше работает чем первый. Конечно, это все теоретически. В теории мы берем максимально большие числа. А на практике нужно исходить от тех исходных данных которые есть или которые могут быть.

Читать дальше >