Впечатления о книге — 7 навыков высокоэффективных людей Стивена Кови

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

Проблемы книги (лично для автора статьи)

  1. Сами 7 навыков сложно сформулировать кратко и емко, так чтобы обращаться к их формулировкам постоянно. 
  2. Книга читается легко, в ней хорошие примеры, но это мало помогает для себя обобщить эти 7 навыков. Даже по прочтении книги 2 раза и по прошествии нескольких недель, непросто сформулировать для себя эти навыки. Хотя, может это задумка автора, и для полного понимания навыков, необходимо провести некоторую «домашнюю работу» с выписыванием ключевых идей для себя отдельно
  3. Книга была написана очень давно (1989), хотя, автор утверждает, что с течением времени 7 приводимых навыков стали еще более актуальными. Тем не менее, ощущается некий налет «ретро» в том, как доносится информация

Почему книгу стоит прочитать

  1. Это общепризнанный кладезь знаний/инсайтов/мыслей/триггеров. Она поможет ответить на сложные социально-психологические вопросы, которые вы, может даже и сформулировать не решались.
  2. По прочтении книги, становится понятно от куда корни терминов, которыми оперируют хорошие менеджеры. Например, тот же, квадрант Эйзенхауэра (срочно-важно), правило Парето (20/80), принцип «Выиграл/выиграл», понятие «проактивности» и многие другие. Т.е. позволит говорить с людьми, достигших значительных успехов в само-развитии, на одном языке.
  3. Может помочь задать направлении дальнейшего развития личности (вряд ли это будет первая книга, которая это сделает, но может быть лучшей или же помочь, на одном из «перекрестков развития»)

Для себя, я отметил следующие положения по каждому из 7 навыков:

Навык 1: Будьте проактивны

  • В отличии от обычного, реактивного подхода, проактивный не становится реакцией на раздражители (обстоятельства или случайные события), а ведет по собственному пути, создавай благоприятные обстоятельства. Другими словами, наше поведение зависит от наших решений, а не от нашего окружения.
  • Одно из проявлений проактивности — эффект самореализующихся предсказаний. Если, например, думать, что ваш подопечный неумелый работник, то он таким и будет. Если же к нему относится как к талантливому и перспективному, то таковым он и станет.
  • Конечно, это не так просто сделать. Нужно понимать, что, чтобы изменить что-то, нужно начать с себя. А для того чтобы поменяться, нужно, прежде всего, поменять свое восприятие. 
  • Тут же, скрывается еще одна ловушка. Мы видим мир не таким каков он есть, а таким, каким мы настроены его видеть. Другими словами мы пропускаем все через призму своего жизненного опыта, через наши представления и парадигмы. И стоит другим разойтись с нами во мнении, мы поспешно приходим к выводу, что не правы именно они. Тут так же на помощь придет пересмотр собственного восприятия
  • Взаимозависимость, как следующая ступень эволюции человеческих отношений, после зависимости и независимости, говорит о том, что даже у зрелой личности возможности и восприятие ограниченные, и вместе можно такое, что не доступно одному. Путь к взаимозависимость — это результат овладения всеми 7ю навыками.

Навык 2: Начинайте представлять конечную цель

  • Смысл навыка заключается в том, чтобы уже сейчас начать формировать свое представление образа, картины или парадигмы конечных целей вашей жизни. Составить систему оценок и критериев по которым будет оцениваться все остальное.
  • В продолжении предыдущего пункта, лидерство — это формирование направления развития и задач компании или группы, установление продуктивных, теплых, доверительных отношений внутри коллектива или семьи. Эти лидерство отличается от управления, которое подразумевает только следованию уже установлены правилам, контроль и решение сиюминутных трудностей
  • В личном плане, основой второго навыка будет составление и следование положениям личной миссии — способу фокусироваться на том, каким вы хотите быть и что вы хотите делать, а так же ценности и принципы, которые будут лежать в основе вашего характера и поступков
  • Помещая в центр нашей жизни верные принципы, вы создаете прочную основу для развития жизне-обеспечивающих факторов: внутренняя безопасности, планирование, мудрость и личная власть
  • Личная миссия семьи (или организации) — фундаментальная основа, конституция семьи, нормы и критерии для вынесения суждений и принятия решений, которые способствуют ее единению и долгому существованию
  • Без вовлечения в процесс формирования личной миссии семьи или организации нету и приверженности, это необходимо учитывать при формировании личной миссии

Навык 3: Сначала делайте то, что необходимо делать сначала

  • В основе третьего навыка лежат принципы персонального управления. Лидерство определяет что нужно делать сначала, а управление помогает выполнять это
  • Для понимания, что нужно делать сначала, нужно понять матрицу управления временем (квадрант Эйзенхауэра)
  • Важные несрочные дела требуют от нас большей инициативы, большей проактивности, при этом они создают новые возможности. Когда выполняются такие дела, наша эффективность совершает огромный скачок
  • Фокусировка на важных несрочных делах приводит к тому, что количество кризисов и проблем (которые идут из квадранта 1 — срочные-важные) сокращается до разумного предела, так как вы планируете будущее и предпринимаете шаги, предотвращающие развитие кризисных ситуаций. 
  • Так работает принцип Парето: 80 процентов результатов проистекает из 20 процентов усилий
  • Метод недельного планирования (в отличии от метода дневного планирования) наделяет свободой и гибкостью, необходимой для того, чтобы справляться с непредвиденными обстоятельствами, в том числе

Навык 4: Думайте в духе «Выиграл/Выиграл»

  • Подход «Выиграл/Выиграл» направлен на постоянный поиск взаимной выгоды при любых взаимодействиях людей между собой. Другими словами, все договоренности и решения обоюдно выгодны и полностью удовлетворяют обе стороны.
  • Хоть философия «Выиграл/Выиграл» чаще всего является наиболее выигрышной, однако при различных обстоятельствах, другие стратегии взаимодействий, такие как «Выиграл/Проиграл», «Проиграл/Выиграл», «Проиграл/Проиграл» и «Выиграл» могут быть предпочтительнее

Навык 5: Сначала стремитесь понять, а потом — быть понятым

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

Навык 6: Достигайте синергии

  • Сочетание значительного эмоционального банковского счета, мышления в духе «Выиграл/Выиграл» и стремление прежде понять партнера формируют идеальные условия для синергичного взаимодействия
  • Суть синергии заключается в умении ценить различия между людьми: различия в менталитете, в эмоциональной сфере, в психологическом плане. А ключ к тому, чтобы ценить различия, содержится в понимании, что мир вокруг нас устроен не таким образом, каков он есть, а таким каковы мы сами

