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

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

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

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

Всем привет!

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

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

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

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 сервисом абсолютно бесплатно.

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

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

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

О работе, митапе, Руби и Краснодаре

Привет.

Перед Новым Годом у меня в жизни всегда происходит какой-то кризис. Сейчас, например, у меня резко прекратился поток заказов на фриланс (вёрстку сайтов). Пока нет заказов делаю свой второй проект на рельсах по сбору аудитории из ВКонтакте для настройки рекламы.

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

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

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

В итоге, я всё же сделал базовый MVP (выгрузил в прод), правда всего с одной рабочей функцией. Остальные страницы я пока «закрыл» и буду добавлять и открывать по мере готовности. Сделаны все стили, приложение работает на мобильных устройствах (хотя в этом и нет особого смысла), но его нужно ускорить, так как есть проблема со скоростью загрузки страниц. С текущими скриптами не работает turbolinks. Пока не пойму почему .

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

Как я на митап сходил и рубистов нашёл.

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

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

Видео с митапа, где я общаюсь с двумя рубистами:

Из беседы я узнал, что:

  • В Краснодаре всего два работодателя, которые что-то пишут на Руби.
  • Практически большинство сильных рубистов уезжает либо в Москву, либо заграницу, так как в регионе нет рынка для этого языка / технологии. А если работа и есть, то она очень хорошо прячется).

И это на самом деле грустно, потому что устроится на работу Rails разработчиком здесь с небольшим опытом практически невозможно. Либо совсем уже работать «за еду», чего я объективно не могу себе позволить в силу возраста (я уже давно не студент).

И дело даже не в моих запросах. У меня коллега работал в местной компании на должности Junior-а за 15000 рублей в месяц, без какого-либо обучения. А со специалиста Strong Junior, зарплата которого 35 тыс. рублей, спрос как с Middle. И это в Краснодаре.

Отчасти это происходит потому, что соискателей больше, чем работодателей. Типичные законы рынка, спроса и предложения. Это нужно просто принять.

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

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

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

В общем, для меня сейчас очень важно влиться в какой-то проект по найму. Если не найду удаленную работу, буду искать счастья в столице.

Про Руби и Питон.

Изучая рынок труда в Краснодаре я вспомнил забавную историю о том, как в 2016 году впервые выбирал свой первый язык для серверной разработки. На тот момент я работал интернет-маркетологом в строительной компании, но уже подумывал о том, чтобы стать веб-разработчиком. И вот после работы, по вечерам, я учился писать свой код и верстал простые странички на HTML и CSS.

Изначально, мой выбор был между Руби, Питоном и ПХП.

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

  1. Лёгкость изучения.
  2. Востребованность на рынке сейчас.
  3. Перспективы в дальнейшем.

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

Тогда всей хейтили ПХП, мне он тоже не сильно нравился из-за своего синтаксиса.

В итоге, в самом начале своего пути, я остановил свой выбор на Руби (как мне тогда казалось, из-за его лёгкости). Помню как первый раз в жизни устанавливал Ubuntu, а затем два дня пытался установить Руби и Рельсы. Было много боли и слёз.

Однако тогда я ничего не понял в Руби. Для меня это была какая-то клинопись. Да и Рельсы для меня казались космосом. Интересно, что в Руби меня сильнее всего запутывал и смущал его синтаксический сахар. Мне тогда казался непостижимым например такой код:

arr.each { |n| arr_new << n + 1 }

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

В итоге я решил попробовать Питон. Каково же было моё удивление, когда я узнал, что он уже был установлен в Ubuntu). Я воспринял это как знак Вселенной и погрузился в его изучение.

Мне понравился его синтаксис и ООП. Хороший и понятный язык. Но когда пришёл черёд изучать Джанго (я ведь хотел заниматься вебом), то понял, что ни черта не понимаю. Я учу-учу язык, копаюсь в фреймоворке, а сайта как не было, так и нет.

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

Самое страшное, что может приключится в ПХП, это то, что у тебя всё сразу начнёт получаться. Это как наркотики. Сначала тебе хорошо (в малых дозах). Ну подумаешь, что синтаксис немного сложный. Зато несколько строк и вот у тебя отправка почты готова. Но как только доза увеличивается (я дошёл до ООП) у меня начался жёсткий «bad trip». Как будто я спустился в ад. Сравнивая ООП этого языка с тем же Питоном, я понял, что больше не хочу ничего на этом писать. Никогда.

Я прошёл все стадии: отрицание, гнев, торги, отчаяние и наконец, принятие и вернулся на Руби. Мой опыт от знакомства с Питоном и ПХП не прошёл бесследно. После них, синтаксис и ООП Руби показались мне чем-то потрясающе понятными и простыми для применения.

Я полюбил этот язык. Круг замкнулся, я остался писать на Руби. Да и Рельсы теперь выглядели понятнее.

