Блог Александра Левашова

— Сними с тебя твой железный костюм, кто ты без него?
— Рубист)

«Железный человек» (с)

Ruby gem для сохранения UTM меток

Привет!

Когда я только начал свою карьеру Ruby разработчика, у меня была мечта запилить что-нибудь в open source. Внести, так сказать, свой вклад в сообщество. Проще всего внести вклад в ruby-сообщество, сделав свой собственный gem (библиотеку).

Но до сих пор у меня не было идеи того, что я хочу сделать, а пилить гем ради гема — такое себе удовольствие.

Проблема

Я периодически тестирую разные идеи Rails приложений, где есть только лендинг (что-то вроде «продающей» страницы) и регистрация пользователя (через email и соц. сети). Затем я настраиваю рекламу и запускаю трафик, чтобы проверить потом в Яндекс.Метрике в какую стоимость будет выходить лид.

Получается такое быстрое MVC для валидации идей.

Засада в том, что лид в Метрике считается не совсем корректно (а настраиваемые цели часто косячат), плюс не всегда понятно, откуда и по каким ключевым словам приходят эти лиды.

Чтобы сделать этот процесс понятным, мне нужно было сохранить зарегистрированному на сайте пользователю UTM метки, c которыми он пришёл на сайт. А дальше уже делать выгрузку этих данных из базы и понимать какая реклама работает лучше всего и где лид выходит дешевле.

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

UTM Tracker — гем для сохранения UTM меток

UTM Tracker позволяет сохранять UTM метки прямо в базу данных, чтобы хранить в таблице пользователей эту информацию.

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

Документация находится здесь

P.S. Если вы программист и у вас есть аккаунт на Github, поставьте, пожалуйста, звездочку. Мне будет очень приятно.

14 сентября   rails   ruby   веб-разработка

Всем привет из солнечного Краснодара!)

Я совсем забил на свой блог, с последней записи прошло очень много времени, но на то были свои причины. Очень много событий произошло с последнего момента. Я женился, пережил пандемию, переболел Ковидом, сменил два места работы, перебрался из Москвы в Краснодар и сделал много чего ещё интересного.

Описывать всё не имеет смысла (текст получится очень длинным), но расскажу кратко по важным пунктам.

Пандемия, работа и удаленка

Не смотря на то, что 2020 и 2021 год для многих людей оказался тяжелым, мне повезло. Для меня 2020 год оказался лучшим в моей жизни.

Во-первых, я женился, в самую пандемию, в Москве, в ЗАГСе Митино)

Во-вторых, появилась удаленка и спрос на услуги программистов вырос (как и их зарплаты). Удаленка позволила уехать из Москвы как только сняли карантин. А рост зарплаты позволила закрыть свои основные потребности.

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

Программирование

Я по-прежнему программирую на Ruby. У меня также были попытки изучить Golang (я даже что-то на нём написал), но так как это не мой основной язык, если у тебя нет постоянной практики, то знания теряются. Поэтому я решил не распыляться и изучать то, с чем сталкиваюсь каждый день.

Мне повезло написать с нуля приложение для подготовки к ЕГЭ. Поработать в финтехе (интегрируя крупные банки к платформе для самозанятых). Написать целые библиотеки (гемы) для этого.

В общем, своим профессиональным ростом я доволен. Программировать мне по-прежнему нравится.

Инвестиции

В 2019 году я пришёл на фондовый рынок и вот уже три года подряд увеличиваю свой инвестиционный портфель имея свои 20% годовых (каждый год). Кто-то скажет что мало, а я скажу... А ничего я не скажу)

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

Планы

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

В ближайшее время расскажу подробнее.

P.S. Постараюсь никуда не пропадать, а почаще обновлять свой блог. Тем более, что есть много того, чем стоит поделиться.

О карантине и обучении

Всем привет!

Вот уже месяц как я сижу в изоляции. С ума пока не сошёл, с телевизором ещё не разговариваю. Хотя говорят, что волноваться стоит, если тебе из него стали отвечать)

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

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

Golang

Короче, я стал учить Golang)

Это уже не первый мой подход к этому языку. У меня были попытки его освоить и ранее, но после Ruby всё кажется «некрасивым»)