Навык 7: Затачивайте пилу

  • Данный навык говорит о том, что нужно развивать самый главный ресурс — нас самих. Необходимо обновляться в 4х измерениях равномерно: физическом, духовном, интеллектуальном и социально-эмоциональном
  • Каждое из измерений очень важно само по себе, однако наиболее эффективным процесс становится только тогда, когда он разумно сбалансирован
  • При этом, при правильном развитии одного или нескольких измерений естественным образом подтягивает другие измерения
  • Навык 7 относится не только к личности, но и организациям

Jenkins — git — собираем проект из приватного репозитория

Генерируем на целевом сервере SSH ключ

Чтобы Jenkins на нашем сервере смог получить доступ к коду из репозитория — необходимо сгенерировать приватный и публичный ключ и раздать их в соответствии с назначением.
Для генерации ключей, в терминате (консоли) сервера вводим команду

$ ssh-keygen

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

Generating public/private rsa key pair.
Enter file in which to save the key (/Users/user01/.ssh/id_rsa):

Рекомендуется выбирать дефолтный путь — жмем Enter, но вы можете и поменять путь.

Далее система попросит ввести passphrase. Для простоты можем оставить это поле пустым, как и следующее (подтверждающее ввод)

Enter passphrase (empty for no passphrase):
Enter same passphrase again:

Успешная генерация ключа сопровождается следующим выводом в консоли

Your identification has been saved in /Users/emmap1/.ssh/id_rsa.
Your public key has been saved in /Users/emmap1/.ssh/id_rsa.pub.
The key fingerprint is:
4c:80:61:2c:00:3f:9d:dc:08:41:2e:c0:cf:b9:17:69 emmap1@myhost.local
The key’s randomart image is:
+—[ RSA 2048]—-+
|*o+ooo.          |
|.+.=o+ .         |
|. *.* o .        |
| . = E o         |
|    o . S        |
|   . .           |
|     .           |
|                 |
|                 |
+——————+

Выведем сгенерированные файлы списком на экран

$ ls ~/.ssh
id_rsa id_rsa.pub

Выводится 2 файла:

id_rsa — приватный ключ, который понадобится нам для генерациия пользователя аутентификации в репозитории на cтороне Jenkins

id_rsa.pub — публичный ключ, который необходимо разместить в разделе access keys целевого репозитория

Добавляем публичный ключ в разделе ключей приватного репозитория

Например, в Bitbucket, публичный ключ можно добавить в разделе
Repository settingsAccess keysAdd key (настройки конкретного репозитория)

Добавляем приватный ключ в Jenkins

Заходим в раздел Управления Ключами (JenkinsManage JenkinsManage Credentials)

И добавляем приватный ключ (содержимое файла id_rsa.pub) в поле Private key, как проиллюстрировано ниже

Заполняем поле Username — имя для пользователя. Сохраняем.

Осталось подключится к репозиторию.

Перейдем в настройки ранее созданного проекта в Jenkins.

Source Code Management — выбираем Git (1)

Repositories — вставляем ссылку на репозиторий (2) и из выпадающего списка выбираем нашего только что созданного пользователя с приватным ключом (3)

Branches to build — обычно указывают мастер ветку — */master (4)

Сохраняем проект в Jenkins.

Теперь мы готовы собрать проект из приватного репозитория.

Установка Redis на MacOS, Debian, Ubuntu, Centos

MacOS (Catalina)

(Если вам необходимо установить Redis на Mac c процессором семейства M — есть отдельная инструкция)

Открываем терминал (Terminal.app) и обновляем локальные пакеты:

> brew update

Устанавливаем Редис одной командой

> brew install redis

В процессе успешной установки увидим подобные сообщения:

$ brew install redis
==> Downloading https://homebrew.bintray.com/bottles/redis-5.0.6.catalina.bottle
==> Downloading from https://akamai.bintray.com/8a/8ae4fed5494daa20391ab16d4be0b
################################################################## 100.0%
==> Pouring redis-5.0.6.catalina.bottle.tar.gz
==> Caveats
To have launchd start redis now and restart at login:
brew services start redis
Or, if you don’t want/need a background service you can just run:
redis-server /usr/local/etc/redis.conf
==> Summary
/usr/local/Cellar/redis/5.0.6: 13 files, 3.1MB

Redis успешно установлен. Запустим процесс, чтобы он работал в бекграунде:

> brew services start redis

В случае успешного запуска увидим подобное сообщение:

==> Successfully started redis (label: homebrew.mxcl.redis)

Это все. Процесс установки и запуска завершен.
Проверим работоспособность запущенного редис-сервиса

redis-cli ping

Если видим вывод “PONG” значит все прошло успешно и редис готов к работе.

Linux (Debian, Ubuntu)

Открывает терминал, переходим в домашнюю папку для скачивания архива с Редисом:

$ cd ~/

Скачиваем архив с установочными файлами Redis (последняя стабильная версия):

$ curl -s -o redis-stable.tar.gz "http://download.redis.io/redis-stable.tar.gz"

Далее выполняем команды под рутом — командой получаем права:

$ sudo su

Создаем необходимую папку (флаг -p означает, что создаем ее только в случае если ее нету)

# mkdir -p /usr/local/lib/

И назначаем права

# chmod a+w /usr/local/lib/

Разархивирует в нее архив с файлами Редис:

# tar -C /usr/local/lib/ -xzf redis-stable.tar.gz

Удаляем файл архива — он нам больше не нужен

# rm redis-stable.tar.gz

Переходим в папку с файлами Редиса

# cd /usr/local/lib/redis-stable/

И устанавливаем его (так как это установочные файлы написанные на языке C)

# make && make install

Проверим уставлен ли Редис, выведя его версию

# redis-cli --version

Далее, как рекомендуется в официальной документации, запускаем скрипт конфигурирования. Перейдем в его папку

# cd /usr/local/lib/redis-stable/utils/

И запускаем его

# sh install_server.sh

В процессе работы скрипт будет задавать вопросы (например, на каком порте будет работать Редис сервер). Вполне достаточно оставлять ответы по умолчанию — жмем все время Enter.
В результате скрипт настроит редис, соберет конфигурации, сформирует и добавит сервис в автозагрузку
После этого можно запустить Редис командой

