FIRE — это аббревиатура от «Financial Independence, Retire Early», что переводится как «Финансовая независимость, ранний выход на пенсию». Сторонники этого движения стараются закончить работать в 35-40 лет. Для этого они экономят деньги, откладывают больше половины зарплаты и инвестируют, чтобы накопить пенсионный капитал — примерно 25-30 годовых расходов.
Смысл FIRE не только в скорейшем увольнении, но и в возможности посвятить больше времени хобби или семье вместо не всегда любимой работы.
Движение стало популярным в 2010-е годы в США на фоне финансового кризиса. В тот момент цены на недвижимость стремительно росли — американцы переживали, что всю жизнь будут выплачивать ипотеки. При этом после обвала рынка ценных бумаг появилось много успешных инвесторов, которые успели купить акции, когда они были на дне.
Как Начать Зарабатывать на Fiverr — Пошаговая Инструкция
Кто они — последователи FIRE?
На reddit.com есть активное сообщество последователей FIRE из разных стран, преимущественно из США, где движение наиболее развито. Оно было создано в 2011 году, и за 11 лет аудитория выросла до 1,3 миллиона. В последние годы участники проводили опросы о том, удалось ли кому-то выйти на досрочную пенсию или они ещё в процессе, сколько денег необходимо для финансовой независимости, насколько они далеки от нее и т.д.
- 81% комьюнити — мужчины, средний возраст участников сообщества — 26-35 лет. Большинство работает в IT или финансовой сфере и имеет высшее образование — бакалавриат или магистратура.
- Почти половина последователей FIRE состоят в браке или в отношениях. У 27% опрошенных есть дети, и еще 27% планируют их завести.
- Большинство участников комьюнити — 86%, живут в США. Также много людей из Канады и Австралии.
Как меняются планы последователей FIRE?
Автоматизируем аргументы командной строки на Python с Google Fire
Сегодня мы рассмотрим библиотеку Fire, которая позволяет автоматизировать интерфейсы командной строки (CLI) на Python.
Fire — самая популярная после TensorFlow разработка для Python, которую Google выложил в открытый доступ:
Правда, она не настолько популярна…
Что интересно в библиотеке TensorFlow, так это то, что на момент её выхода на рынке уже было несколько популярных библиотек глубокого обучения (Theano, Caffe и Torch). Несмотря на это, TensorFlow сразу начал набирать популярность, посмотрите на активность Stack Overflow:
Обзор: Firefox — браузер который может. Chrome уходит на пенсию
В этом плане Fire похож на Tensorflow, так как и до него было уже достаточно много хороших инструментов для автоматизации интерфейсов командной строки на Python. Будет интересно посмотреть, примут ли разработчики Fire.
Примечание После использования Fire в течение нескольких недель и сравнения с другими вариантами вроде Click, становится понятно, что Fire больше подходит для быстрой разработки, так как в нём отсутствуют многие функции других CLI. Тем не менее, новые функции находятся в разработке. В первом релизе IPython был обязательной зависимостью, что приводило к долгой загрузке даже простых скриптов, но сейчас в нём нет необходимости!
Пример приложения с Fire
Fire можно установить с помощью pip:
pip install fire
Документацию можно найти на GitHub. В ней содержится проницательная заметка:
Почему библиотека называется Fire?
Когда вы вызываете Fire, она выстреливает (fire off, выполняет) вашей командой.
Мы можем выполнить команду, вызвав fire.Fire(my_object) , где my_object может быть функцией, классом или другим объектом.
Теперь пора делать приложение. Мы напишем генератор случайного выбора. Функция random_sample будет вычисляться через Fire . Как мы увидим, значения, возвращённые функцией, будут выведены в консоль.
Разработчик Форсайт АО «Гринатом» , Москва, можно удалённо , По итогам собеседования
Посмотрим на код:
»’ Функция для генерации случайного выбора. Использование: Для получения инструкций по использованию введите следующую команду: >>> python3 random_sample.py — —help »’ import fire import numpy as np def random_sample(choices, num_samples=1, seed=None): »’ Возвращает случайный выбор из входных данных. choices : tuple Варианты для выбора. num_samples : int Количество возвращаемых значений. seed : int Переменная для инициализации генератора случайных чисел. Используйте None для получения случайного значения. »’ num_samples = int(num_samples) seed = int(seed) if str(seed).isnumeric() else seed print(f’Варианты для выбора: ‘) print(f’Выбираю значений’) print(f’Seed: ‘) np.random.seed(seed) samples = np.random.choice(choices, size=num_samples) print(‘Результат:’) return ‘n’.join(samples) def main(): fire.Fire(random_sample) if __name__ == ‘__main__’: main()
Примечание переводчика Код в данной статье написан на Python 3.6, работоспособность на более ранних версиях не гарантируется.
Мы передаём нашу функцию random_sample методу Fire , который автоматически создаёт аргументы командной строки для параметров функции. Нам не нужно писать инструкции по применению скрипта: пользователь может ввести python3 random_sample.py — —help и увидеть следующий вывод:
$ python3 random_sample.py — —help Type: function String form: File: ~/Documents/blog-posts/google-fire/random-sample/random_sample.py Line: 10 Docstring: Возвращает случайный выбор из входных данных. choices : tuple Варианты для выбора. num_samples : int Количество возвращаемых значений. seed : int Переменная для инициализации генератора случайных чисел. Используйте None для получения случайного значения. Usage: random_sample.py CHOICES [NUM_SAMPLES] [SEED] random_sample.py —choices CHOICES [—num-samples NUM_SAMPLES] [—seed SEED]
Пример использования скрипта:
>>> python3 random_sample.py ‘Bohr, Schrödinger, Einstein, Dirac’ —num-samples 4 —seed 1905 Варианты для выбора: (‘Bohr’, ‘Schrödinger’, ‘Einstein’, ‘Dirac’) Выбираю 4 значений Seed: 1905 Результат: Dirac Einstein Dirac Schrödinger
Примечание Если вы хотите запускать скрипт как исполняемый файл (например, ./random_sample.py вместо python3 random_sample.py ), то добавьте в начале скрипта строку #!/usr/bin/env python и разрешите исполнение скрипта с помощью команды chmod +x random_sample.py .
Интерактивный режим
Что в Fire интересно, так это то, что он может перенести вас в среду IPython REPL. Для этого вам просто нужно добавить — —interactive в конце вызова вашего скрипта. Например:
$ python3 random_sample.py ‘Bohr, Schrödinger, Einstein, Dirac’ —num-samples 4 —seed 1905 — —interactive Варианты для выбора: (‘Bohr’, ‘Schrödinger’, ‘Einstein’, ‘Dirac’) Выбираю 4 значений Seed: 1905 Результат: Fire is starting a Python REPL with the following objects: Modules: fire, np Objects: component, main, random_sample.py, random_sample, result, self, trace Python 3.5.2 |Anaconda 4.2.0 (x86_64)| (default, Jul 2 2016, 17:52:12) Type «copyrigth», «credits» or «license» for more information. IPython 5.1.0 — An enhanced Interactive Python. ? -> Introduction and overview of IPython’s features %quickref -> Quick reference. help -> Python’s own help system. object -> Details about ‘object’, use ‘object??’ for extra details. In [1]: print(result) Dirac Einstein Dirac Schrödinger
- Запускаем random_sample.py .
- Показываем вывод random_sample.py .
- Заметили модуль и объекты, которые были загружены?
- Запускаем интерпретатор IPython.
- Выводим результат.
Данные, возвращённые вызовом функции, теперь расположены в памяти, так же, как и сама функция. Ниже мы выводим документацию и снова запускаем генератор случайного выбора:
IPython 5.1.0 — An enhanced Interactive Python. ? -> Introduction and overview of IPython’s features %quickref -> Quick reference. help -> Python’s own help system. object -> Details about ‘object’, use ‘object??’ for extra details. In [1]: print(result) Dirac Einstein Dirac Schrödinger In [2]: print(random_sample.__doc__) Возвращает случайный выбор из входных данных. choices : str Варианты для выбора. num_samples : int Количество возвращаемых значений. seed : int Переменная для инициализации генератора случайных чисел. Используйте None для получения случайного значения. In [3]: sample_2 = random_sample((‘Bohr’, ‘Schrödinger’), num_samples=2, seed=3) Варианты для выбора: (‘Bohr’, ‘Schrödinger’) Выбираю 2 значений Seed: 3 Результат: In [4]: print(sample_2) Bohr Bohr
Аргументы для выбора передаются как кортеж, а во время использования командной строки они передаются как строка:
>>> python3 random_sample.py ‘Bohr, Schrödinger’ —num-samples 2 —seed 3
Зажигаем класс
Вы можете передать любой объект модулю Fire , и библиотека сгенерирует CLI. Вот пример, в котором мы используем класс:
»’ Класс для получения данных с вики-страницы. Для получения инструкций по использованию введите следующие команды: >>> python3 wiki_page.py — —help >>> python3 wiki_page.py get-html-element — —help »’ import fire import requests import re class WikiPage(): »’ Запрашивает страницу из Википедии. page : str URL страницы. По умолчанию возвращает случайную страницу. »’ def __init__(self, page=’https://en.wikipedia.org/wiki/Special:Random’): page = requests.get(page) self.page = page self.url = page.url self.status_code = page.status_code def get_html_element(self, element): »’ Получить HTML-тег вроде title, h1, p, etc. »’ try: # Пытаемся достать тег с помощью регулярного выражения. text = re.findall(r'<[^>]*>(.*)(?: