Не просто книга-бестселлер, прочитанная миллионами людей, но и книга, которая поменяла ни одну жизнь. Книга, которая ответила за главные вопросы: как достигать вершин или же, просто, как понимать людей, помогать им и получать необходимую помощь самим.
Проблемы книги (лично для автора статьи)
Сами 7 навыков сложно сформулировать кратко и емко, так чтобы обращаться к их формулировкам постоянно.
Книга читается легко, в ней хорошие примеры, но это мало помогает для себя обобщить эти 7 навыков. Даже по прочтении книги 2 раза и по прошествии нескольких недель, непросто сформулировать для себя эти навыки. Хотя, может это задумка автора, и для полного понимания навыков, необходимо провести некоторую «домашнюю работу» с выписыванием ключевых идей для себя отдельно
Книга была написана очень давно (1989), хотя, автор утверждает, что с течением времени 7 приводимых навыков стали еще более актуальными. Тем не менее, ощущается некий налет «ретро» в том, как доносится информация
Почему книгу стоит прочитать
Это общепризнанный кладезь знаний/инсайтов/мыслей/триггеров. Она поможет ответить на сложные социально-психологические вопросы, которые вы, может даже и сформулировать не решались.
По прочтении книги, становится понятно от куда корни терминов, которыми оперируют хорошие менеджеры. Например, тот же, квадрант Эйзенхауэра (срочно-важно), правило Парето (20/80), принцип «Выиграл/выиграл», понятие «проактивности» и многие другие. Т.е. позволит говорить с людьми, достигших значительных успехов в само-развитии, на одном языке.
Может помочь задать направлении дальнейшего развития личности (вряд ли это будет первая книга, которая это сделает, но может быть лучшей или же помочь, на одном из «перекрестков развития»)
Для себя, я отметил следующие положения по каждому из 7 навыков:
Навык 1: Будьте проактивны
В отличии от обычного, реактивного подхода, проактивный не становится реакцией на раздражители (обстоятельства или случайные события), а ведет по собственному пути, создавай благоприятные обстоятельства. Другими словами, наше поведение зависит от наших решений, а не от нашего окружения.
Одно из проявлений проактивности — эффект самореализующихся предсказаний. Если, например, думать, что ваш подопечный неумелый работник, то он таким и будет. Если же к нему относится как к талантливому и перспективному, то таковым он и станет.
Конечно, это не так просто сделать. Нужно понимать, что, чтобы изменить что-то, нужно начать с себя. А для того чтобы поменяться, нужно, прежде всего, поменять свое восприятие.
Тут же, скрывается еще одна ловушка. Мы видим мир не таким каков он есть, а таким, каким мы настроены его видеть. Другими словами мы пропускаем все через призму своего жизненного опыта, через наши представления и парадигмы. И стоит другим разойтись с нами во мнении, мы поспешно приходим к выводу, что не правы именно они. Тут так же на помощь придет пересмотр собственного восприятия
Взаимозависимость, как следующая ступень эволюции человеческих отношений, после зависимости и независимости, говорит о том, что даже у зрелой личности возможности и восприятие ограниченные, и вместе можно такое, что не доступно одному. Путь к взаимозависимость — это результат овладения всеми 7ю навыками.
Навык 2: Начинайте представлять конечную цель
Смысл навыка заключается в том, чтобы уже сейчас начать формировать свое представление образа, картины или парадигмы конечных целей вашей жизни. Составить систему оценок и критериев по которым будет оцениваться все остальное.
В продолжении предыдущего пункта, лидерство — это формирование направления развития и задач компании или группы, установление продуктивных, теплых, доверительных отношений внутри коллектива или семьи. Эти лидерство отличается от управления, которое подразумевает только следованию уже установлены правилам, контроль и решение сиюминутных трудностей
В личном плане, основой второго навыка будет составление и следование положениям личной миссии — способу фокусироваться на том, каким вы хотите быть и что вы хотите делать, а так же ценности и принципы, которые будут лежать в основе вашего характера и поступков
Помещая в центр нашей жизни верные принципы, вы создаете прочную основу для развития жизне-обеспечивающих факторов: внутренняя безопасности, планирование, мудрость и личная власть
Личная миссия семьи (или организации) — фундаментальная основа, конституция семьи, нормы и критерии для вынесения суждений и принятия решений, которые способствуют ее единению и долгому существованию
Без вовлечения в процесс формирования личной миссии семьи или организации нету и приверженности, это необходимо учитывать при формировании личной миссии
Навык 3: Сначала делайте то, что необходимо делать сначала
В основе третьего навыка лежат принципы персонального управления. Лидерство определяет что нужно делать сначала, а управление помогает выполнять это
Для понимания, что нужно делать сначала, нужно понять матрицу управления временем (квадрант Эйзенхауэра)
Важные несрочные дела требуют от нас большей инициативы, большей проактивности, при этом они создают новые возможности. Когда выполняются такие дела, наша эффективность совершает огромный скачок
Фокусировка на важных несрочных делах приводит к тому, что количество кризисов и проблем (которые идут из квадранта 1 — срочные-важные) сокращается до разумного предела, так как вы планируете будущее и предпринимаете шаги, предотвращающие развитие кризисных ситуаций.
Так работает принцип Парето: 80 процентов результатов проистекает из 20 процентов усилий
Метод недельного планирования (в отличии от метода дневного планирования) наделяет свободой и гибкостью, необходимой для того, чтобы справляться с непредвиденными обстоятельствами, в том числе
Навык 4: Думайте в духе «Выиграл/Выиграл»
Подход «Выиграл/Выиграл» направлен на постоянный поиск взаимной выгоды при любых взаимодействиях людей между собой. Другими словами, все договоренности и решения обоюдно выгодны и полностью удовлетворяют обе стороны.
Хоть философия «Выиграл/Выиграл» чаще всего является наиболее выигрышной, однако при различных обстоятельствах, другие стратегии взаимодействий, такие как «Выиграл/Проиграл», «Проиграл/Выиграл», «Проиграл/Проиграл» и «Выиграл» могут быть предпочтительнее
Навык 5: Сначала стремитесь понять, а потом — быть понятым
Пока вы сами не откроетесь человеку, чтобы он мог на вас повлиять, он не откроется для ваших советов
Если вы хотите быть действительно эффективным в плане межличностных отношений необходимо овладеть навыками эмпатического слушания, которое основывается на характере, вызывающем открытость и доверие
При этом необходимо заботиться о пополнении эмоционального банковского счета
Навык 6: Достигайте синергии
Сочетание значительного эмоционального банковского счета, мышления в духе «Выиграл/Выиграл» и стремление прежде понять партнера формируют идеальные условия для синергичного взаимодействия
Суть синергии заключается в умении ценить различия между людьми: различия в менталитете, в эмоциональной сфере, в психологическом плане. А ключ к тому, чтобы ценить различия, содержится в понимании, что мир вокруг нас устроен не таким образом, каков он есть, а таким каковы мы сами
Навык 7: Затачивайте пилу
Данный навык говорит о том, что нужно развивать самый главный ресурс — нас самих. Необходимо обновляться в 4х измерениях равномерно: физическом, духовном, интеллектуальном и социально-эмоциональном
Каждое из измерений очень важно само по себе, однако наиболее эффективным процесс становится только тогда, когда он разумно сбалансирован
При этом, при правильном развитии одного или нескольких измерений естественным образом подтягивает другие измерения
Навык 7 относится не только к личности, но и организациям
Чтобы 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 settings — Access keys — Add key (настройки конкретного репозитория)
Добавляем приватный ключ в Jenkins
Заходим в раздел Управления Ключами (Jenkins — Manage Jenkins — Manage Credentials)
И добавляем приватный ключ (содержимое файла id_rsa.pub) в поле Private key, как проиллюстрировано ниже
Заполняем поле Username — имя для пользователя. Сохраняем.
Осталось подключится к репозиторию.
Перейдем в настройки ранее созданного проекта в Jenkins.
Source Code Management — выбираем Git (1)
Repositories — вставляем ссылку на репозиторий (2) и из выпадающего списка выбираем нашего только что созданного пользователя с приватным ключом (3)
Branches to build — обычно указывают мастер ветку — */master (4)
Сохраняем проект в Jenkins.
Теперь мы готовы собрать проект из приватного репозитория.
(Если вам необходимо установить 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 (последняя стабильная версия):
Далее выполняем команды под рутом — командой получаем права:
$ 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 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. В результате скрипт настроит редис, сформирует конфигурации, сформирует и добавить сервис в автозагрузку Проверим работу сервера При этом сам сервис Редеем запускается командой
Иногда возникает желание поставить аутентификацию (запаролить) сайт или же папку на сайте.
Например:
Для области администрирования
Проводятся работы по разработке и рано открывать область или функционал широкому кругу пользователей
Область, предназначенная только для разработки
Необходимо закрыть от индексирования (не через специальные файлы, а совсем)
Есть желание предоставлять доступ к области только для ограниченного круга лиц
Другие причины
Генерация аутентификационного файла
Такого рода аутентификация называется 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. При этом, можно закрыть как весь сайт, расположив строчки:
После добавления в конфигурацию сайте — не забываем перезагрузить nginx.
Исключения для определенных IP
Бонусом, есть возможность добавить какие то айпишники в «белый список», чтобы для них не запрашивалась аутентификация, а для остальных — запрашивались логин и пароль. Делается это следующим образом:
Калькулятор хостится на Digital Ocean, сервер на Centos 7, Python + Dash фреймворк для визуализации.
С данным реальным примером, можно начать увлекательное путешествие в мир финансовой грамотности, попутно, ознакомившись с языком Питон, который идеально подходит под задачи автоматизации математических вычислений, а так же фреймворком Даш (на основе более известного фреймворка Flask c элементами ReactJS, но это все под капотом)
Принцип работ инвестиций в дивидендные акции
Один из самых интересных и надежных способов получать пассивный доход — это инвестиции в надежные дивидендные акции.
Наиболее оправданный подход (проверенный годами и многими публичными пассивными инвесторами) — это вкладывать регулярно (например раз в месяц или раз в неделю) одинаковыми суммами в понятные и надежные компании, которые годами наращивают свою выручку и, соответсвенно, дивиденды.
Далее, эти растущие дивиденды ре-инвестируются, что увеличивает регулярные пополнения. Машина раскручивается, и капитал растет.
Все это происходит по экспоненте, как можно убедиться после использования данного калькулятора.
Установка окружения для нашего проекта и размещение на хостинге, публикация.
Подразумевается, что хостинг приобретен, операционная система установлена, веб сервер настроен (или же вы работаете на локальномкомпьютере на Mac или Linux)
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
И, последним делом, осталось дать понять, где искать наш сервис веб-серверу. В случае с Caddy это делается максимально просто, плюс с коробки получаем сертификат
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 лет и больше, даже, пугают
другие выводы можете сделать самостоятельно, «поиграв» с настройками, входными параметрами
Для меня, книги — это, в первую очередь, ответы на какие то жизненные вопросы или ситуации. И в этой книге таких ответов с лихвой.
В данной статье я, как раз, отмечу те моменты, которые, в какой то степени, новые и поучительные для меня.
Начнем с того, что автор книги уже давно ведет свой личный блог, в котором подробно описывает разные грани жизни разработчиков. Практически в каждой главе приведены ссылки на соответствующие статьи, что может быть очень полезным, если захочется глубже погрузится в тему.
Чтобы развиваться быстрее нужно ставить цели. Цели должны быть амбициозными, но, при этом, реальными. Если цель сложно-достижима, ее нужно, обязательно, разбить на цели поменьше и шаг за шагом приближаться к результату. Так же важно отслеживать результаты и, возможно, корректировать путь.
Далее, по полочкам, раскладывается потенциальное успешное собеседование на новую, любимую работу. Далеко не избитые сценарии.
Очень важный момент в карьере разработчика — специализация. Автор книги настаивает, что специализация должна быть узкой. Такие специалисты более ценятся на рынке труда, лучше оплачиваются.
Очень интересно мнение автора по поводу работы в стартапах, в малых и крупных фирмах, на удаленную работу, атмосферу и даже политику внутри коллектива. Подводных камней в каждом из направление предостаточно…
Узнаем как лучше сформировать собственное резюме, чтобы заинтересовать потенциального нанимателя.
Очень важный акцент в книге — это продвижение себя как специалиста, создание бренда из своей деятельности. Многие главы вплетают в собственную структуру эту идею, рассматривая процесс продвижения с разных сторон. Один из вариантов — это ведение собственного блога (чем я как раз и начал заниматься, благодаря этой книге).
Как писать статьи в блог, чтобы они были полезными и интересными? Как вести подкасты, если даже не представляешь как это начать делать? Как создать успешный канал в соц-сетях, например на ютюбе? Как не бояться публичных выступлений? На эти и многие другие вопросы есть ответы в данном печатном издании.
Автор раскрывает секрет быстрого обучения. Например как быстро изучить новый язык или фреймворк.
Продуктивность: делаем больше за меньшее время. Полезный навык в нашей профессии, который может потянуть карьеру вверх с невиданной быстротой (бонусом описывается небезызвестная «техника помидоров»).
Далее в книге рассматриваются темы, которые, как может показаться, не имею прямого отношения к карьере программиста. Однако, по моему мнению, это не так.
Финансы. Очень хорошо, если мы раньше приходим к пониманию, что деньги, заработанные нами, нужно не только собирать, но и преумножать. Инфляция — очень неприятная штука, которая, со временем, обесценивает наши сбережения. Вместе с автором, рассмотрим вопросы финансовой грамотности: пассивные доходы, инвестирование в недвижимость, во взаимные фонды. Кстати, мы узнаем не только как преумножить или сохранить наши сбережения, но и как обрести финансовую независимость и, возможность уйти на пенсию намного раньше.
Сверх-интересный раздел о заработной плате, в том числе, примеры как вести успешные переговоры и заработной плате, ее начальному уровню и повышению.
Напоследок, Джон Сонмез делится своим опытом в сфере поддержания здоровья тела и духа. Области нашей жизни настолько же важные как умение писать чистый и понятный код.
С последними страницами, приходит понимание, что автор делился своим бесценным жизненным опытом не просто как с читателем, который приносит деньги, а как с хорошим товарищем. Настолько проникаешься идеями, которые преподносятся в доброжелательном и жизнеутверждающем ключе.
До недавних дней, процедура изменения типа инстанса или добавления гигабайт на ваш жесткий диск через консоль AWS было проблемой, чреватой создания копии инстанса, его конфигурацией и подменой оригинального на копию, с переназначением Elastic IP.
Расскажу, как это сделать гораздо быстрее и безопаснее.
Изменяем тип инстанса EC2
Например, если вам понадобились дополнительные мощности и вы готовы к переходу на более производительный сервер
В разделе EC2 переходим в под-раздел Instances
Останавливаем целевой инстанс — выбираем инстанс и затем нажимаем Actions — Instance State — Stop
Как только сервер будет остановлен изменяем его тип: Actions — Instance Settings — Change Instance Type
Выбираем необходимый тип и подтверждаем выбор — Apply
Стартуем измененный инстанс: Actions — Instance State — Start
Таким образом, можно изменять мощность как в большую сторону, так и в меньшую
Изменяем размер жестного диска EBS
В разделе EC2 переходим в подраздел Elastic Block Store — Volumes
Выбираем именно тот Volume (жесткий диск) который нам необходим — идентифицируем его или по тегам, которые мы составляли при добавления Volume к нашему серверу при создании или же по столбцу Attachment information
Далее: Actions — Modify 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
Готово! При этом, перезагрузка сервера не требуется.
Вполне возможно, можем столкнуться с нехваткой оперативной памяти для выполнения какого то процесса на нашем сервере. Если такое случается постоянно — возможно следует подумать о расширении сервера — в плане 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
Однако, после перезагрузки он исчезнет, если не добавить его в загрузку
Дочитав книгу, хотел обобщить и поделиться впечатлениями о ней.
MBA — Магистр делового администрирования.
Начну с того, что на эту книгу ссылается не один именитый автор в мотивационных, бизнес- и инвестиционных материалах. Плюс ко всему, c понятием MBA связаны знания и навыки, которые увеличивают значимость менеджера на порядки. Так же увеличивая размер вознаграждения. Это, своего рода, элита в мире менеджеров средних и высоких звеньев. Крупные компании вкладывают очень большие деньги (10тки и 100тни тыс долларов на человека), отправляя своих самых перспективных работников на программы обучения в ведущие школы.
Почему так дорого. В интернете вы не найдете внятного объяснения. Все статьи сводятся к «воде»: что это престижно, что зарплата вырастает в разы, что это может быть требованием у работодателя. Но понять почему, можно прочитав эту книгу:
Знания, которые тут дают, не оторваны от реальности, они часто пересматриваются и актуализируются
Преподаватели таких школ и курсов, входящих в программу, часто очень известные личности, менеджеры известных компаний, авторы бестселлеров
Сам учебный процесс может быть дорогим, за счет того, что учеников вывозят на крупные предприятия в разные страны, чтобы воочию продемонстрировать реальную атмосферу анализируемых объектов
Ученик находится в окружении других перспективных студентов — полезные контакты. Причем, бизнес-школы стараются интернационализировать состав своих групп
есть и другие факторы, пункты выше — это айсберг
Прочитав данную книгу (за те же 10 дней), вы, конечно, не станете обладателем всех знаний, которые получают будущие MBA за 2-4 года, но сможете прочувствовать атмосферу, понять как думают выпускники MBA-школ и, самое главное, ознакомиться с основными инструментами, которыми оперируют магистры делового администрирования. Причем это происходит на примерах (большинство — реальных) существующих компаний.
Автор книги делает свою работу очень умело. Хотя некоторые вещи не просты в понимании, так как охватываются множество сфер экономической, политической, финансовой, нравственной, информационной и других. Собственно, разделы книги поделены на эти сферы.
День 1 — Маркетинг
В этом разделе учат разбираться в своих покупателях или клиентах. Анализируем процесс покупки, раскладывая его на этапы. Изучаем свой продукт и формирование его цены. А так же формируем стратегию маркетинга как это делают MBA.
День 2 — Этика
Наиболее молодой, ранее недооцениваемый, раздел. Менеджеры крупных звеньев обладают очень большой ответственностью, которую нужно понимать и учитывать при принятии своих решений. Так же необходимо разобраться с приоритетами, ради кого создавалась организация и чьи интересы отстаивает в первую очередь.
День 3 — Бухгалтерский учет
Финансовые отчеты — очень важный источник информации о компании. В этом разделе рассматриваются ключевые понятия и самые важные характеристики для понимания чем владеет компания, сколько и кому она должна, насколько эффективны ее операции и как происходит само-финансирование компании
День 4 — Организационное поведение
Не являясь лидером, авторитетом и человеком с харизмой, MBA вряд ли сможет эффективно продвигать свои идеи и улучшать процессы в компании. Поэтому данная глава и задает направление развития менеджера как сильной личности. Личности, которая разбирается в текущих процессах на предприятии и находит подход к коллегам с разными психологическими типами
День 5 — Количественный анализ
Который позволяет принимать сложные решения (например, бурить нефтяную скважину в этом конкретном перспективном месте или нет) не только на основе интуиции и советов, но с помощью математически-обоснованного аппарата. Который включает схемы, диаграммы с формулами и вероятностными распределениями
День 6 — Финансы
Эта глава мне интересна так же по тому, что интересуюсь разными аспектами инвестирования сбережений. А с точки зрения компаний — жизненно важно поддерживать свое финансовое состояние, посредством инвестиционной деятельности
День 7 — Управление операциями
Планирование производственных операций, оптимальное распределение ресурсов и производственных мощностей, управление рабочими кадрами, запасами товаров, качеством продукта — некоторые из аспектов, рассматриваемых в данной главе
День 8 — Экономика
Основы микроэкономики и макроэкономики в призме влияния на деятельность гипотетического предприятия
День 9 — Стратегия
Обретенные ранее знания (Главы 1 — 8) применяются для выработки общего курса предприятия не только для выживания, но и для развития в конкурентном мире. Рассматриваются различные теории и практические подходы.
День 10 — Мини-курсы в программе MBA
Кратко описываются чуть менее масштабные, но не менее важные вопросы, которые помогут выпускнику бизнес-школы решать задачи предприятия или достигать своих личных целей
Еще, от себя…
На что еще хочу обратить внимание по этой книге, это на то, что автор не забывается слишком глубоким и сложным погружением в детали, так как каждый раздел — это целые науки, но формирует опоры, которые, в случае необходимости, помогут найти детальную информацию.
Очень важно, что автор, нативно, делает акцент на термины, которыми оперируют MBA в своей деловой лексике.