# service redis_6379 start

Linux (CentOS)

Открывает терминал, обновляем установленные пакеты (для некоторых версий может быть важно)

$ sudo yum -y update

Убеждаемся, что необходимые для установки Редис пакеты и утилиты установлены

$ sudo yum -y install scl-utils
$ sudo yum -y install centos-release-scl devtoolset-7 llvm-toolset-7
$ sudo scl enable devtoolset-7 llvm-toolset-7 bash
$ sudo yum -y install gcc gcc-c++ make

Переходим в домашнюю папку для скачивания архива с Редисом:

$ cd ~/

Скачиваем архив с установочными файлами Redis:

$ curl -s -o redis-stable.tar.gz "http://download.redis.io/redis-stable.tar.gz"

Далее выполняем команды под рутом — командой получаем права:

$ sudo su

Создаем необходимую папку (флаг -p означает, что создаем ее только в случае если ее нету)

# mkdir -p /usr/local/lib/

И назначаем права

# chmod a+w /usr/local/lib/

Разархивирует в нее архив с файлами Редис:

# tar -C /usr/local/lib/ -xzf redis-stable.tar.gz

Удаляем файл архива — он нам больше не нужен

# rm redis-stable.tar.gz

Переходим в папку с файлами Редиса

# cd /usr/local/lib/redis-stable/

И устанавливаем его (так как это установочные файлы написанные на языке C)

# make && make install

Проверим уставлен ли Редис, выведя его версию

# redis-cli --version

Если, при этом, будет выведено сообщение об ошибке “command not found” — необходимо добавить /usr/local/bin в переменную среды PATH таким образом

# export PATH="$PATH:/usr/local/bin"

И вновь проверить успешно ли установлен Редис, как описано выше
Далее, как рекомендуется в официальной документации, запускаем скрипт конфигурирования. Перейдем в его папку

# cd /usr/local/lib/redis-stable/utils/

И запускаем его

# sh install_server.sh

Если в процессе будет выведена ошибка ”… This system seems to use systemd. Please take a look at the provided example service unit files in this directory, and adapt and install them. Sorry! “ — необходимо внести небольшое изменение в скрипт установки install_server.sh:

# nano install_server.sh

Закомментировать следующие строки

# bail if this system is managed by systemd
# _pid_1_exe=»$(readlink -f /proc/1/exe)»
# if [ «${_pid_1_exe##*/}» = systemd ]
# then
# echo «This systems seems to use systemd.»
# echo «Please take a look at the provided example service unit files in this directory, and adapt and install them. Sorry!»
# exit 1
# fi
# unset _pid_1_exe

Сохранить файл и запустить его.
В процессе работы скрипт будет задавать вопросы (например, на каком порте будет работать Редис сервер). Вполне достаточно оставлять ответы по умолчанию — жмем все время Enter.
В результате скрипт настроит редис, сформирует конфигурации, сформирует и добавить сервис в автозагрузку
Проверим работу сервера
При этом сам сервис Редеем запускается командой

$ redis-cli

127.0.0.1:6379> ping
PONG

$ service redis_6379 start

Nginx basic auth — аутентификация для сайта или папки сайта на Linux

Иногда возникает желание поставить аутентификацию (запаролить) сайт или же папку на сайте.

Например:

  • Для области администрирования
  • Проводятся работы по разработке и рано открывать область или функционал широкому кругу пользователей
  • Область, предназначенная только для разработки
  • Необходимо закрыть от индексирования (не через специальные файлы, а совсем)
  • Есть желание предоставлять доступ к области только для ограниченного круга лиц
  • Другие причины

Генерация аутентификационного файла

Такого рода аутентификация называется Basic auth (или Http auth), подразумевает ввод логина и пароля и выглядит следующим образом

При этом, если логин и пароль не введен или введен не верно — выдает 401ю ошибку

Обычно, файл, в котором хранятся логин и зашифрованный пароль, находится по пути:

/etc/nginx/.htpasswd

Проверим, существует ли уже такой файл

$ sudo su
# cat /etc/nginx/.htpasswd

И если он не существует, создадим такой файл с пользователем user01

# htpasswd -c /etc/nginx/.htpasswd user01

Система предложит 2 раза ввести пароль, который мы заранее подготовили и сохранили. Именно этот логин (user01) и пароль будут использованы для аутентификации

Если же файл .htpasswd существует, можно добавить пользователя таким образом

# htpasswd -c /etc/nginx/.htpasswd user02

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

Если введенные пользователь (user02) уже существует — таким образом, мы просто поменяем ему пароль…

Конфигурирование Nginx

Следующий шаг — внедрение аутентификации в конфигурацию сайта Nginx. При этом, можно закрыть как весь сайт, расположив строчки:

auth_basic "Restricted area";
auth_basic_user_file /etc/nginx/.htpasswd

На уровне server:

server {
    .…
    auth_basic "Restricted area";
    auth_basic_user_file /etc/nginx/.htpasswd
    ….
}

Так и на уровне какой то области (папки), в примере ниже в зоне «admin»:

server {
    .…
    location /admin {
        ….
        auth_basic "Restricted area";
        auth_basic_user_file /etc/nginx/.htpasswd
        ….
    }
    ….
}


После добавления в конфигурацию сайте — не забываем перезагрузить nginx.

Исключения для определенных IP

Бонусом, есть возможность добавить какие то айпишники в «белый список», чтобы для них не запрашивалась аутентификация, а для остальных — запрашивались логин и пароль. Делается это следующим образом:

{
    …
    satisfy any;
    allow 11.22.33.44; # whitelisted IP 1
    allow 22.33.44.55; # whitelisted IP 2
    …
    deny all;
    auth_basic "Restricted area";
    auth_basic_user_file /etc/nginx/.htpasswd;
    …
}

Инвестиционный дивидендный калькулятор на Python

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

Ниже приведено несколько скриншотов

Реальный работающий пример на хостинге можно найти по адресу

https://invest.questpro.club/dividends-calculator

Калькулятор хостится на Digital Ocean, сервер на Centos 7, Python + Dash фреймворк для визуализации.

С данным реальным примером, можно начать увлекательное путешествие в мир финансовой грамотности, попутно, ознакомившись с языком Питон, который идеально подходит под задачи автоматизации математических вычислений, а так же фреймворком Даш (на основе более известного фреймворка Flask c элементами ReactJS, но это все под капотом)