Не хватает каких-то методов из коробки. Нет итераторов, на всё про всё только цикл «for». Какая-то странная ситуация с массивами и срезами. Первый раз столкнулся с указателями. Строгая типизация тоже поначалу запутывала, накладывающая кучу ограничений. И вообще, по ощущениям, на Golang я пишу больше кода, чем это потребовалось бы написать на Ruby.

Но всё-равно, выбрал Golang в качестве второго языка.

Сейчас читаю книгу «Язык программирования Go». Не сказать, что она простая в восприятии. Если бы у меня не было опыта программирования, то, скорее всего, я бы ничего не понял. Но всё-равно интересно.

Но теории, естественно, недостаточно. Нужна практика. И поэтому, параллельно своему обучению, я пишу на Golang торгового робота скальпера для торговли акциями на бирже ММВБ и параллельно осваиваю фишки языка, включая работу с go-рутинами)

Проект получился как-то сам собой. Дело в том, что у меня открыт брокерский счет в Тинькофф Инвестиции. И у них есть API для работы на бирже, как раз предназначенный для создания роботов. И под это дело, разработчики банка сделали SDK, написанный на Go.

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

Весь функционал разнесён по пакетам, под каждый функционал сделан отдельный интерфейс.

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

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

Но если честно, что-то много всего навалилось в последнее время... Мне совсем не скучно дома, так как всегда есть куча дел, которые требуют внимания, времени и сил. Просто все эти три вещи в дефиците.

Жду не дождусь майских праздников, чтобы наконец отдохнуть и восстановиться.

Вести с полей)

Всем привет! Прошло уже почти три месяца как начался 2020 год. И начался (да и продолжается) он как-то уж очень турбулентно.

Новостей и правда много, но связаны они в основном с тем, что сейчас происходит в мире. А вы и без меня хорошо знаете, что сейчас происходит. Эпидемия, падение рынков ценных бумаг, рост доллара, вот это вот всё...

Моя работа и жизнь в Москве

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

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

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

Мой новый проект

Закончен где-то на 70%. Сейчас натягиваю верстку на почти готовый бэк. Исправляю какие-то баги и ошибки в бизнес-логике, доделываю мелкие фичи. Я хотел это всё закончить до конца марта, но скорее всего, провожусь с ним ещё и часть апреля.

Как будет готово, сделаю анонс.

Мои приключения на рынке ценных бумаг

8 марта российский рынок акций стал падать вниз. По отдельным акциям у меня была просадка в 30-40%, что меня не сильно тревожило, потому что портфель был достаточно сбалансирован и имел максимальную просадку в 12%. Однако, как только на рынке возникла коррекция, я продал весь свой портфель, зафиксировав небольшой плюс.

Сделал я это по нескольким причинам.

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

Во-вторых, весь свой портфель я собирал стихийно, по наитию. Что не правильно, потому что в нём могут оказаться «проблемные» компании.

В итоге, буквально на днях, я собрал список из тех акций, которые мне интересны для покупки. Проанализировал их отчетность за 2019 год. Отобрал лучшие из списка компании и собрал на их основе модельный портфель.

Теперь начну его формировать, следуя своей стратегии. Покупать ценные бумаги на 5% всего объёма портфеля и на просадке конкретной ценной бумаги в 20-30% докупать ещё на 5% от стоимости портфеля.

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

Общая ситуация

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

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

Это коснется всех нас. Например, я пишу на Ruby. И я, как бы, ни на что не намекаю, но вот к примеру:

  • Рокетбанк закроет отдел дебетовых карт. А там около 50 бэкенд разработчиков, которые пишут на Ruby
  • Один чувак из Ruby-сообщества (достаточно квалифицированный специалист с хорошим опытом) был недавно сокращен, так как в компании начались трудные времена.
  • Наша компания закрыла найм новых специалистов на время карантина.

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

Главное, что мы уже начинаем входить в состоянии кризиса, который будет усиливаться.

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

Такой план есть у меня, такой план должен быть у каждого из нас. Наступают реально тяжелые времена и я радуюсь тому, насколько вовремя свалил из маркетинга в разработку. Сейчас вкатиться в IT будет несколько сложнее (но всё ещё возможно).

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

