Кальянная программистов
198 subscribers
86 photos
11 videos
2 files
66 links
Стримы, видосы из Нью-Йорка 🇺🇸
Нежным не входить‼️ @programmers_hookah_chat
@beard_programmer
Download Telegram
Кальянная программистов
Немного апдейтов с поиском работы 🇺🇸 (Это отказы если че, я там на откликался штук 20-30 раз)
Для крыс 🐀 подкину контент а для нас - тему для расизма🇮🇳🇺🇸.

WHAT THE FUCK IS INDIA EXPERIENCE?
😁5🌚1🤣1
This media is not supported in your browser
VIEW IN TELEGRAM
🔥4
This media is not supported in your browser
VIEW IN TELEGRAM
4
Кальянная программистов
я тоже пару-тройку месяцев назад общался с парнями Salebot, там мне интервьювер кинул участок кода с проекта где нужно было найти уязвимости и расшифровать что это такое. Не самое лучшее зрелище, я вам скажу Го код ревью сделаем? С собеса (Ruby, source): …
Руслан кстати этот код порефакторил с помощью богомерзких великолепных Монад


class MoveMessages
include Dry::Monads[:result]
include Dry::Transaction

MovementParams = Dry::Schema.Params do
required(:messages).filled { array? & min_size?(1) }
required(:x).filled(:integer)
required(:y).filled(:integer)
end

step :validate_params
step :fetch_messages
step :prepare_undo_data
step :find_connections
step :update_message_positions
step :update_connection_vertices

private

attr_reader :project, :movement_params, :messages, :connections_to_update, :for_undo

def initialize(project)
@project = project
@for_undo = []
@connection_ids = []
@connections_all = []
end

def validate_params(params)
validation = MovementParams.call(params)

if validation.success?
@movement_params = validation.to_h
Success(params)
else
Failure(validation.errors.to_h)
end
end

def fetch_messages(params)
message_ids = movement_params[:messages]
@messages = project.messages.where(id: message_ids)
verified_ids = @messages.pluck(:id)

Success(verified_ids)
end

def prepare_undo_data(verified_ids)
@for_undo = messages.map(&:attributes)
Success(verified_ids)
end

def find_connections(verified_ids)
@connections_to_update = MessageConnection.where(
"(message_a_id IN (?) OR message_b_id IN (?)) AND vertices != ''",
verified_ids,
verified_ids
)
@for_undo.concat(connections_to_update.map(&:attributes))

Success()
end

def update_message_positions(_)
x_offset = movement_params[:x]
y_offset = movement_params[:y]

messages.update_all("x = x + #{x_offset}, y = y + #{y_offset}")
@messages = project.messages.where(id: movement_params[:messages])

Success()
end

def update_connection_vertices(_)
x_offset = movement_params[:x].to_i
y_offset = movement_params[:y].to_i

connections_to_update.each do |connection|
next if connection.vertices.blank?

vertices = JSON.parse(connection.vertices)
new_vertices = vertices.map do |vertex|
{
x: vertex["x"].to_i + x_offset,
y: vertex["y"].to_i + y_offset
}
end

connection.update(vertices: new_vertices.to_json)
end

Success(
messages: messages,
connections: connections_to_update,
undo_data: for_undo
)
end
end

# Usage:
# result = MoveMessages.new(project).call(params)
# if result.success?
# # Handle success
# else
# # Handle failure
# end


👍 🥲 🙈
👎2
Кальянная программистов
Руслан кстати этот код порефакторил с помощью богомерзких великолепных Монад class MoveMessages include Dry::Monads[:result] include Dry::Transaction MovementParams = Dry::Schema.Params do required(:messages).filled { array? & min_size?(1) } …
Это все тот же наркоманский код, но без степов и монад и собачек со стейтом.

Теперь это наркомария с вайбами голанга и эликсира.


class ValidatedParams
private_class_method :new
attr_reader :messages, :x, :y
def self.build(messages:, x:, y:)
case [messages, x, y]
in [Array => m, Integer, Integer] if 1 <= m.size then
[:ok, self.new(messages: , x:, y:)]
else
[:error, 'Bad input'] # Lazy error
end
end