Принцип работ инвестиций в дивидендные акции

Один из самых интересных и надежных способов получать пассивный доход — это инвестиции в надежные дивидендные акции. 

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

Далее, эти растущие дивиденды ре-инвестируются, что увеличивает регулярные пополнения. Машина раскручивается, и капитал растет. 

Все это происходит по экспоненте, как можно убедиться после использования данного калькулятора.

Установка окружения для нашего проекта и размещение на хостинге, публикация.

Подразумевается, что хостинг приобретен, операционная система установлена, веб сервер настроен (или же вы работаете на локальном компьютере на Mac или Linux)

Устанавливаем Python, Dash

> sudo su
# yum -y install python3
# python3 —version
# yum -y install python3-devel

Ранее была создана директория под наш проект (/var/www/invests/). Переходим к ней

# cd /var/www/invests/

Устанавливаем виртуальную среду, для изоляции нашего проекта и дальнейшего открытия его всему интернету

# python3 -m venv venv
# cd /var/www/invests/venv/bin
# source activate

Устанавливаем Flask и Gunicorn, как наиболее распространенный вариант надстройки над веб-сервером, для приложений на Питоне

# pip3 install gunicorn flask

И наш фреймворк для визуализации Даш

# pip3 install dash==1.12.0

Далее можно тестировать конфигурацию, прежде чем разворачивать проект. Создадим 2 тестовых файла в директории проекта — app.py

# cd /var/www/invests
# nano app.py

Вставляем код ниже

#from flask import Flask
import dash
app = dash.Dash()

Сохраняем CTRL+O и закрываем редактор CRTL+X

и наш входной файл — index.py

# nano index.py

Вставляем код ниже

import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output
from app import app

app.layout = html.Div([
    html.Label(children="Hello world"),
])
server = app.server
app.config.suppress_callback_exceptions = True
if __name__ == '__main__':
    app.run_server(debug=True)

Сохраняем CTRL+O и закрываем редактор CRTL+X

Теперь мы готовы запускать нашу тестовую среду (более подробную документацию на английском языке, если это понадобится, можно найти здесь)

# gunicorn --bind 0.0.0.0:8000 index:server

Наше страничка «Hello world» доступна по адресу

http://{ip_адрес_сервера}:8000

Если успешно запустили, дезактивируем виртуальную среду

# deactivate

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

Первым делом создаем .service файл в папке /etc/systemd/system

# nano /etc/systemd/system/invests.service

и вставляем следующий код

[Unit]
Description=Gunicorn instance to serve invests
After=network.target

[Service]
User=caddy
Group=caddy
WorkingDirectory=/var/www/invests
Environment="PATH=/var/www/invests/venv/bin"
ExecStart=/var/www/invests/venv/bin/gunicorn --workers 3 --bind unix:invests.sock -m 007 index:server

[Install]
WantedBy=multi-user.target

Сохраняем CTRL+O и закрываем редактор CRTL+X

Таким образом мы можем стартовать наш сервис (и добавить в авто-загрузку)

# systemctl start invests
# systemctl enable invests

И, последним делом, осталось дать понять, где искать наш сервис веб-серверу. В случае с Caddy это делается максимально просто, плюс с коробки получаем сертификат

# nano /etc/caddy/Caddyfile

и добавляем следующую конфигурацию

your-domain.com {
    tls admin@your-domain.com
    proxy / unix:/var/www/invests/invests.sock
}

Вместо your-domain.com указываем ваше доменное имя

Сохраняем CTRL+O и закрываем редактор CRTL+X

Перезагружаем веб-сервер

# systemctl restart caddy.service

После этого наша тестовая страничка будет доступна по адресу домена

https://your-domain.com

Структура проекта

Для дивидендного калькулятора будем использовать лаконичную структуру файлов, представленную ниже

Путь к проекту: /var/www/invests

  1. Входной точкой проекта будет index.py, роль которого — общая разметка страницы и роутинг (сможем задавать урлы будущим веб-страницам)
  2. Приложение Dash будет инициализироваться в app.py
  3. В папке apps будем хранить содержимое и логику отдельных страниц. Далее внутри этой папки:
  4. __init__.py — в нашем случае, необязательный системный файл
  5. commonmodules.py — общая разметка страниц, верхнее горизонтальное меню, которое поможет навигировать между нашими страницами — домашней страницей и страницей дивидендного калькулятора
  6. home.py — домашняя страница с простейшей версткой
  7. dividends_calculator.py — собственно, страница дивидендного калькулятора, для чего мы все это и проделывали

В следующей разделе приступим к наполнению всех этих страниц

Код проекта

так же доступен в git

# cd /var/www/invests
# echo ‘’ > index.py && nano index.py

Вставляем код ниже и сохраняем

import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output

from app import app
from apps import home, dividends_calculator


app.layout = html.Div([
    dcc.Location(id='url', refresh=False),
    html.Div(id='page-content')
])

server = app.server

app.config.suppress_callback_exceptions = True

@app.callback(Output('page-content', 'children'),
              [Input('url', 'pathname')])
def display_page(pathname):
    if pathname == '/':
         return home.layout
    elif pathname == '/dividends-calculator':
         return dividends_calculator.layout 
    else:
        return '404'

                
if __name__ == '__main__':
    app.run_server(debug=True)

# nano app.py

Вставляем код ниже и сохраняем

#from flask import Flask
import dash
import dash_core_components as dcc
import dash_html_components as html

print(dcc.__version__) # 0.6.0 or above is required

external_css = ["https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css",
                "https://cdnjs.cloudflare.com/ajax/libs/normalize/7.0.0/normalize.min.css",
                "https://cdnjs.cloudflare.com/ajax/libs/skeleton/2.0.4/skeleton.min.css",
                "https://fonts.googleapis.com/css?family=Raleway:400,300,600",
                "https://codepen.io/chriddyp/pen/bWLwgP.css",
                "https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css"]

app = dash.Dash(external_stylesheets=external_css)

# mkdirs apps && cd apps

# nano __init__.py

Оставляем его пустым и сохраняем.

Далее

# nano commonmodules.py

Вставляем код ниже и сохраняем

import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output

def get_header():
    header = html.Div([

        html.Div([
            html.H1(
                'List of Dashes')
        ], className="twelve columns padded"),       

    ], className="gs-text-header")
    return header