Ну и самое главное, берегите себя и своих близких. Это сейчас наше самое главное богатство!

Настройка и деплой Sidekiq 6.0.0 при помощи Capistrano

Сначала думал дополнить предыдущую статью по деплою ассетов, но в итоге решил вынести этот пункт отдельно.

Дело в том, что помимо компиляции ассетов я столкнулся с проблемой деплоя Sidekiq для фоновых задач в с своём рельсовом приложении.

Проблема capistrano/sidekiq

Для капистрано есть гем, который запускает весь процесс из коробки (capistrano/sidekiq), но у него поломана совместимость с sidekiq версии 6. Он работает только для версии 5, а тот пулл-реквест, который фиксит баг до сих пор не принят. Есть отдельный форк этого гема (который вроде как решает проблему), но видимо я слишком туп, чтобы он у меня заработал.

Изучая документацию Sidekiq в части деплоя, я выяснил, что можно воспользоваться системной утилитой управления сервисами: systemd

И для меня это был выход, потому что Redis (который работает в связке с Sidekiq и уже должен быть установлен у вас на сервере) запускается / останавливается / рестартуеся при помощи этой утилиты (и я хочу сказать, что это очень удобно).

Ниже я описал, что нужно сделать, чтобы и на вашем сервере работал Sidekiq тоже.

Настройка systemd

Для начала вам нужно настроить конфиг для работы Sidekiq на вашем сервере.

  1. Заходим на сервер и создаем файл конфига:
sudo nano /lib/systemd/system/sidekiq.service

Вот ссылка на конфиг: https://gist.github.com/mkhuda/132787f9d54890a183d665eb4560f196

Несмотря на то, что он написан для Ubuntu 16, он прекрасно работает и на Ubuntu 18.04. Но его конечно нужно будет немного поправить.

Помещаем данные конфига в файл sidekiq.service и кое-что редактируем.

  1. Заменяем эти данные на свои:
User=deploy # Название пользователя, под которым вы заходите на сервер для деплоя
Group=deploy # Дублируем его же

WorkingDirectory=/home/deploy/my_app/current # Сюда вводим путь, где лежит текущая версия вашего приложения

ExecStart=/home/deploy/.rbenv/shims/bundle exec sidekiq -e production # Запускаем sidekiq используя rbenv

-C config/sidekiq.yml # Добавить к последней команде, чтобы подтянуть настройки
  1. Перезагружаем systemctl, чтобы новые настройки успешно подхватили:
sudo systemctl daemon-reload
  1. Включаем sidekiq:
sudo systemctl enable sidekiq
  1. Теперь мы можем его стартовать/останавливать/рестартовать/проверять текущий статус:
sudo systemctl start|stop|restart|status sidekiq

Таск для Capistrano

  1. В config/deploy нужно добавить следующую таску, которая каждый раз после деплоя будет рестартовать sidekiq:
after :deploy, "deploy:sidekiq_restart"

namespace :deploy do
  desc 'Sidekiq restart'
  task :sidekiq_restart do
    on roles(:app) do
      execute :sudo, :systemctl, :restart, :sidekiq
    end
  end
end
  1. Чтобы наша таска корректно отработала, нужно дать ей доступ на сервере:
sudo visudo # Находясь на сервере, введите эту команду

%deploy ALL=NOPASSWD:/bin/systemctl restart sidekiq # Введите в самому внизу файла, это команду, сохраните изменения
  1. Всё. Комитим изменения, пушим в репозиторий и запускаем деплой:
cap production deploy

После чего заходим на сервер и проверяем работоспособность сайдика:

sudo systemctl status sidekiq

Status должен быть «active». Обратите внимание на время, когда был совершен последний запуск:

Active: active (running) since Wed 2020-03-11 19:19:07 UTC; 6s ago

Как видите всё работает. Теперь можете гонять свои фоновые задачи в хвост и в гриву)

Особенности деплоя assets в Rails (5.2, 6+) при помощи Capistrano

Всем привет!

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

На эту тему есть достаточно много гайдов и туториалов:

