Богдан Стефанюк

Заметки о программировании, путешествиях, плёнке и разных интересностях
Обо мне  •  Список заметок

Вечерний Киев и Kodak Vision3 500T

Протестировал киноплёнку Kodak Vision3 500T. Так как она предназначена для съёмки с искусственным светом — прогулялся с ней вечером после работы. Что сразу бросается в глаза так это насыщенный красный цвет. Днём использовал без фильтра из-за чего картинка немного синеватая, как по мне, в этом есть свой шарм.

В дополнение: Проявка кинопленок. ECN-2 или C-41?

2019

Решил подвести небольшие итоги уходящего года.

Увлечение года — плёночная фотография

Больше года думал о том, чтобы попробовать поснимать на плёнку. Никак руки не доходили до того, чтобы начать. Этот процесс ускорила девушка, подарив на день рождения фотоаппарат. На этот день как раз приходила поездка в Амстердам, взял с собой 4 катушки и начал снимать. После приезда думал, что результат будет не очень, но на самом деле приятно удивился. Сегодня плёнка для меня не только как способ зафиксировать момент, но и медитативный процесс. Потом купил ещё 2 камеры, отснял > 30 катушек, каждый раз пробуя новую.

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

Про пленку хорошо рассказал Сергей Король в своих постах.
Почему я снимаю на пленку
Хочу снимать на пленку. С чего начать?
Вопросы про пленочную фотографию

Событие года — смена работы

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

Путешествия

Год выдался насыщенным на путешествия. Посетил 4 страны, из которых больше всего запомнились поездки в Рим и Амстердам. Амстердам стал для меня первой поездкой в этом году, а также реализовал давнюю мечту — отпраздновать день рождения здесь. Рим зацепил архитектурой, узкими улочками и приятным морем. Потом была поездка с компанией друзей в Турцию, Мармарис показался скучным по сравнению с прошлогодней поездкой в Кемер. Запомнилась экскурсия по островам на яхте, где посетили не только сами острова, но и плавали в море.

Транспорт Растояние
Поезд 8365 км
Автобус 1548 км
Машина 2430 км
Самолет 6833 км

Небольшая статистика преодаленного расстояния

Покупки года

Canon Canonet QL17

Любимая плёночная камера на сегодня. Купил, чтобы постоянно таскать с собой, так как лёгкая и приятная в управлении. С её помощью начал больше фотографировать. Раньше это было проблематично, так как носить с собой 1,5кг зеркалку неудобно. Осталось только достать для неё вспышку и будет полный комплект.

Мышка Logitech M590
Писал о ней в обзоре. Считаю лучшей мышкой для мака и не только. Может одновременно работать с двумя компьютерами, пришёл на работу — подключил к рабочей машине, дома — к ноутбуку. Поддерживает дополнительные жесты, к которым так привыкаешь на маковском тачпаде.

Новый софт

Things 3
Удобное todo приложение, до него пробовал больше 10 приложений, но ни одно не удовлетворяло полностью. Здесь ситуация другая, приложение имеет красивый, логичный интерфейс. Набор функций сведён к минимуму, есть только то что нужно. Полезная особенность — окно быстрого ввода, записывай мысль из любого места в системе. Минусы, это: цена и поддержка только техники Apple. Радует, что разработчики постоянно выкатывают новые обновления, которые содержат как новые фичи, так и улучшения для уже существующих.

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

Rider
Кросс-платформенная IDE для C#. Вот и настал тот момент, когда отказался от Visual Studio. Райдер быстрее и функциональнее. Важный фактор — поддержка MacOS, так как версия студии под мак бесполезная и неудобная. Содержит мощный набор инструментов для работы с базами данных, JavaScript-ом и рефакторингом. На новом месте работы вернулся в Visual Studio, так как пока нельзя использовать Rider, но для личных проектов остался незаменим.

Музыка

Любимый русский панк-рок коллектив.

Старый добрый Nickelback постоянно возвращает в мои школьные года.

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

Разные достижения

Посидел полтора месяца на диете. Как результат — скинул ~10 кг. Пока рано расслабляться, еще есть над чем работать в следующем году.

Начал вести дневник, записываю туда мысли и рефлексирую.

Начал ставить цели на месяц и неделю. Применил несколько методик: Agile Results, GTD, P.A.R.A.

Написал магистерскую работу, в следующем месяце защита и выпуск.

Планы на 2020

  • Пройти assessment на сеньор разработчика.
  • Сдеть экзамен на сертификат GCP: associate cloud engineer.
  • Подтянуть английский язык.
  • Посетить 3 новые страны.
  • Сдать экзамен разработчика C# от Майкрософт.
  • Найти идею для проекта, который будет переть.
  • Разобраться с версткой, научиться делать адаптивные сайты.
  • Снять фильм года. Что это такое?
 Нет комментариев    91   14 дн  

Ссылки — 19

Рандомное фото на пленку.

Идеи для программистов

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

Некоторым везёт, и они быстро попадают в классную команду на крутой проект. Кому повезло меньше, сидит в суровом энтерпрайзе и жаждет поделать какой-нибудь пет-проджект для души. Вот только идеи нет…

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

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

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

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

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

