Принципы 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

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

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

7 правил изучения английского языка от A.J. Hoge

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

 

Правило №1: Изучайте английские фразы, а не отдельные слова.

В чем сила фраз?

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

2. Когда вы изучаете фразу вы изучаете еще и грамматику.

Например, John hates icecream. - Тут мы уже используем s в конце для третьего лица. Когда вы используете фразы постепенно грамматика непроизвольным образом откладывается в голове. С другой стороны, если будете изучать только отдельные слова, то грамматику вам нужно будет еще вспоминать и держать в голове, потому-что грамматические правила не применяются к отдельным словам.

 

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

Конспект про паттерны проектирования

Автором данных картинок и описаний я не являюсь. Решил коротко для себя собрать часто используемые паттерны тут. Для более глубокого изучения обращайтесь к оригинальному ресурсу https://refactoring.guru

Стратегия

Очень часто используемый паттерн. Его можно везде встретить. Например, Абстрактная фабрика, Фабричный метод основываются на паттерне стратегия.

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

Применимость

  • Когда вам нужно использовать разные вариации какого-то алгоритма внутри одного объекта.
  • Когда у вас есть множество похожих классов, отличающихся только некоторым поведением.
  • Когда вы не хотите обнажать детали реализации алгоритмов для других классов.
Читать дальше >