Один из таких туториалов, который я настоятельно рекомендую для новичков:
https://gorails.com/deploy/ubuntu/18.04

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

На одну из таких ошибок напоролся и я, когда настраивал капистрано для шестых рельс (А впервые я столкнулся с этой особенностью на рельсах 5.2. На версии 5.1, деплой проходит без проблем).

Проблема с компиляцией ассетов

Я столкнулся с тем, что у меня постоянно падал таск прекомпиляции ассетов: assets:precompile

Проблема заключалась в том, что капистрано падал с ошибкой: Status error code: 1, а в самом сообщении ничего отображалось (Nothing written). То есть капистрано просто отказывался работать дальше, но причину своего отказа не сообщал.

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

  1. Отсутствие необходимых библиотек и пакетов на сервере.
  2. Недостаточно ресурсов у VPS, в особенности оперативной памяти.

А вот теперь подробнее о каждой причине и что нужно сделать.

Отсутствие необходимых библиотек и пакетов на сервере.

Для компиляции ассетов на сервере, вам необходимо убедиться, что у вас установлен NodeJS, а начиная с версии 5.2 (и если у вас установлен gem ’webpacker’), то и Yarn

Проверить, что у вас установлены оба пакета на сервере:

node -v
yarn -v

Рекомендую ставить nodejs не ниже v8.16.0 (а ещё лучше 12 и выше). Если не знаете, какую версию чего ставить, посмотрите, какие версии пакетов у вас установлены локально.

Чтобы установить оба пакета, введите следующие команды на сервере:

Сначала NodeJS

curl -sL https://deb.nodesource.com/setup_12.x -o nodesource_setup.sh

nano nodesource_setup.sh

sudo bash nodesource_setup.sh

sudo apt install nodejs

Затем Yarn

curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - 
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list

sudo apt update && sudo apt install yarn

sudo apt update && sudo apt install --no-install-recommends yarn

После установки также проверьте версии пакетов, что всё установлено корректно.

Обратите внимание на другие гемы и библиотеки, с которыми вы работаете. Некоторые из них требуют свои зависимости. Например: в одном из моих проектов есть гем ’mini_magick’, для корректной работы которого требуется установка библиотеки ImageMagick.

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

Если видите, что капистрано ругается на nodejs или yarn, скорее всего, вам нужно обновить текущую версию одного или обоих пакетов и затем снова перезапустить деплой, командой: cap production deploy.

Другая ошибка связана с ExecJS Runtime. Это ошибка интересней и связана с тем, что у JavaScript есть разные стандарты. Чтобы их корректно различать, вам нужно подключить интерпретатор. Чтобы починить этот баг, вам нужно добавить в Gemfile и сделать bundle следующий гем:

gem "therubyracer"

Недостаточно ресурсов у VPS, в особенности оперативной памяти

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

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

Дело в том, что все свои приложения я размещаю на каплях (droplets) DigitalOcean и беру самый дешевый тариф с 1Гб оперативной памяти.

При компиляции ассетов «отжирается» практически вся память, из-за чего капистрано валится с неизвестной ошибкой.

Чтобы починить это, у вас есть два варианта: купить VPS с большим количеством ресурсов, либо создать файл подкачки (swap).

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

Однако, по-умолчанию, на сервере от DigitalOcean, эта возможность отсутствует. Файл подкачки нужно создать.

Создаем файл-подкачки (SWAP) на сервере

Я не буду расписывать то, что и так можно найти в интернете, просто дам ссылку на digital ocean, где достаточно подробно и на русском языке описан весь этот процесс: https://www.digitalocean.com/community/tutorials/how-to-add-swap-space-on-ubuntu-18-04-ru

Для решения проблемы с ассетами, вам нужно пройти с 1 по 5 шаг.

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

Для себя, кстати, я решил, что следующий проект буду деплоить при помощи CI, используя Docker. Я несколько дней потратил на то, чтобы подружить весь свой технический «зверинец» друг с другом и заставить их работать вместе. И, честно сказать, задолбался.

PS Поменьше вам ошибок и по-больше счастья при деплое ваших приложений! Аминь.

Итоги года 2019