Оригинал статьи: https://t.me/anatoly_burov_channel/116 

stateless и stateful сервисы

Пример stateful системы
Например наша система хранит в себе сессии пользователей, тем самым ответ на запрос пользователя зависит от состояния (сессии). При масштабировании сервиса, нам прийдется переносить все сессии на новый инстанс. Система стает сложной и не маневренной. Любой stateful сервис можно превратить в stateless, вынеся состояние в отдельный сервис и БД. Так мы можем вынести сессии во внешнее хранилище, сама система осталась stateful, но сам веб сервис stateless, тем самым мы можем просто его реплицировать.

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

Еще один пример
У нас есть интернет магазин — пока корзина пользователя хранится в памяти сервера, то это stateful. И у нас сразу возникают проблемы с масштабированием. Но когда мы выносим хранения корзины во внешний session storage — наш сервис становится stateless и мы можем спокойно его масштабировать, так как состояние хранится у нас в отдельном хранилище.

Очень советую почитать статью на RSND по данной теме.

Kodak ColorPlus 200 pushed to 400 ISO

Выбрался на прогулку, взяв с собой фотоаппарат, зарядил пленку, но ISO не выставил. Cделал 30 кадров и только тогда заметил что сделал я их с ISO 400. Оказывается ColorPlus может пушится, посмотрел на примеры и вот что получилось у меня. Очень хороший результат как для самой дешевой пленки.

Как я делал бота для Facebook workplace

Дали мне задачу: написать бота для мессенджера workplace, с помощью которого можно получать уведомления из нашей CRM и управлять разными вещами. Расскажу о разных интересных вещах с которыми я столкнулся. Бота писал с помощью ASP.NET Core Web API.

Вебхуки

Для того чтобы бот мог обрабатывать запросы и сообщения от Facebook нам надо настроить вебхуки. Webhook — механизм оповещения системы о событиях. Для того чтобы Facebook принял наш хук, он должен обрабатывать как GET так и POST запросы.

Подробнее о Webhook в официальной документации

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

Показать код метода-обработчика GET запроса

public IActionResult Receive(
[FromQuery(Name = "hub.mode")] string mode,

    [FromQuery(Name = "hub.challenge")] string challenge,

    [FromQuery(Name = "hub.verify_token")] string verifyToken)
{

   if (string.IsNullOrEmpty(verifyToken)) {

       return Unauthorized();

    }


    if (verifyToken.Equals(FacebookEnvironment.FacebookVToken)) {

        return Ok(challenge);

    }

    return Unauthorized();

}

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

Показать код метода-обработчика POST запроса

public async Task<IActionResult> Receive([FromBody]FbResponse response = null)
{
    if (response is null) {
        return BadRequest();
    }

    if (response.Object != "page") {
        return Ok();
    }

    foreach (var entry in response.Entries) {
        foreach (var message in entry.Messaging) {
            await PrepareMessageAsync(message);
        }
    }
    return Ok("EVENT_RECEIVED");
}

Авторизация запросов Facebook

Для авторизации Facebook использует специальный http заголовок (X-Hub-Signature), в нем он передает некую сигнатуру с помощью которой мы можем авторизовать запрос. Для того чтобы добавить такую функциональность в наш контроллер, добавим фильтр.

Пример кода, для проверки подписи

private const string Sha1Prefix = "sha1=";

public static bool Validate(string signature, string contentString) {
    if (!signature.StartsWith(Sha1Prefix, StringComparison.OrdinalIgnoreCase)) {
        return false;
    }
    var secret = Encoding.ASCII.GetBytes(FacebookEnvironment.AppSecret);
    var signatureWithoutPrefix = signature.Substring(Sha1Prefix.Length);
    var content = Encoding.ASCII.GetBytes(contentString);
    return GetIsHashValid(secret, signatureWithoutPrefix, content);
}

private static bool GetIsHashValid(byte[] secret, string signature, byte[] content) {
    using var hmac = new HMACSHA1(secret);
    var hash = hmac.ComputeHash(content);
    var hashString = ToHexString(hash);
    return hashString.Equals(signature);
}

private static string ToHexString(IReadOnlyCollection<byte> bytes)
{
    var builder = new StringBuilder(bytes.Count * 2);
    foreach (var b in bytes)
    {
        builder.AppendFormat("{0:x2}", b);
    }

    return builder.ToString();
}

Тестирование бота

Как установить letsencrypt сертификат для IIS. Если же вы используете связку в виде ubuntu и nginx вам подойдет эта инструкция.

Для тестирования нужно развернуть бот на сервере, который смотрит в мир. Также необходимо чтобы у сервера было доменное имя и валидный SSL сертификат. В моем случае, в качестве сервера выступала машина на винде, так как другой внутри нашей сети не было. Как мне показалось захостить приложение написанное на .NET Core намного проще под Ubuntu + nginx нежели под Windows + IIS. В качестве поставщика сертификатов выбрал letsencrypt, так как они предоставляют бесплатный сертификат на 3 месяца, с возможностью дальнейшего обновления.

Ранее Ctrl + ↓