def get_menu():
    menu = html.Div([

        dcc.Link('Home   ', href='/', className="p-2 text-dark"),
        dcc.Link('Dividends Calculator   ', href='/dividends-calculator', className="p-2 text-dark")

    ], className="d-flex flex-column flex-md-row align-items-center p-3 px-md-4 mb-3 bg-white border-bottom shadow-sm")
    return menu    

# nano home.py

Вставляем код ниже и сохраняем

import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output
from apps import commonmodules

from app import app

layout = html.Div([
    commonmodules.get_menu(),
    html.H1('This is home screen'),
    html.A('My blog', href='https://questpro.club')
])

# nano dividends_calculator.py

Вставляем код ниже и сохраняем

# -*- coding: utf-8 -*-
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output
from apps import commonmodules

from app import app

meta_tags = [
    {'name':'description',
     'content':'Дивидендный калькулятор с учетом сложного процента'},
    {'name':'title',
     'content':'Дивидендный калькулятор'}
]

#app.external_stylesheets = external_stylesheets
app.meta_tags = meta_tags
app.title = 'Дивидендный калькулятор'

bottom_text = '''
1) Все суммы в долларах, проценты - в %  
2) По умолчанию, средний размер дивидентов при покупке акций устанавливаем в 4%, можно поменять  
3) По умолчанию, средний рост цены акций в год устанавливаем в 12.5% на основе статистики по S&P Dividends aristocrats   
4) Все дивиденды реинвестируем для осуществления скорейшего роста - сложный процент  
'''

default__divident_income_per_month = 1000
default__start_capital = 1000
default__regular_payment = 1000
default__start_divident_percent = 4
default__average_cost_grow_percent = 12.5

layout = html.Div([
    commonmodules.get_menu(),
    html.H1('Дивидендный калькулятор с учетом сложного процента'),
    html.Div([
        html.Div([
            html.Div([], className="col-sm-1"),
            html.Label(children='Желаемый средний доход в месяц по дивидентам ($)', className="col-sm-4 col-form-label"),
            html.Div([
                dcc.Input(id='divident-income-per-month', value='1000', type='text', className="form-control-plaintext")
            ], className="col-sm-4")
        ], className="form-group row"),
        html.Div([
            html.Div([], className="col-sm-1"),
            html.Label(children='Первоначальный взнос ($)', className="col-sm-4 col-form-label"),
            html.Div([
                dcc.Input(id='start-capital', value='1000', type='text', className="form-control-plaintext")
            ], className="col-sm-4")
        ], className="form-group row"),
        html.Div([
            html.Div([], className="col-sm-1"),
            html.Label(children='Частота очередного поступления: 1 месяц', className="col-sm-4 col-form-label")
        ], className="form-group row"),
        html.Div([
            html.Div([], className="col-sm-1"),
            html.Label(children='Размер очередного поступления ($)', className="col-sm-4 col-form-label"),
            html.Div([
                dcc.Input(id='regular-payment', value='1000', type='text', className="form-control-plaintext")
            ], className="col-sm-4")
        ], className="form-group row"),
        html.Div([
            html.Div([], className="col-sm-1"),
            html.Label(children='Средний размер дивидентов в при покупке акций (%)', className="col-sm-4 col-form-label"),
            html.Div([
                dcc.Input(id='start-divident-percent', value='4', type='text', className="form-control-plaintext")
            ], className="col-sm-4")
        ], className="form-group row"),
        html.Div([
            html.Div([], className="col-sm-1"),
            html.Label(children='Средний рост цены акций в год (%)', className="col-sm-4 col-form-label"),
            html.Div([
                dcc.Input(id='average-cost-grow-percent', value='12.5', type='text', className="form-control-plaintext")
            ], className="col-sm-4")
        ], className="form-group row"),
        html.Div([
            html.Div([], className="col-sm-1"),
            html.Label(children='Отображаем на графиках максимум лет', className="col-sm-4 col-form-label"),
        ], className="form-group row"),
        dcc.Slider(
            id='maximum-years',
            min=10,
            max=50,
            marks={i: 'рассматриваем максимум лет {}'.format(i) if i == 1 else str(i) for i in range(5, 51)},
            value=11
        ),
        html.Div([
            html.Div([], className="col-sm-1"),
            html.Label(id='result', className="col-sm-8 col-form-label"),
        ], className="form-group row")
    ], className=""),
    html.Div([
        dcc.Graph(id='dividends-graph'),
        dcc.Graph(id='capital-graph')
    ]),
    html.Div([
        dcc.Markdown(children=bottom_text)
    ])
])

def create_dividends_graph(df, target, title):
    return {
        'data': [dict(
            x=df['month'],
            y=df['dividend_no_reinv'],
            mode='lines',
            name='Дивиденды - без реинвестиций и без роста цены акций'
        ), dict(
            x=df['month'],
            y=df['dividend_percent_reinv'],
            mode='lines',
            name='Дивиденды - рост за счет роста акций'
        ), dict(
            x=df['month'],
            y=df['dividend_all_reinv'],
            mode='lines',
            name='Дивиденды - рост цен акций и реинвестирование дивидендов'
        ), dict(
            x=[target['month'],],
            y=[target['dividend'],],
            mode='marks',
            name='Целевое значение дивидендов'
        )],
        'layout': {
            'annotations': [{
                'x': 0, 'y': 0, 'xanchor': 'left', 'yanchor': 'bottom',
                'xref': 'paper', 'yref': 'paper', 'showarrow': False,
                'align': 'left', 'bgcolor': 'rgba(255, 255, 255, 0.5)',
                'text': title
            }],
            'yaxis': {'type': 'linear', 'title': 'Дивиденды в месяц, $'},
            'xaxis': {'showgrid': True, 'title': 'Месяцы'}
        }
    }

def create_capital_graph(df, target, title):
    return {
        'data': [dict(
            x=df['month'],
            y=df['cap_no_reinv'],
            mode='lines',
            name='Капитал - вложенные деньги'
        ), dict(
            x=df['month'],
            y=df['cap_percent_reinv'],
            mode='lines',
            name='Капитал - с ростом цены акций'
        ), dict(
            x=df['month'],
            y=df['cap_all_reinv'],
            mode='lines',
            name='Капитал - с ростом цены акций и реинвестицией дивидендов'
        )],
        'layout': {
            'annotations': [{
                'x': 0, 'y': 0, 'xanchor': 'left', 'yanchor': 'bottom',
                'xref': 'paper', 'yref': 'paper', 'showarrow': False,
                'align': 'left', 'bgcolor': 'rgba(255, 255, 255, 0.5)',
                'text': title
            }],
            'yaxis': {'type': 'linear', 'title': 'Капитал, $'},
            'xaxis': {'showgrid': True, 'title': 'Месяцы'}
        }
    }

def total_result_div(result):
    if result['dividend'] <= 0:
        return "Желаемая дивидендная доходность не найдена в заданном промежутке времени, попробуйте выставить больше лет для графиков"
    return "Требуемый ежемесячный дивидендный результат будет достигнут через [ {} месяцев], при этом будет вложено: [ {}$ ], но ваш капитал достигнет к этому времени за счет сложного процента: [ {:.2f}$ ]".format(result['month'], result['current_capital_no_reinv'], result['current_capital_with_all_reinv'])

""" Var in input field might be not floar, but empty or string, in such case use default value """ 
def input_to_float(var, default):
    if var.isdigit():
        return float(var)
    else:
        return default   
           
@app.callback(
    [Output(component_id='dividends-graph',component_property='figure'),
     Output(component_id='capital-graph',component_property='figure'),
     Output(component_id='result', component_property='children')],
    [Input(component_id='maximum-years', component_property='value'),
     Input(component_id='divident-income-per-month', component_property='value'),
     Input(component_id='start-capital', component_property='value'),
     Input(component_id='regular-payment', component_property='value'),
     Input(component_id='start-divident-percent', component_property='value'),
     Input(component_id='average-cost-grow-percent', component_property='value')]
)
def update_output_div(maximum_years, divident_income_per_month, start_capital, regular_payment, start_divident_percent, average_cost_grow_percent):
    max_years_number = int(maximum_years)
    MONTH_COUNT_YEAR = 12
    
    divident_income_per_month = input_to_float(divident_income_per_month, default__divident_income_per_month)
    start_capital = input_to_float(start_capital, default__start_capital)
    regular_payment = input_to_float(regular_payment, default__regular_payment)
    start_divident_percent = input_to_float(start_divident_percent, default__start_divident_percent)
    average_cost_grow_percent = input_to_float(average_cost_grow_percent, default__average_cost_grow_percent)
    
    current_capital_no_reinv = current_capital_just_percent_reinv = current_capital_with_all_reinv = start_capital
    info = {}
    info['month'] = []
    info['dividend_no_reinv'] = []
    info['dividend_percent_reinv'] = []
    info['dividend_all_reinv'] = []
    info['cap_no_reinv'] = []
    info['cap_percent_reinv'] = []
    info['cap_all_reinv'] = []
    target = {'month': 0, 'dividend': 0, 'current_capital_no_reinv': 0, 'current_capital_with_all_reinv': 0}
    for month in range(max_years_number * MONTH_COUNT_YEAR):
        info['month'].append(month)
        current_capital_no_reinv += regular_payment
        info['cap_no_reinv'].append(current_capital_no_reinv)
        current_dividend_no_reinv = current_capital_no_reinv * start_divident_percent / 100 / MONTH_COUNT_YEAR
        info['dividend_no_reinv'].append(current_dividend_no_reinv)
        current_capital_just_percent_reinv = (current_capital_just_percent_reinv + regular_payment) * (1 + average_cost_grow_percent / 100 / MONTH_COUNT_YEAR)
        info['cap_percent_reinv'].append(current_capital_just_percent_reinv)
        current_dividend_just_percent_reinv = current_capital_just_percent_reinv * start_divident_percent / 100 / MONTH_COUNT_YEAR
        info['dividend_percent_reinv'].append(current_dividend_just_percent_reinv)
        current_dividend_with_all_reinv = current_capital_with_all_reinv * start_divident_percent / 100 / MONTH_COUNT_YEAR
        info['dividend_all_reinv'].append(current_dividend_with_all_reinv)
        current_capital_with_all_reinv = (current_capital_with_all_reinv + regular_payment + current_dividend_with_all_reinv) * (1 + average_cost_grow_percent / 100 / MONTH_COUNT_YEAR)
        info['cap_all_reinv'].append(current_capital_with_all_reinv)
        if((current_dividend_with_all_reinv >= divident_income_per_month) and not (target['month'])):
            target['month'] = month 
            target['dividend'] = current_dividend_with_all_reinv
            target['current_capital_no_reinv'] = current_capital_no_reinv
            target['current_capital_with_all_reinv'] = current_capital_with_all_reinv
    return create_dividends_graph(info, target, ''), create_capital_graph(info, target, ''), total_result_div(target)

Перезапускаем сервис, чтобы применить все изменения на веб сайте

# systemctl restart invests 

Работа дивидендного калькулятора

Значения по-умолчанию для основных входных данных:

  • желаемый ежемесячный доход от дивидендов — 1000 долларов
  • стартовый капитал — 1000 долларов
  • ежемесячные пополнения брокерского счета для покупки дивидендных акций — 1000 долларов
  • средний процент дивидендов по акциям — 4%
  • средний рост цены дивидендных акций — 12.5% (на основе статистики по S&P Dividends aristocrats)

Все входные данные размещаются в редактируемых полях

Результаты можно увидеть на графиках ниже, куда поступают данные после обработки

  • график роста ежемесячных дивидендов:

a) получаемый за счет роста цены акций и ежемесячных ре-инвестирований дивидендов,

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

в) получаемый, если бы мы просто клали деньги «под подушку», без инвестирования, вообще

  • график роста капитала при тех же трех, рассматриваемых в первом пункте, условиях (а), б), в))

Бонусом, над графиками, представлен «ползунок» взгляда в будущее (изменяется в месяцах): что же произойдет с нашими дивидендами и капиталом, если продолжать вкладывать деньги следуя той же стратегии и далее

Итог

При взгляде на 2 графика: роста дивидендного дохода и роста капитала, можно сделать несколько интересных выводов:

  • значительно выгоднее вкладывать деньги в хорошие компании, чем просто хранить их
  • значительно выгоднее ре-инвестировать дивиденды
  • особенно, эффект заметен на горизонте более 10 лет
  • рост происходит экспоненциально
  • цифры по прошествии 20 лет и больше, даже, пугают
  • другие выводы можете сделать самостоятельно, «поиграв» с настройками, входными параметрами