Всем привет!

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

Жизнь в Москве

Если честно я сам офигел от того, как “оживилась” моя жизнь после переезда в Москву.

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

Сама Москва очень классная!))) И пусть иногда она на меня и нагоняет грусть-тоску из-за своей погоды (говорю это как бывший житель солнечного региона), но по всем остальным параметрам я здесь прям кайфую)

Концерты, выставки, архитектура — это всё здесь! Такого разнообразного досуга не предложит ни один город России, разве что Питер.

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

Посмотрите, какой потрясающий домик я нашёл на Патриарших прудах:

Не вся Москва такая, но гулять по «старой» Москве — это отдельный вид удовольствия. Хотя, даже и не в самых красивых зданиях (в промышленных или спальных районах) есть какая-то своя эстетика.

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

Концерт Static-X

Эпизод о котором бы хотелось рассказать отдельно)

В далеком 2004 году, когда я был студентом, то впервые познакомился с музыкой в жанре industrial metal, услышав песни группы Static-X. Я практически сразу влюбился в этот звук и в эту группу. Это было настолько обалденно и ни на что не похоже, что ровно с тех пор я мечтал попасть на их концерт, которых она никогда не давала до этого в России.

К сожалению, в 2014 году фронтмен этой группы, Уэйн Статик, умер и я распрощался со своей мечтой, пока в 2019 трое оставшихся участников не объявили о своем намерении организовать тур, сделав “замену” своему фронтмену (и подобрали я хочу сказать очень удачно).

И вот, спустя 15 лет, мне удалось это сделать) Я попал на их концерт в Москве. Я был на первом, мать его, концерте Static-X в России! Просто не передать словами как я счастлив.

Просто оставлю этот видос здесь:

Ещё около недели после концерта у меня болела шея, но оно того стоило!)

Новая работа: Баланс-Платформа

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

Компания называется Баланс-Платформа. Это финтех-стартап, клиентом которой являются банки. Я всё также пишу на руби, занимаюсь только бэкендом.

Также примечательно, что я всё ближе подбираюсь к Кремлю) Из Москва-Сити перебрался на Охотный ряд, на улицу Тверскую. Красная площадь, правда, у меня из окна не видна, но до неё идти минут 5, так что считай, что работаю в самом центре столицы.

Компания и задачи интересные. Коллектив хороший. А ещё я пересел на Mac и возвращаться на Linux пока не планирую.

Ещё интересно то, что со мной в компании работает автор книги по Руби Игорь Симдянов. Если изучаете руби, настоятельно рекомендую приобрести его книгу.

Я свою уже подписал)

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

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

RubyRussia 2019

В конце сентября я побывал на RubyRussia. Это ежегодная рубишная конференция, где Ruby-разработчики (и все им сочувствующие) встречаются вместе и обсуждают темы

сфоткался с Юкихиро Мацумото (создатель языка Ruby):

Также встретил ребят из Хорошего программиста — преподавателей и выпускников разных потоков.

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

Особенно понравился доклад Вани Немытченко (преподавателя интенсива, в котором я проходил обучение) про ООП:

Реально очень круто! Посмотрите, обязательно. Оно не только про программирование, но и в целом о процессе обучения.

Открыл брокерский счёт

Это самая неожиданная и обширная для меня тема, о которой я расскажу отдельно, но уже в следующем году.

Если вкратце, то в начале октября я открыл индивидуальный инвестиционный счет (ИИС) для торговли на фондовой бирже. Пока что получилось собрать небольшой инвестиционный портфель из дивидендных акций, корпоративных облигаций и фонда ETF (в долях примерно 60/30/10), который я планирую пополнять, ежемесячно откладывая 10% от зарплаты.

Цель простая: создать свой “пассивный” источник дохода, помимо заработной платы.

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

Мои проекты

В свободное от работы время я продолжаю заниматься своими проектами. Пока времени и сил хватает только на поддержку текущих (в основном убираю баги).

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

Меня всё также не покидает желание закрепится на рынке недвижимости, несмотря на “провал” ТвойЖК. Рынок недвижимости большой, у меня есть какая-то экспертность в этой области, поэтому очевидно, что нужно запускать свои проекты именно здесь.