Так вот, ещё в 2016 году я мониторил рынок вакансий на Руби и Питоне в Краснодаре. И тогда было 0 и 8 вакансий, соответственно.

Сейчас соотношение такое: около 1,5 вакансии на Руби, и больше 60 на Питоне. Причём у Питона есть много вакансий с уровнем Junior, да ещё с хорошей оплатой на старте.

Если смотреть на  Upwork, то по ключевому слову Ruby выводится около 600 вакансий и 2500 на Питоне.

Если смотреть российский рынок труда, то около 80% всех вакансий по Руби находятся в Москве.

К чему я всё это говорю?

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

В общем, если не найду работу здесь, то буду идти на Москву)

Фрилансим, пилим очередной стартап и думаем о будущем.

Алоха!

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

А потом я подумал, а почему бы мне об этом не написать в бложик?)

Новостей не так, чтобы много, но они есть.

Фриланс

Я развязался с SimpleAdmin и вновь вернулся на вольные хлеба. Сейчас занимаюсь фрилансом по старым клиентам, плюс беру интересные заказы на биржах. В основном пишу парсеры на mechanize и nokogiri. Все парсеры есть здесь.

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

Новый проект

Кроме того, я медленно, но верно делаю SMM Collector — сервис для сбора аудитории.

Сейчас готов основной лендинг и я работаю над внутренним кабинетом.

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

Вот так сейчас выглядит внутренний кабинет:

Что уже сделано с последней новости:

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

Что ещё предстоит сделать:

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

И всё. После этого можно деплоить в прод)

Разработка происходит относительно быстро, что меня радует.

Обновление приложения «Твой ЖК»

Первое приложение, как первая любовь — остаётся в твоём сердце навсегда)

Я не забил на него, продолжаю развивать и поддерживать.

Если коротко, то я поменял модель оплаты. Снизил стоимость до 800 рублей и изменил тарифы. Теперь клиент оплачивает не за месяц, а за проверки. То есть оплатив 800 рублей, он получает неограниченный по времени доступ, пока не истратит все свои проверки.

У меня нет иллюзий по поводу того, что эти изменения кардинально увеличат вероятность покупки, но даже если у меня будет 1 продажа в неделю, это лучше чем 0.

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

Плюс Росреестр продолжает подкидывать сюрпризы.

Он установил капчу на каждый свой поиск.

Я два дня потратил на то, чтобы решить эту проблему! Копался с гемами типа captcha_solver и напрямую с библиотекой распознавания изображений tesseract-ocr, но ничего не заработало. В итоге, я тупо купил доступ к AntiCaptcha, настроил проверку и оно заработало.

Правда теперь время парсинга с 10 секунд увеличилось до 1-2 минут, но оно работает и это главное.

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

Возвращаясь к «ТвойЖК». Теперь я буду заниматься только маркетингом приложения, пытаясь увеличить естественный трафик. Тратить на продвижение сервиса деньги, я точно не хочу.

Самообразование

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

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

Я отобрал для себя то, чем буду заниматься в ближайшем будущем, в течение 2-3 месяцев.

RSpec и TDD

Не смотря на то, что на курсе ХП я изучал тестестирование, нужно признать, что я плохо понимаю как работает RSpec и как вообще писать хорошие тесты. Я не уделяю этому достаточно внимания в моей текущей работе. То есть в моих приложениях тестов нет. И это плохо...

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

Для себя я добавил в список для изучения Майкла Хартла, который написал книгу по Rails 5. Я пробежал по ней взглядом и обнаружил, что он перед написанием основного кода, сначала пишет тесты. Прежде чем копать документацию RSpec мне нужно привить эту практику (TDD) в своей повседневной работе, плюс подтянуть английский, поэтому в ближайшее время начну делать по ней клон Твиттера, плюс ещё раз освежу знания по рельсам.

Но делать я это буду как только закончу своё второе приложение. Хочется поскорее сделать запуск. Все мысли сейчас только об этом.

Redis и Sidekiq

Одно время я хотел использовать эти технологии в «Твой ЖК», когда мне нужно было реализовать отправку писем по расписанию, через день после регистрации, но оказалось что Sidekiq не работает без Redis. Задача показалось сложной и я отложил её до лучших времён. В итоге, мне так и не довелось поработать с Job-ами.

Я вижу частое упоминание Redis-а и Sidekiq в вакансиях, понимаю их пользу и для чего они нужны, но до этого не применял их. Скорее всего также займусь ими одновременно с RSpec, параллельно изучая Хартла.

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

ООП, паттерны проектирование и следование styleguide

А это я уже делаю сейчас. Читаю Сэнди Метц, её Ruby ООП. Расширяю кругозор, смотря в сторону ServiceObject и PhormObject. Плюс мне довелось глубже поработать с модулями.

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

Вот такие вот новости)

Ранее Ctrl + ↓