Впечатления о книге «Путь программиста» Джона Сонмеза

Для меня, книги — это, в первую очередь, ответы на какие то жизненные вопросы или ситуации. И в этой книге таких ответов с лихвой. 

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

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

  1. Чтобы развиваться быстрее нужно ставить цели. Цели должны быть амбициозными, но, при этом, реальными. Если цель сложно-достижима, ее нужно, обязательно, разбить на цели поменьше и шаг за шагом приближаться к результату. Так же важно отслеживать результаты и, возможно, корректировать путь.
  2. Далее, по полочкам, раскладывается потенциальное успешное собеседование на новую, любимую работу. Далеко не избитые сценарии.
  3. Очень важный момент в карьере разработчика — специализация. Автор книги настаивает, что специализация должна быть узкой. Такие специалисты более ценятся на рынке труда, лучше оплачиваются.
  4. Очень интересно мнение автора по поводу работы в стартапах, в малых и крупных фирмах, на удаленную работу, атмосферу и даже политику внутри коллектива. Подводных камней в каждом из направление предостаточно…
  5. Узнаем как лучше сформировать собственное резюме, чтобы заинтересовать потенциального нанимателя.
  6. Очень важный акцент в книге — это продвижение себя как специалиста, создание бренда из своей деятельности. Многие главы вплетают в собственную структуру эту идею, рассматривая процесс продвижения с разных сторон. Один из вариантов — это ведение собственного блога (чем я как раз и начал заниматься, благодаря этой книге).
  7. Как писать статьи в блог, чтобы они были полезными и интересными? Как вести подкасты, если даже не представляешь как это начать делать? Как создать успешный канал в соц-сетях, например на ютюбе? Как не бояться публичных выступлений? На эти и многие другие вопросы есть ответы в данном печатном издании.
  8. Автор раскрывает секрет быстрого обучения. Например как быстро изучить новый язык или фреймворк.
  9. Продуктивность: делаем больше за меньшее время. Полезный навык в нашей профессии, который может потянуть карьеру вверх с невиданной быстротой (бонусом описывается небезызвестная «техника помидоров»).

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

  1. Финансы. Очень хорошо, если мы раньше приходим к пониманию, что деньги, заработанные нами, нужно не только собирать, но и преумножать. Инфляция — очень неприятная штука, которая, со временем, обесценивает наши сбережения. Вместе с автором, рассмотрим вопросы финансовой грамотности: пассивные доходы, инвестирование в недвижимость, во взаимные фонды. Кстати, мы узнаем не только как преумножить или сохранить наши сбережения, но и как обрести финансовую независимость и, возможность уйти на пенсию намного раньше.
  2. Сверх-интересный раздел о заработной плате, в том числе, примеры как вести успешные переговоры и заработной плате, ее начальному уровню и повышению.
  3. Напоследок, Джон Сонмез делится своим опытом в сфере поддержания здоровья тела и духа. Области нашей жизни настолько же важные как умение писать чистый и понятный код.

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

Основные команды Linux для начинающего администратора

Общие команды

Подключаемся к серверу по SSH

$ ssh -i {path_to_PEM_file} {user_name}@{IP_address}

Получаем рут права (многие серьезные команды требуют рут права)

$ sudo su

Просматриваем историю предыдущих команд

# history

Очищаем окно терминала от текста

# clear

Выходим из под юзера или из удаленного сервера

# exit

Работа с директориям

Перейти в директорию

# cd {folder_name}

На уровень выше

# cd ..

В домашнюю папку пользователя

# cd ~/

В самую корневую папку

# cd /

Показываем список папок и файлов (простой вывод)

# ls

Показываем список папок и файлов (с подробными деталями)

# ll

создаем новую папку

# mkdir

изменяем владельца файла или папки (рекурсивно)

# chown apache:apache /var/www/domain-web/ -R

изменяем права доступа к файлу или папке (рекурсивно)

# chmod 775 /var/www/domain-web/ -R

распечатываем текущий путь (к каталогу)

# pwd

поиск файлов или папок по шаблону названия

# find {template}

поиск текста по шаблону (в файлах)

# grep {template}

Пример поиска команды в истории по фильтру-шаблону

# history | grep {word_to_search}


Работаем с файлами 

Выводим содержимое файла в консоль

# cat {file_path/file_name}

Выводим последние 100 строк (удобно если большой файл)

# tail -100 {file_name}

Смотрим изменения в файле в режиме реального времени

# tail -f {file_name}

редактируем файл, если файла нету — он создается

# nano {file_name}

CTRL+O — сохраняем изменения

CTRL+X — закрываем файл

очищаем файл (например, чтобы отредактировать с нуля) без его удаления

# echo '' > {file_name}

очищаем файл и сразу переходим к редактированию

# echo '' > {file_name} && nano {file_name}

удаляем файл или каталог (рекурсивно)

# rm -rf {file_name}

копируем файл (например, делаем бекап конфига перед редактированием)

# cp {file_path/file_name} {new_file_path/file_name}

Просмотр расписания cron (у каждого системного пользователя он свой)

# crontab -l

Редактирование расписания cron

# crontab -e

Тоже, но через nano редактор

EDITOR=nano crontab -e


Просматриваем статистику о системе

анализ свободного/занятого дискового пространства

# df -h

показывает размер файла или каталога

# du -chs {directory 1} {directory 2}

показывает размер каталогов (или файлов), в том числе скрытых, с сортировкой по размеру

# du -chs .[!.]* * | sort -h

Просмотр информации о ресурсах операционной системы и запущенных процессах

# top

Тоже что top, но более интерактивно

# htop


Сервисы

Просмотр всех сервисов и их статусов

# service --status-all

Статус, старт, рестарт и стоп сервиса

# service nginx status

# service php-fpm start

# service redis-server restart

# service searchd stop


Бонус — команды посложнее

Выводим список с детальной информацией о процессах системы, которые в названии имею строчку «php»

ps aux | grep "php"

Подключится к mysql серверу

mysql -u {user_name} -p -h {server_name}

количество соединений к серверу с группировкой по статусам

# ss -tan | awk '{print $1}' | sort | uniq -c

количество соединений к серверу с группировкой по статусам — в реальном времени

# watch -n1 'ss -tan | awk '\''{print $1}'\'' | sort |  uniq -c'

AWS: EC2 — изменение типа инстанса и EBS — изменение размера хранилища