Сейчас у нового проекта полностью готов дизайн (да, в этот раз я серьезно заморочился над визуалом), мне нужна верстка макетов, после которого можно активно писать код (часть которого уже готова).

В этом приложении я особенно сильно угорел по тестам и шаблонам проектирования. Впервые использовал многопоточность, работу с фоновыми задачами и более активно работаю с внешними API. Какими-то вещами в проекте горжусь особенно. Меня, например, радует, что я всё лучше пишу код, более тщательно продумываю архитектуру приложения. Для меня все личные проекты как полигон по отработке навыков и тестирования каких-то подходов и фич.

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

  • У меня есть код, который я переиспользую от проекта к проекту, что позволяет мне работать «быстрее».
  • Не всегда на работе бывают задачи, которые позволяют мне профессионально расти как разработчику и это очень важная проблема, о которой я также расскажу отдельно.

Короче, на этих праздниках я постараюсь закончить свой прототип, сделав базовый функционал.

Опубликую анонс когда всё будет готово.

Как оно вообще в целом и планы на 2020 год

У меня всё хорошо)

Наконец-то дошли руки до оформления загранпаспорта. Уже в новом году, ближе к середине весны, планирую выбраться заграницу (как раз и отпуск там будет).

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

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

C фронтенд разработкой у меня как-то не клеится... Была цель освоить ReactJS, но в моём стеке ещё столько технологий, которые нужно изучить, что на фронт уже просто не хватает времени.

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

P.S. Намереваю вам реализации всех ваших целей! Счастья вам и крепкого здоровья!

Алгоритмы, ReactJS и другие новости

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

Основная работа

Ну что могу сказать? Спустя полгода «жёсткой» коммерческой разработки, меня уже не пугает legacy-код) Я могу достаточно быстро развернуть любой проект и продебажить его, чтобы понять как он там работает.

За это время я успел поработать на трёх разных, достаточно крупных, рельсовых проектах и пощупать их изнутри. Все проекты работаю в связке Rails + ReactJS с примесью рельсовых вьюх (на Slim или на Haml).

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

И это меня конечно, несколько, демотивирует...

С другой стороны, есть возможность глубже изучить рельсовый код, посмотреть на работу разных гемов и погрузиться в инфраструктуру вокруг проектов (GIT, деплой, работа на сервере и так далее). В этом отношении появилась некоторая «беглость», что меня очень радует.

Алгоритмы

Я, наконец, взялся за своё фундаментальное образование и начал учить алгоритмы и структуры данных.

По алгоритмам и структурам данным настоятельно рекомендую книгу «Грокаем алгоритмы». Благодаря ей я понял, как работает быстрая и медленная сортировка, что такое O-большое, в чём особенности массивов, связанных списком и хэш-таблиц, а также много других интересных вещей.

Хоть весь код там написан на Питоне, мне достаточно просто и интересно было всё это переписать на Руби. Самое прикольное, что вместе с написанием кода и использования разных входных данных, приходит понимание, чем одни алгоритмы лучше других и почему они работают так, а не иначе.

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

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

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

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

Интересно, что какие-то из них я использовал ещё будучи не знакомым с ними) Сейчас изучаю порождающие паттерны, типа фабрик, но также структурные и поведенческие.

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

ReactJS

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

В процессе работы у меня было немного свободного времени на одном из проектов. Где я поковыряться с ним чуть более полно.

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

Получилось прикольно! Теперь хочу сделать свой блог в этой же связке.

SMM Collector

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

В общем и целом, всё хорошо)

32)

Привет. Вот и прошёл ещё один год моей жизни) Отличный повод подвести небольшие промежуточные итоги.

Оглядываясь назад, мне до сих пор не верится какой огромный путь я проделал за эти два года. А сколько событий произошло за это время! Жизнь увеличила свою интенсивность: ощущаю себя на гребне какой-то очень сильной, и завораживающей меня, волны. Могу точно про себя сказать, что жизнь моя началась именно после тридцати. Та самая, о которой я так давно мечтал.

