Skip to content

Instantly share code, notes, and snippets.

View davydovanton's full-sized avatar
:shipit:
Working from home

Anton Davydov davydovanton

:shipit:
Working from home
View GitHub Profile
@davydovanton
davydovanton / Grafana Alert Template.md
Created November 21, 2023 15:36 — forked from gelldur/Grafana Alert Template.md
How to use Grafana Alerts with the Telegram
  • Template name: telegram.message
  • Content:
    {{- /* Telegram message to use: {{ template "telegram.message2" . }} */ -}}
    {{ define "__alerts_list" -}}
    {{ range . }}
    {{if ne (index .Labels "alertname") "" -}}
    {{ if eq .Status "firing" }}🔴{{ else }}🟢{{ end }}
        {{- if ne (index .Labels "severity") "" -}}
            <u><b>P{{ index .Labels "severity" }}</b></u> {{ end -}}
@davydovanton
davydovanton / text.md
Last active August 11, 2023 13:33
Рефакторинг сервис объекта с монадами и AR

https://t.me/pepegramming

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

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

Исходные данные

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

require_relative './container'
module Dry
module AutoInject
class Strategies
class Kwargs
def included(klass)
included_items
super
end

Пример рефакторинга с использованием транзакций

Опять рассмотрим tasks#create экшен.

В экшене 3 разных логики, которые выполняются последовательно:

  1. валидация данных - необходимый шаг;
  2. сохраниение таска - необходимый шаг, если какая-то ошибка, необходимо возвращать failed значение;
  3. отправка нотификаций - мы не хотим, что бы наша транзакия не выполнялась, если отправка нотификации не выполнится;

Поэтому напишем нашу транзакцию. Так же мы будем использовать Either монаду для возвращения статуса шага транзакции. Right для успешного, Left - не успешного:

@davydovanton
davydovanton / gist:948934dd69856ae1c766
Last active April 12, 2021 09:25
Ruby string interpolation benchmark
require 'benchmark'
first = 'first'
second = 'second'
n = 1_000_000
Benchmark.bm do |x|
x.report('string interpolation: '){ n.times { "#{first}_#{second}" } }
x.report('string interpolation #2: '){ n.times { first + '_' + second } }
x.report('string interpolation #3: '){ n.times { "%s_%s" % [first, second] } }
x.report('join array: '){ n.times { [first, second].join('_') } }
@davydovanton
davydovanton / operations.md
Last active June 25, 2020 09:31
Operations

Пример из pepegramming канала

Задача

Есть экшен в рельсе, который создает инвойс:

def create
  invoice = Invoice.new(params[:invoice])

 if invoice.save

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

def function(foo, bar)
  result = if foo > bar
    10
  else
    "wrong"
  end
end
require 'dry/monads'
require 'dry/monads/right_biased'
require 'dry/monads/result'
require 'dry/monads/maybe'
module Dry
module Monads
module RightBiased
module Right
def deconstruct
Hello!
Some information about hanami workshop.
Requirements:
* ruby 2.5+ (and bundler)
* postgresql (9.6.2+)
Before start workshop please install hanami gem to your system