До недавних дней, процедура изменения типа инстанса или добавления гигабайт на ваш жесткий диск через консоль AWS было проблемой, чреватой создания копии инстанса, его конфигурацией и подменой оригинального на копию, с переназначением Elastic IP.

Расскажу, как это сделать гораздо быстрее и безопаснее.

Изменяем тип инстанса EC2

Например, если вам понадобились дополнительные мощности и вы готовы к переходу на более производительный сервер

  • В разделе EC2 переходим в под-раздел Instances
  • Останавливаем целевой инстанс — выбираем инстанс и затем нажимаем ActionsInstance StateStop
  • Как только сервер будет остановлен изменяем его тип: ActionsInstance SettingsChange Instance Type
  • Выбираем необходимый тип и подтверждаем выбор — Apply
  • Стартуем измененный инстанс: ActionsInstance StateStart

Таким образом, можно изменять мощность как в большую сторону, так и в меньшую

Изменяем размер жестного диска EBS

  • В разделе EC2 переходим в подраздел  Elastic Block StoreVolumes
  • Выбираем именно тот Volume (жесткий диск) который нам необходим — идентифицируем его или по тегам, которые мы составляли при добавления Volume к нашему серверу при создании или же по столбцу Attachment information
  • Далее: ActionsModify Volume
  • Устанавливаем новый размер хранилища Size и, затем, Modify

Так мы увеличили размер хранилища. Осталось внести изменения в системе, для расширения основного раздела жесткого диска.

Далее инструкция будет для Linux (CentOS в частности, а для других систем можно обратиться к официальной документации)

Соединяемся с сервером по SSH. Затем получаем рут права

$ sudo su

Выводим список блоков хранения, прикрепленных к серверу

# lsblk

Обычно, основной блок имеет имя nvme0n1, закидываем на него не привязанную память

# growpart /dev/nvme0n1 1

Удостоверяемся что память привязана

# lsblk

Говорим файловой системе, что можно использовать эту новую память. Выводим список разделов

# df -h

И применяем изменения к основному разделу (чаще всего это /dev/nvme0n1p1)

# sudo resize2fs /dev/nvme0n1p1

Удостоверимся, что изменения произошли успешно

# df -h

Готово! При этом, перезагрузка сервера не требуется.

Файл подкачки Swap file на Centos

Вполне возможно, можем столкнуться с нехваткой оперативной памяти для выполнения какого то процесса на нашем сервере. Если такое случается постоянно — возможно следует подумать о расширении сервера — в плане RAM. 

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

Cannot allocate memory

Которая не дает окончить желаемое действие.

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

Итак, прежде всего, нужно проверить, имеем ли мы свободное место на HDD

$ sudo su
# df -h

В нашем случае, свободно 55 гигабайт из 59-ти. 

Так же, давайте, проверим не создавали ли файла подкачки ранее

# swapon -s

Если вывод пустой — значит не создавали

Создадим файл подкачки на 1 Гигабайт (если необходимо больше — выставляем большее значение вместо выделенной цифры 1024 мб)

# dd if=/dev/zero of=/swapfile count=1024 bs=1MiB

Проверяем результат

# ls -lh /swapfile

Изменим режим доступа для файла — мера безопасности

# chmod 600 /swapfile

Теперь, активируем его

# mkswap /swapfile
# swapon /swapfile

Проверяем, что система видит его

# swapon -s

Однако, после перезагрузки он исчезнет, если не добавить его в загрузку

# nano /etc/fstab

И, в конец файла добавляем следующий код

/swapfile   swap    swap    sw  0   0

Сохраняем файл (CTRL+O) и закрываем (CTRL+X)

Готово!

Впечатления о книге «MBA за 10 дней» Стивена Силбигера

Дочитав книгу, хотел обобщить и поделиться впечатлениями о ней.

MBA — Магистр делового администрирования.

Начну с того, что на эту книгу ссылается не один именитый автор в мотивационных, бизнес- и инвестиционных материалах. Плюс ко всему, c понятием MBA связаны знания и навыки, которые увеличивают значимость менеджера на порядки. Так же увеличивая размер вознаграждения. Это, своего рода, элита в мире менеджеров средних и высоких звеньев. Крупные компании вкладывают очень большие деньги (10тки и 100тни тыс долларов на человека), отправляя своих самых перспективных работников на программы обучения в ведущие школы.

Почему так дорого. В интернете вы не найдете внятного объяснения. Все статьи сводятся к «воде»: что это престижно, что зарплата вырастает в разы, что это может быть требованием у работодателя. Но понять почему, можно прочитав эту книгу:

  1. Знания, которые тут дают, не оторваны от реальности, они часто пересматриваются и актуализируются
  2. Преподаватели таких школ и курсов, входящих в программу, часто очень известные личности, менеджеры известных компаний, авторы бестселлеров
  3. Сам учебный процесс может быть дорогим, за счет того, что учеников вывозят на крупные предприятия в разные страны, чтобы воочию продемонстрировать реальную атмосферу анализируемых объектов
  4. Ученик находится в окружении других перспективных студентов — полезные контакты. Причем, бизнес-школы стараются интернационализировать состав своих групп
  5. есть и другие факторы, пункты выше — это айсберг

Прочитав данную книгу (за те же 10 дней), вы, конечно, не станете обладателем всех знаний, которые получают будущие MBA за 2-4 года, но сможете прочувствовать атмосферу, понять как думают выпускники MBA-школ и, самое главное, ознакомиться с основными инструментами, которыми оперируют магистры делового администрирования. Причем это происходит на примерах (большинство — реальных) существующих компаний.

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

День 1 — Маркетинг

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

День 2 — Этика

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

День 3 — Бухгалтерский учет

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

День 4 — Организационное поведение

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

День 5 — Количественный анализ

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

День 6 — Финансы

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

День 7 — Управление операциями

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

День 8 — Экономика

Основы микроэкономики и макроэкономики в призме влияния на деятельность гипотетического предприятия

День 9 — Стратегия

Обретенные ранее знания (Главы 1 — 8) применяются для выработки общего курса предприятия не только для выживания, но и для развития в конкурентном мире. Рассматриваются различные теории и практические подходы. 

День 10 — Мини-курсы в программе MBA

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

Еще, от себя…

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

Очень важно, что автор, нативно, делает акцент на термины, которыми оперируют MBA в своей деловой лексике.