Новые знакомые, куча разных возможностей и ещё несколько важных изменений, о которых должны знать только двое (и один из них я :) ). Ну и конечно же мой окончательный переход в веб-разработку и переезд в Москву.

За пять месяцев жизни в Москве я смог оказаться на концерте Muse в Лужниках, побывать на выставке Фриды Кало, увидеть спектакль «Дон Жуан» в театре «Сатирикон» (и ещё раз офигеть от актёрского таланта Константина Райкина), да и просто погулять по Москве (о-о-о, это отдельный вид удовольствия).

Знаете, я никогда не был скептиком или прожженным материалистом. Вообще для IT-шника у меня уж больно «магическое» мышление, не свойственное людям моей профессии. Магическое оно в том смысле, что я умудряюсь видеть закономерности там, где их, на первый взгляд, и быть-то не может. Но анализируя всё это «задним» числом, начинаешь осознавать, что всё это я когда-то уже ранее вознамерил, а затем просто и методично воплотил это намерение в свою жизнь. Со стороны кажется, что это было легко, но за этим всем скрыт чудовищный объём работы, если не пахоты.

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

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

Этого возможно добиться в двух случаях:

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

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

Но теперь я точно знаю, что всё будет хорошо!)

Новая работа, переезд и запуск SMM Collector

Всем привет. С момента последней записи, в моей жизни произошло несколько важных изменений.

Я запустил SMM Collector, нашёл работу Ruby on Rails разработчиком и переехал в Москву)

А теперь по порядку.

Москва и новая работа

Прошло ровно два месяца как я был принят на работу RoR разработчиком в одну из московских компаний, которая занимается разработкой на заказ.

Окончательно осознав, что в Краснодаре работу мне не найти, в середине января я решил испытать удачу, изменив в своём резюме: «Готов к переезду в Москву».

Каково же было моё удивление, когда резко выросло количество собеседований и откликов со стороны московских рекрутёров.

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

В общем, уже через неделю после принятия оффера, я оказался в Москве-сити.

И сразу сделал вот такое фото, для истории:

Для меня переезд был особенно волнительным мероприятием, так как последние 14 лет я прожил в Краснодаре.

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

А вот такой вид открывается из окон офиса:

О самой работе возможно расскажу как-нибудь в другой раз. Но если коротко, то мне повезло. И с проектами и с командой.

Сейчас один рабочий день по интенсивности проходит как три. За эти два месяца

  • Я, наконец, узнал что такое коммерческая разработка.
  • Стал лучше понимать как работает React и как он взаимодействует с рельсами через API.
  • Теперь больше и глубже работаю с Git.
  • Задеплоил приложение на 4-х разных серверах, используя Docker
  • Настроил CI в Jenkins для production окружения.
  • А ещё я очень много дебажу)

Работы много и она интересная. Приходится очень быстро учить разные вещи и сразу внедрять их в работу. Это стресс, но пока мне всё нравится)

SMM Collector

Ещё я, будучи уже в Москве, доделал и запустил свой второй SaaS-проект: https://smmcollector.ru

Это сервис поиска целевой аудитории для таргетированной рекламы ВКонтакте.

Там реализовано всё, что я планировал сделать на первом этапе:

  • Реализовал ServiceObject паттерн, добавив новый слой, чем существенно облегчил себе жизнь.
  • Отрефакторил код, который переиспользовал после предыдущего проекта. Стало красивее)
  • Научился работать с API ВК, реализовав сложные сценарии для поиска.
  • Поработал с отложенными задачами (пощупал CRON).
  • Глубже поработал с AJAX.
  • И сделал ещё кучу других интересных (и не очень) задач.

Когда я уже всё сделал и запустил тестовую рекламу, то обратил внимание, что регистраций много, но оплат практически нет.

Доступ к сервису по модели: «Плати сколько хочешь»

Я долго думал и решил, что не буду пока брать за этот продукт деньги.

Любой пользователь ВКонтакте может зайти в личный кабинет и начать работу c сервисом абсолютно бесплатно.

Сейчас, в планах собрать первую базу пользователей, расширить функционал и получить отзывы.

А после того как доведу продукт до ума, то введу за него плату.

Вот как-то так всё)

Ранее Ctrl + ↓