def initialize(messages:, x:, y:)
@messages, @x, @y = messages, x, y
end
end

module MoveMessages
extend self

def call(project, params)
res = ValidatedParams.build(*params)
return res if res in [:error, *]

res => [:ok, validated_params]
res = fetch_messages(project, validated_params.messages)
return res if res in [:error, *]

res => [:ok, messages]
res = fetch_connections_to_update(messages.pluck(:id))
return res if res in [:error, *]

res => [:ok, connections_to_update]
undo_attributes = messages.map(&:attributes) + connections_to_update.map(&:attributes)

res = update_messages(messages, validated_params)
return res if res in [:error, *]

res = fetch_messages(project, validated_params.messages)
return res if res in [:error, *]

res => [:ok, messages]
res = update_connection_vertices(connections_to_update, validated_params)
return res if res in [:error, *]

[
:ok,
messages: messages,
connections: connections_to_update,
undo_data: undo_attributes
]
end

private

def fetch_messages(project, ids)
[:ok, project.messages.where(id: ids).load]
end


def fetch_connections_to_update(verified_ids)
[
:ok,
MessageConnection.where(
"(message_a_id IN (?) OR message_b_id IN (?)) AND vertices != ''",
verified_ids,
verified_ids
).load
]
end

def update_messages(messages, validated_params)
x_offset = validated_params.x
y_offset = validated_params.y

return [:error, "WTF"] unless messages.update_all("x = x + #{x_offset}, y = y + #{y_offset}")

[:ok, nil]
end


def update_connection_vertices(connections_to_update, validated_params)
x_offset = validated_params.x
y_offset = validated_params.y

connections_to_update.each do |connection|
next if connection.vertices.blank?

vertices = JSON.parse(connection.vertices)
new_vertices = vertices.map do |vertex|
{
x: vertex["x"].to_i + x_offset,
y: vertex["y"].to_i + y_offset
}
end

connection.update(vertices: new_vertices.to_json)
end
[:ok, nil]
end
end

def Usage
# Usage:
result = MoveMessages.call(project, params)
case result
in [:ok, value]
# Handle success
in [:error, message]
# Handle failure
else raise StandardError "WTF"
end
end



👍🙈
🙈6👍1
[ENGLISH]
Наткнулся на этого чувака “when your friend is a salesman” и не могу перестать смеяться 🤣

Я теперь понимаю что чувствуют некоторые мои друзья при общении со мной🙈

@netWorkStorm @sdaaaaaaasad «Отлично, понял тебя! А что ты имеешь в виду под словом Мышление

Does that sound about right?
О чем я в сторис говорил - в общем я попал на особоый такой маркетплейс авито по услугам для рекрутеров.

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

Бомжам криптанам не надо облегчать жизнь.

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

Куплю фронтендера синьора за 10% + печеньки.


PS ну а я ща пойду это исследовать чтобы себе работу искать
😁5🌚1
Кальянная программистов
Утро в хату. Как надо вкатываться а АйТи? (Анон)
Закрываю опрос. Резолюция нашей кальянки - или идешь в айти мидлом или не идешь в АйТи вовсе.
😁6
Media is too big
VIEW IN TELEGRAM
We don’t need perfect code. We need deliverables.
It’s not rocket science (c)

Маверик-хаккатон-точка-ио

Согласны?
👍5
СТРИМ СУББОТА 23:00 МСК GMT+3
Код-ревью ака разбор тестового задания на Golang.

Привет друзья. Давно стримов не было, а тут как раз выходные и как совпало - мой товарищ сделал тестовое задания на Go разраба для одной конторы и попросил чекнуть. Я решил сделаем в формате стрима онлайн код ревью.


Что?
Стрим с онлайне код ревью тестового задания Go бекенд.

Когда?
Суббота 3 мая 23:00 МСК GMT+3

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

Где?
Здесь, в телеге.

Че по крысам? 🐀
Крысы приветствуются, как и хомяки и прочие твари.

Зачем?
Потому что надо.

СТРИМ СУББОТА 23:00 МСК GMT+3
СТРИМ СУББОТА 23:00 МСК GMT+3
СТРИМ СУББОТА 23:00 МСК GMT+3


Придешь? 👇
51👍1
Live stream scheduled for