Getting the transcript
Reading the captions from YouTube. A video nobody has opened here before takes 10 to 30 seconds; this page fills in on its own.
Reading the captions from YouTube. A video nobody has opened here before takes 10 to 30 seconds; this page fills in on its own.

ШОРТКАТ: Golang — менторская программа · @shortcut_go
Words
10,579
Runtime
1:32:04
Speaking pace
115wpm
Reading time
44min
115 words per minute, below the 160 25th percentile of 349 measured videos. That distribution comes from the 349-video hook study.
Opening (first 30 seconds)
Привет- привет. Меня зовут Дима. Я более 10 лет в айтишке. Из них около семи являюсь лидом. Лидел в вкашечке, почту, облако и календарь. И потом перешёл в стартапчик TR, где трудился как директор в инженеринг. Но, несмотря на ледовый experience, я также каждый день пишу код и люблю писать код. Поэтому опыта кодинга всё ещё достаточно много.
58 words, the words spoken in the first 30 seconds at 115 words per minute.
Free, no signup. See how the first 30 seconds hold attention, with rewrites.
Sentence shape
| Measure | This transcript |
|---|---|
| Sentences | 1,116 |
| Average words per sentence | 9.5 |
| Longest sentence | 65 words |
| Questions asked | 153 |
| Sentences containing a number | 62 |
Most used terms
What this transcript is
Every word below is the caption track YouTube publishes for this video, pulled from the video itself and reproduced unchanged. It is not Prepublish's writing, not a summary, and not a re-transcription: it is the video's own published captions. Russian captions, generated automatically by YouTube, in the video’s original language. Source: the video on YouTube. A channel that would rather this page did not exist can ask for its removal through the contact page, and it is removed.
No Script X-ray for this video: YouTube shows a Most replayed graph only once a video has enough views.
Привет- привет. Меня зовут Дима. Я более 10 лет в айтишке. Из них около семи являюсь лидом. Лидел в вкашечке, почту, облако и календарь. И потом перешёл в стартапчик TR, где трудился как директор в инженеринг. Но, несмотря на ледовый experience, я также каждый день пишу код и люблю писать код. Поэтому опыта кодинга всё ещё достаточно много. И сегодня я буду интервьюировать Алексея. Алексей, расскажи немножечко о себе, пожалуйста. >> Да. Всем привет, ребят. Меня зовут Алексей. Я, получается, экс-стажёр в Авито. Из интересного, те, кто давно смотрит, вот уже выступление, ну, Мок интервью Димы и Димы. А я был в команде Саша Сахарова 2 недели. Кто, наверное, смотрел Ична навыки, должен его помнить. А получается, коммерческого опыта на Гошке у меня 6 месяцев, полгода. А так вообще Гошку я уже изучаю там чуть побольше 2 лет. О'кей. Классно. Классно. Хорошо. У тебя, кстати, был шанс ознакомиться с кодом, который я шарил. ознакомился >> или ещё нет? >> Немножко. Так, >> немножко. А, ну о'кей, давай посмотрим, как это прошло. Пошать, пожалуйста, свою свой редактор, и мы начнём разбираться. Я пока расскажу, как мы построим интервью. >> А так как я нанимающий менеджер и у нас немножко рынок работодателя, я хочу, чтобы человек, когда приходит, максимально быстро начал разбираться в коде, который у нас в компании есть, и начинал работать. И поэтому я ценю в кандидатах быстро возможность быстро разобраться в том, что кот делает, понять какие-то ошибки, понять какие-то проблемы. А так как мы рассматриваем Алексея на более Jun midle позицию, то я буду больше акцентировать внимание на каких-то кордеталях в коде, которые мы будем рассматривать. Но тем не менее а мы будем пытаться этот код сделать более продакшн впред. Я думаю, так как у нас всего лишь один main go файлик, у нас не очень большая задачка здесь, а то можно закрыть фай Exer Explorer и закрыть агента справа, потому что мы не будем сегодня с агентами общаться. >> Угу. >> Навыки вайп-кодинга мы сегодня не будем проверять. Так, о'кей. А расскажу немножко про задачу. У нас есть сервис, который занимается трансформацией PDФов впек. То есть у нас есть PDF-файлы, мы хотим сделать по сути таммбнейлы для того, чтобы использовать на нашем ресурсе. Это работает следующим образом. У нас есть workркер, который конвертирует это. У нас есть опишка, которую воркер посылает события, а, таски на то, чтобы делать конвертацию. Конвертация происходит через библиотечку GoFITS, которая из коробки использует э библиотеку сишну библиотеку MUP PDF. А мы не будем разбираться с тем, как она работает. Предположим, что всё у нас работает отлично. А код имеет несколько проблем. Ну не несколько, он имеет очень много проблем. Нам нужно разобраться, какие в этом коде проблемы и как мы их можем решить. Давай начнём разбираться с Maain Go и смотреть, что вообще можно улучшить в этом коде. Сделая так, чтобы он был продакшре. Наша задача в конечном итоге сделать так, чтобы этот код жил в продакшене и выполнял свою функцию правильно. >> Так, ну о'кей. Так, ладно. Первое, смотрю, что я вижу, получается, мы подключаемся к базе данных. Если у нас ошибка не равняется, то мы делаем log. Завершаем программу. Что? Давай тогда посмотрим вначале функцию in DB. Так, TB error SQL Open. Открываем базу данных.
SQL 3. DB Pass. DB Pass. Так, pass. Так, он уже, получается, нам передаётся. Так, класс. Ну, базы данных будет лежать в том же в той же директории, что инерник. Так, хорошо. Так запрос внос result так равня db new тут как будто бы вроде о'кей - дальше создаём New pool returned pool work chanм can 100 task id 64 f name strp glide так будто тоже боле нормально Так, э, startт ата меньше it workers workers тактактак. Так, тут получается мы запускаем рутину оркеer. >> Так, как это у нас будет работать? Что вообще делает команда Go и под капотом, что она выполне? >> Ну, go, получается, запускает грутину. Грутины - это вот легковесные потоки у нас в языке GO. А, то есть они управляются рентаймом языка самого GO, а не, ну, ядром операционной системы. Так. >> Так. Сколько мы можем их запустить? >> Аа, ну по факту сколько угодно. Мы ограничены лишь оперативной памятью компьютера. >> А как они будут выполняться? Последовательно или параллельно или как? >> Они будут выполняться параллельно. То есть с помощью грутин мы распараллеливаем как раз нашу работу. За счёт чего эта параллелизация достигается? И вообще это может ли оно быть не параллельно, а просто асинхронно? За счёт чего? Так, насчёт чего получается? Ну, как раз потому, что мы, ну, запускаем, не знаю, ээ, определённые неопределённое количество грутин на разных потоков. То есть за счёт этого будет у нас как раз распараллеливание кода. Второй вопрос был про асинхронность. Ну то есть может ли это работать асинхронно, да? >> Ну вот в чём разница между асинхронной или конкурентной параллельно в данном случае и как это будет работать на самом деле >> и от чего это зависит. Ну, асинхронно в моём понимании это когда работается кем-то на стороне. Параллельно, когда работа выполняется, допустим, разными горутинами, то есть, ээ, одна что-то делает, другая что-то, а конкурентно, так в моём понимании, что это когда работается несколькими рутинами, но идёт как раз переключение контекста, то есть то есть одна грутина Допустим, что-то делает. Контекст переключился на другую, вторая что-то делает и потом там на третью или снова к первой. Как бы в моём понимании это так. А >> о'кей. А можешь вообще в целом гошную модель CMP расписать? >> GMP. >> GMP. Сорри.
GMP. >> А так. Ну смотри, получается G - это у нас как раз грутина. M - это поток операционной системы. P - это логический процессор, который как раз связывает поток операционных систем, то есть MS G. Также у нас есть там каж, ну, получается, каждому потоку М и процессору соответствует вся локальная очередь грутин, которая выполняется. У нас также есть ещё глобальная очередь рутин, а есть ещё надпол, ну и там механизм, там, допустим, workкстилинг. Как это работает? Если надо что-нибудь, о'кей.
Workстилинг сказал, договаривайсь. Что такое workркстилин? >> О'кей. Получается, workркстилинг - это процесс, когда у нас в какой-нибудь одной локальной очереди выполнения рутин закончились рутины и получается процессор, да, ну, процессор пойдёт искать в случайном порядке, ну, по другим локальным очередям. Если он там, допустим, обнаружит, что есть рутины, то он забирает в себе половину, ну, как бы имеющихся гурутин в этом в локальной очереди. Э, э, попытка, ну, вот попытка вордстилинга получается рандомная. То есть он идёт по рандомным очередям локальным, а, забирает половину и пробует там, насколько я помню, вот четыре раза. Если в локальных очередей ничего не осталось, он тогда идёт в глобальную очередь смотреть, что там есть. Если в глобальной нет, тогда идёт в надпол. >> Угу. Так, а вообще зачем это всё нужно? Почему просто не писать, не брать из глобальной очереди? Это же так справедливо. Просто единая очередь. Всё, класс. А-а, я так думаю, потому что есть всё-таки, когда вот у тебя есть локальная очередь, которая присуща там каждому потоку и процессу, то это, ну, довольно удобно. Ну, то есть в моём понимании это будет меньший оверхед, чем постоянно ээ вот каждый поток будет ходить в в глобальную очередь и оттуда брать рутины. То есть это ведь нужно будет, ну, как-то синхронизировать всё. То есть, ээ, ставить там бьютексы, атомики, локфри, структуры данных, чтобы это синхронизировалось, как бы, э, переключение контекста - это тоже больший оверхд. Поэтому я думаю из, ну, поэтому были сделаны локальные очереди. Ну, как бы, >> ну да, да, Локи дорого. Всё так, о'кей, хорошо. Так, ладно. А вот мы смотрим на следующую строчку, на 217. А, и там у нас есть такая стрелочка. Что вообще эта стрелочка означает? Как она у нас? >> Ну, эта стрелочка, эта стрелочка получается, что мы записываем используется с каналами, то есть мы записываем значение job, которые вот удовлетворяет структуре в канал семнадцатое в канал Jobs, да, вот канал Job Job. Вот такая вот структура. Ну, то есть ээ запись в канал просто. >> Угу. А что происходит, когда мы записываем в канал под капотом? Ну, каналывают, во-первых, буферизированные и не буферизированные. Буферизированные, но имеется в виду по наличию вот этого вот буфера кольцевой очереди дебуферизированные. У них получается нету очереди никакой буфера. И то есть в небуферизированном канале у нас получается данные с одной грутины передаются напрямую в стек другой грутины. А функция называется Sendct, да?
Send dirct вроде. Аа а если его буферизированным, то получается вначале мы там, ну пишем в буфер в клюцевую очередь, и другая гарантина может оттуда вот забирать ну что мы туда записали. Так, ну то есть, да, мы записываем какое-то значение job канал jobs. Так, >> а здесь как у нас будет это происходить? У нас сама джоба, она будет копироваться или там будет использоваться та же самая структура, которая была передп. Так, сейчас worker Так, сейчас сделаю так для удобства. Так получается канал Jobs. Нет, Jobs - это структура. Канал Jobs. Ну, я так понимаю, что он небаферизированный у нас. А как понять? А, >> ну тут мы явно не не задаём никакой буфер. >> А он задаётся тут >> или где-то в другом месте? >> Думаю, думаю, что где-то в другом месте. Так, а насчёт Так, а насчёт смотри, ээ вообще у нас как бы все значения, ну, по умолчанию в го у нас копируются, а то есть передаются по значению копируются. Но так как канал у нас это примитив синхронизации и это у нас референсный тип, то, думаю, тут всё норм должно быть. Тем более вот по указателю мы используем пол. Если бы не по указателю было. А если бы не по указателю было, ну, по указателю получается мы это, ну, значит то, что мы напрямую будем работать с вот этой вот структурой, то есть, ээ, ну, напрямую с ней, а не с её копией. Ээ, а насчёт канала Jobs, если б тут было не по указателю, я думаю, было бы норм, потому что это референсный канал, это референсный тип. >> Угу. О'кей. >> В каком случае вообще лучше структуры по указателю, >> а >> по ссылке ли по значению определять именно ресивер? >> Да, я понял вопрос. Ну, если мы напрямую хотим, чтобы вот структура в структуре у нас изменялись значения, то тогда по указателю лучше. Или если у нас структура какая-нибудь, ну, довольно громозкая, там несколько будет полей, несколько десятков полей, то лучше тоже использовать указатель, чтобы каждый раз не копировать вот эту огромную структуру. >> Несколько десятков полей, да? А если эти несколько десятков полей - это слайсы или мапы или указатели? Я думаю, что тоже тогда лучше использовать по указателю. >> Угу. А в чём вообще может быть преимущество копирования? Ну, помимо обычной безопасности, что мы не изменим лишним для всех >> преимущество копирования, >> да? А, ну получается безопасность, то, что мы изменить не можем. Ну или, допустим, работа, может, не знаю, вот в локальной области видимости там функции, чтобы там изменили в этой функции результат и он никуда не уехал, то это тоже, наверное, с безопасностью связано. >> Ну, на самом деле ещё может быть связано с управлением памяти. >> А, ну эффективнее, да. То есть, если у нас по указателю у нас будет обращение в HIP, если у нас по ссылки у нас есть вероятность, что оно уедет в HIP, но есть большой шанс, что нет. Это нам позволит узнать escape-анализ. Но тем не менее, если мы делаем какую-то опишку, просто какую-то базовую опишку, то все эти оптимизации незначительно по сравнению с оптимизациями каких-нибудь запросов в базу данных, как к другим сервисам. Поэтому, да, это нужно смотреть приметельно к конкретному сервису. О'кей. А мы немножко отвлеклись от наших каналов и попытки понять, буферизированный он или нет. Давай мы к этому вернёмся и всё-таки разберёмся. Буферизированный, а нужен ли он тот буферизированный и или не буферизированный или какой буфер нам нужен. Сть, >> хороший вопрос. Так, что тут у нас дальше?
Work под Shops идёт. Так, так, так, так. >> Далеко уехал. Давай на 200 строчку. Нет, выше. Ещё чуть уже. 210. >> 210. >> Так. И ещё вон 206 строка. >> А, всё. Да, вот буферсную задаём. >> Ну, то есть всё норм. Кана буферизирования. >> Это точно норм. Почему это норм? Что если у нас миллиард этих сообщений? Что будет происходить? >> Если буфер миллиард? Не, если у нас миллиард Джоб туда пытается записаться, а мне кажется, это будет не очень хорошо, потому что, не знаю, к этой теме относится или нет, но если мы у нас создаётся там где-то вроде больше миллиона грутин, то у нас автоматически паника происходит. >> Да ладно, ну погоди, у нас же нет тут такого большого количества грутин. У нас же workerpol как бы как раз он нужен для того, чтобы ограничить количество грудён, которые работают в данный момент. Мы >> же говорим про канал. >> Так, то есть ещё раз вопрос. То есть, >> ну вот у нас есть канал с таким-то буфером. Поче мы решаем, что такой буфер - это достаточно? Почему мы делаем этот буфер? Почему не больше, почему не меньше? Не, ну если через workerpol, то мы, получается, ограничиваем вот количество, не знаю, грудин с соткой. С соткой. >> Погоди, давай, давай, давай с того начнём с того, что такое workerpol. >> Ну, workerpol - это как раз вот паттерн, который вот позволяет ограничивать количество используемых грутин. Я не знаю. Вот. О, >> ладно. >> Хорошо. Сколько у нас грутин запускается в данном воркерполе? Крутит там. >> Так, >> какая какой параметр за это отвечает? А, ну, наверное, давай найди строчку, где мы запускаем крутину. Нет, >> ну вот 212. >> Сколько раз она вызовет? А ну сколько у нас вот получается вот этих воркеров? >> То есть грутин у нас не 100 будет, а по количеству передных воркеров. >> Ну да, да, >> да. О'кей. Сколько их >> определились? Давай искать int. Ай. Так, workers. Так, так. Ну, мы явно нигде не прописываем, просто вот int workers workers. Я я не вижу, где мы объявляем количество workers. Вот. То есть получается вот возвращаем workers. Принимаем Workers. >> Да. Вот где мы принимаем Workers. Ну вот ты не посмотрел функцию, которая где где она вызывается. У нас есть вот конструктор пула. >> Ну конструктор пула. >> Вот он на 203 строчке объявлен. Нет, это не конструктор, это структура. Угу. >> Вот функция, которая этот пул создаёт. Пабрика. На 203 строчке, где эта функция взывается? >> А, функция New, да. >> Да. >> Так, а >> а всё в мейне. Так, ну, то есть получается два воркера. Я так >> окей. Даворкера. И у нас каналстап. Мы добавляем джоб. У нас, ладно, давай не будем говорить миллиард, давай скажем, у нас 1тыся джоб, и мы их будем одновременно добавлять. Что у нас будет происходить? >> Так получается, мы добавляем 1.000 job в канал jobs. >> Ну да. Ну вот у нас есть метод adjob у пулструктуры, и мы его вызываем в 1.000 раз, туда добавляем джоб. >> Ну то есть по, ну, как я по факту понимаю, просто 1.000 раз запишется вот вот это вот значение. >> Канал буфер всего лишь 100. А так, ну тогда нам нужно, чтобы из него кто-то читал, потому что иначе мы, если превысим буфер, то мы заблокируемся. >> Так, о'кей. Ну вот у нас есть воркеры, которые работают. У нас два воркера, они потихонечку вычитывают. Вот у нас есть реange по каналу Jobs в воркере чуть ниже. >> Угу. >> Оно вычитывается и отрабатывает. Ну, оно занимает какое-то время. У нас есть тыся. У нас есть буфер из 100. Что, как это будет работать? >> У нас есть сейчас опять. Так, у нас есть где-нибудь селект. О, давай рассказывай, что такое сек. >> Ну, сект - это как раз ну не знаю, аналог вот это вот switchкейс, э, который мы используем только, ну, для значений, только для каналов. >> Угу. Да. Ну, ну не для каналов, для в целом для синхронных операций. А-э, ну да, для записи чтений в канал. А-э, хорошо. Ну, как он тут поможет? В общем, мне кажется, это не то, что здесь нужно. >> Не, ну я имел в виду, если у нас там какие-то вот условия, сект, там CAS 1, CAS 2, CS 3, default. >> А какие кейсы здесь будут? >> Ну, >> обычный ренж пока. >> Ну, о'кей. Так, tas id file name status код. Вот и так статус. Ну ладно, о'кей. Погнали дальше. Не будем здесь сильно много заторживать. А, с каналами разобрались. А, есть буферизированный, есть небаферизированный. Что будет при попытке записать в канал, который не проинициализирован? То есть мы забыли вызвать йк. >> Ну, мы заблочимся. >> Заблочимся. Хорошо. А если канал закрыт? >> А, па Аника, не надо писать в закрытый канал. >> Ага. А как проверить, что канал закрыт? А, есть второе булевое значение, которое вот отвечает fф закрыт. открыт. >> А второе болевое значение где? >> А, ну когда мы, ну, вот условно мы читаем из канала, сейчас даже напишу. А, то есть так, ну вот примерно так. То есть value - это вот значение, которое мы вот получаем из канала, а вот это вот состояние открыто он или закрыт. >> О'кей. О'кей. Так, ну что, погнали дальше по логике. М, у нас есть. Что делает workркер?
Work берёт файлик дефтный и трансформирует его в ПГ. >> Ну, то есть просто меняем формат. О'кей. >> Через специальную либу. Не то чтобы меняем формат, а просто по сути делаем. Скриншотик первой странички. Так, так, мне ещё что-то нужно в функции worker прокомментировать или как? Не, не обязательно. Давай смотреть как у нас таски создаются и где. Давай уже перейдём от воркеров в то, что с этими воркерами будет работать. Потом, если что, сюда вернёмся. >> Хорошо. >> У нас есть здесь А да, давай в мейне посмотрим на сервер, как у нас сервер создаётся и что с ним происходит. >> Так, мы создаём метрики New. >> Так, инициализация база данных создаётся старт. Так, на старт мы запускаем воркера. Так, Analytic Analytic сервис. Тактактак. А worker запускаем. Так, так. Ну, тут мы метрики запускаем. О'кей. Так. Трикс Newхler. Хенлерхнлер. >> Вот у нас есть HTP сервер. Мы сделали просто несколько хендлеров >> и стартуем его. В чём тут вообще проблемы? Где косяки? Что пойдёт не так? Может быть, и не так. >> Так, давай посмотрим. Получается New Handler. Так, а, ну да, получается, здесь мы запускаем наш. Так, о'кей. Так. А здесь мы, ну, получается, регистрируем просто вот ручки в каком-то файле.
Printlens server стартинг. Он на восьмидесятом порту. Локфал. Зачем так делать, я вообще не понимаю. Ну если серф вернул ушибку, то она сразу зафатарится. Так, ладно. Ну смотри, получается, мы запустили сервер на на водемидесятом порту. А и у нас, не знаю, как будто дальше с ним нет, не знаю никако может, не знаю, какую-то проверку там делать вообще там нел сервер startт. У нас функция для сервера старт вообще есть. Так вот, Лис на серф. О'кей. Как бы ты изменил? Вот мы хотим Prodдаction ready сервис. Чего не хватает для Prodдаction Ready Service? Меня вообще просто такая вот конструкция смущает. >> Ладно. >> Ну ты как бы не можешь его запустить. запуск сервиса сервера у тебя заблокирует дальнейшее исполнение кода здесь. Ну его можно, конечно, там заползвать какунки. Знаю. Также меня вот эта строчка смущает, то что влог кфатаal и отсюда мы запускаем listт сервер. Не знаю, может, как-то по-другому сделать надо. Ну, именно в этой строчке прямо проблем особо и нет, я бы сказал. Ой, >> ну как бы Лиса на сердце возвращает ошибку. >> Угу. >> Или Нил. >> Ну, если Нил, то мы, ну, должны продолжать. >> Ну да, у нас у нас зафаталится, зафаталится. Ну, давай, перепиши, перепиши. Сделай, сделай возвращение ошибки. Если ошибка, толок фатал ошибка. Всё правильно. Так. Так, что бы написать? Сервер сервер BТ фантазии пока никакой. Аа сеервер. Да, на такт сервер поряд. Так, о'кей. Так, тогда так. Ну тогда вот эту строчку можно убрать. А не знаю, можно ещё shutdown, например, сделать. >> Погоди, погоди, погоди. У нас сейчас явно сервер не запускается нигде. А, дада, да. Так, а ж, что он принимает у себя на адрес так стрингу и хенрчку ско Запутались. Так, так, возвращает он у нас с ошибку. Так, HTT сервер восьмидесятый. Что он ещё требует? Он требует ручку. Ручку, наверное, аж new variables on left side. Нету новой переменной, так я понял. Так, ну что? Так. Ну, со вторым параметром. >> Почему ты назвал это сервер, если там явная ошибка? Почему? Почему не R? А, потому что R вот уже объявлено у нас здесь. Я так понял, что он ругается из-за этого. Ну вот.
No new bells, >> как это можно пофиксить? Почему Почему он вообще на это ругается? Давай, давай, давай рассмотрим оператор, >> ну, так, ну, двоеточие - это когда получается мы создаём новую новую переменную. Не знаю, можно, как вариант просто переприсвоить. >> Ну да, сделать shadow здесь можно в целом. О'кей. Так, а вот в качестве второго параметра дела это нормально. То есть этот сервер как бы требует ручку. H я не смог сюда передать, потому что >> смотри, если ты перейдёшь в BL серф, там будет небольшая документация. >> Вот. >> Да. И там есть как раз про хендлер, >> а вот это за хендлер и типиканил. >> Угу. Так что хендлер в целом нормально в нашем случае оставить неловом, если мы всё делаем в дефолтмуксе. В целом практика не то чтобы часто, но в данном случае сойдёт. Остаём так. >> Давай дальше. Погнали по коду. А, хорошо, вот мы разобрали. Здесь у нас бетсервер. А, ладно. Давай смотреть по хендлерам, что у нас хендлеры делают. А нам интересно, как вообще у нас происходит файла. Давай перейдём в рассматривание аплода, потому что - это самое важное в нашем сервисе, что есть, потому что запускает основной бизнес-процесс. Так. А так вот функция upload. То есть мы загружаем, а если а если у нас не получается у нас место пост, а, подожди, теперь метод позволен. Так. Парфм посторонне. Так, то есть здесь мы чтолоцируем 10 Мб, я понимаю, а парсинг parcing form header form close Так, купил save eror desk. Так, заполняем структуру для продакшн сервиса. Какие здесь могут быть проблемы? Вот мы работаем с файлами. Файлы, которые прилетают к нам от пользователей. Что здесь пойдёт не только? файлфайл а так create копия копия копия копия А что у нас копия делает? Копирует, >> да? >> То есть >> нет, то есть в данном случае, что делает копия? Просто копирует файл. Ну мы создаём новый файл, в который мы будем копировать то, что у нас прилетело к нам. >> Угу. Если ты посмотришь на сигнатуру функции копи, она копирует из ридера writer. Всё. То есть нам не важно, что там файл std in что. Так, о'кей. А create task.
Create task. Create task SQL F result error exertas valor last insert ID. Не знаю, вроде как будто норм. Так. Угу. Давай. Какой криминал у нас есть с файлами? >> В коде или вообще? >> Ну, в данном случае в коде. Ну, можем начать с вообще и потом, а, с к коду перейти и посмотреть, реализуется он здесь или нет. >> Менал с файлами. Слуша, на самом деле затрудняю, чтобы эти с файламир не работало. А, >> ну как бы это вообще самое базовое понятие в unкс подобных системах. >> А расширение тогда может быть? >> А что за что же за расширение? Ну да, давай по поподробнее чуть. Нет, ну если в данном случае мы пдфку шпек переводим или то, что у нас вник системы у нас всё есть файлы. >> Ну о'кей, мы действительно PDF ко вчк переводим. А что нам нужно проверить, когда мы переводим пдфку в чешпек? >> Не знаю, размер может быть, что он вообще не нулевой, >> да? Хорошо. Ну, а если говорить про формат файла, нам важно, чтобы при переводе пдфки вчк у нас файл был пдфкой. >> Ну, если мы переводим PDF, точк тода. >> А так, о'кей. А нам нужно сделать эту проверку? >> Ну, думаю, что да, нужно. >> Так, хорошо. А как мы это будем проверять? Эх, ну, наверное, смотреть вхождение дня в строке там, не знаю, точка PDF, что-то такое. >> Это надёжная история. >> Может ли пдфка быть без вхождения в строке точка PDF или не пдфка с вхождением в строке PDF? Не, ну когда, ну расширение файла, мне кажется, всегда должно быть. Ну о'кей, допустим. А хорошо, мы это проверили. Ты ещё сказал про размер. Давай про размер поподробнее. Что нам нужно проверить с размером? >> Ну то, что он у нас вот не нулевой. >> Не нулевой. Хорошо. Представим ситуацию, что у нас наш сервер крутится на сервере, где 4 Гб оперативной памяти, и нам загружают PDF размером в 5 ГБ. Что с нами будет происходить? >> Ну, всё плохо, мы упадём. >> Так, а >> плохо ли? Вот у нас есть пас мультипарформ. Что у нас он делает? Почему мы туда передаём эти чиселки? Так, макс. А, ну вот максимальная память 64. Такрн О'кей, мы не будем сейчас разбирать этот код. А потом, если что, можно будет, ээ, его отдельно разобрать. >> О'кей. Э- >> Нет, ну, как я вижу, тут мы, получается, ацируем, сколько вот максимально вот битовый сдвиг сколько 10 на в этот 10 Мб, >> правильно понимаю? >> Так. Ну, то есть если у нас размер вот, ну, вот больше 10 Мб вот этого PDF-файла, то мы возвращаем ошибку именно ошибку возвращения. >> Ну, HTTP r >> Не, не, ну и именно ошибка вернётся в этом случае или нет, >> как я понял, да? То есть, если она превышает 10 Мб. >> О'кей. Ладно. Аа, так. И хорошо, давай отпустим файлы, размеры отпустим, пойдём дальше. У нас осталось не очень много времени. Нам ещё есть что разобрать. А давай подробнее посмотрим на строчке 37308. Это валидно здесь или нет? Что означают эти цифры? >> Первым >> это волшебные цифры. >> Ну не знаю, возможно тогда их стоит в в конструкту вынести и явно как-то написать, потому что непонятно, что это за цифры. О'кей, допустим. Ну, upload загружен result. Вот что мы получили. Угу. Ну тут то есть ничего плохого в это в этих строчках нет. Так, а давай немножко подскажу. Смотри, это будет вызываться на каждый запрос. То есть пользователь закидывает документ, и мы вот это вот будем выполнять на каждый документ за закинутый пользователем. Корректно ли это с точки зрения логики работы приложения или нет? >> Ну а а что оно делает? Ну вот, >> ну она состаёт директорию плот срезался две директории. >> То есть то есть вот мы загрузили PDF-файл, создали директорию и туда записали, получается, ну, сохранили вот этот вот шпек, фотографию. >> Ну, мы с сохранили сначала PDF туда. То есть, чтобы Wркеer у нас забрал этот файл, этот файл должен где-то лежать, то есть мы должны его куда-то сохранить. Вот это у нас сохраняется в директории uploads. В директории results уже будет сохранено всё, что у нас Workerр отработал. >> Угу. Ладно, а так вопрос получается в том, что каждый раз то, что вот эти две строчки будут вызываться, это вообще ок не ок. >> Да. Не знаю, как будто бы не совсем ок. Можно, допустим, это вызвать один раз, чтобы она создала директорию и потом просто туда апендом делать, >> не знаю, остальные там по порядку типа 1 2 3 4 далее. >> Ой, так >> так это надо как-то переписать, записать. Не, да, да, да, давай, давай мы это запомним. Я я себе записал, если что. Всё, всё нормально. >> О'кей. >> А, погнали дальше. А так вот create Ой, copy create task jobк. Ну, на что тут ещё обратить внимание? >> Угу. На что обратишь? Домой я прицеплюсь. Давай, давай пропустим это дальше. А мне сейчас интересно, наверное, в create в копи, я не знаю, create task. Всё нормально. Возможно, как-то тут полох происходит. >> Вот смотри, у нас есть job. Помнишь нашу историю с 1.000 файлов загруженных и каналом с буфером 100? >> Угу. >> Что у нас будет происходить в этом случае? А, ну то есть как бы мы, ну, не сможем больше 100 задачек записать. То есть нам нужно, чтобы их кто-то там, ну, вычитывал и освобождалось место. >> Угу. Так, как мы можем это починить? Вот у нас явно есть два воркера. Больше воркеров мы можем добавить. А, ну в, ну не знаю, зависит, может быть, от системы там от ЦПУ. Надо уточнять этот момент. Хороший хороший ответ. Да, depends, на самом деле. Всё так. А ладно. А мы можем уменьшить или увеличить буфер? Уменьшить или увеличить буфер? Не, ну в целом вроде можем. Угу. О'кей. А что нам лучше сделать? Уменьшить буфер, увеличить буфер? Потому что, ну, как мы уже до этого обсудили, если у нас 1.000, а, 100 буфер и 1.000 джоб прилела, то у нас 100 записалось в буфер, и все остальные 900 будут ждать, пока пока освободится место. И у нас получается, так как это upлодх hand хендлер, у нас upload будет висеть и не исполняться в конечном итоге. может отвалиться по тайм-ауту, например, если слишком долго это занимает, то юзера просто отвалится. Что будет происходить, если юзер отвалятся? Ну, как бы вернётся условно ошибка, то, что, не знаю, пятисотка, может быть, или 499, что, а, запрос не был корректно выполнен. Ну, как бы эту ситуацию нужно решать, как бы, не знаю, идеальнее всего, чтобы в процессе, чтобы кто-то уже сразу вычитывал, как бы, чтоб, не знаю, непрерывный такой пайплайн был, что вот задачи новые приходят и сразу же куда-то уходят. >> Угу. То есть какое решение здесь? сразу отправлять куда-то, ну, в другие картины. >> Ну, вот у нас всего лишь два воркера, мы не можем больше себе позволить. У нас >> А, а, ну, >> бед бедная компания. >> Нет, о'кей, я понял. Ну, то есть получается, чтобы один воркер вычитывал, а второй записывал? А, погоди, давай заново. Я тебя не понял. Я сейчас что-то не уследил. Ну, >> у нас есть два воркера, получается. Они могут одновременно два работать. То есть я предложил, чтобы один бот добавлял задачи, а второй исполнял задачи, то есть вычитывал. >> А, ничего себе. Вот это вот, конечно, это прикольно, да? А, да. М. Но на самом деле я могу сказать правильный ответ. Здесь любая схема с попыткой как-то это всё наложить на рутина, она будет изначально провальна, потому что любой рестарт сервиса и ваша грутина и все эти джбы потеряны, поэтому здесь нужно иметь что-то персистентное, откуда мы будем вычитывать всё это. Например, можно утилизировать ту же самую базу данных и вместо того, чтобы полагаться 100% на каналы, использовать её. Вот. А-а, о'кей. Ладно. А здесь чуть пропустим. А я хочу ещё один момент, ээ, зацепиться. Один момент, который ты упомянул, называется Grceful Shutdown. Давай расскажи поподробнее, что это такое, зачем он нужен и как мы можем его здесь имплементировать.
Graceful shда. Это получается, если у нас там вдруг что-нибудь пойдёт там сервис, ну что-нибудь там, может, питание электричества отключит или там что-то его убьёт, может быть, то чтобы он, ну, как бы не отвалился, а более корректно завершился. А, ну вот это вот для этого паттерн нужен. Ну, как бы, по крайней мере завершил вот уже исполняющий выполняющиеся там задачи. Я имел в виду вот это. >> Я немножко хочу зацепиться за отключение электричества. Как при отключении электричества мы что-то грейсфоль завершим вообще? >> Кажется, там уже не не догрейсful завершения. Всё-таки agгful завершение у нас для каких-то штатных ситуаций. Там у нас, если кубернет стопот эвакуируется, либо мы редиплоимся и нам нужно, чтобы у нас не было никаких артефактов. >> Я согласен. >> Так, ну давай продолжу, пожалуйста. Я немножко терпнул. А, ну то есть вот как ты сказал, что там что-нибудь с кубернатосом происходит, чтобы сервер мог совершить вот условно выполнение задач, которые он уже выполнял. >> Угу. >> Ну и была как бы мягкая остановка сервера. >> Угу. О'кей. Как мы можем вот здесь это применить? Что нам нужно вот конкретно для нашего сервиса с целыми двумя воркерпулами а сделать? То есть у нас есть какая-то аналитика, у нас есть какие-то джобы, как мы будем интегрировать Graceful Shutdown в нашу ситуацию. А >> не знаю, там ещё какой-то поток создать, который будет отвечать за это. >> Нене не. Ну смотри, а давай по порядку. Вот нам прилетает сигнал какой-то. какой на какой сигнал мы будем этот шада делать. И дальше по шагам. Что мы конкретно делаем шаг за шагом? Как мы делаем этот шадау? Как мы его исполняем? >> Ну, прекращаем принимать новые запросы и пытаемся за >> Как мы это делаем? >> Как как прекратить принимать новые запросы? >> Ну, закрыться. >> Так вот в коде. Как что такое закрыться? Как тебе напишу закрыться? Ну, может быть, не знаю, сигнал отправить, чтобы закрыть канал. >> Ну, фактически первое, что нужно делать - это перестать принимать какие-то HTP запросы, верно? >> Ну да, да. >> Так. О'кей. Для этого у нас есть сервер. Мы сервер можем завершить. Хорошо, допустим. А что нам с воркерами делать? Есть ли какой-то инструмент в языке го, который позволяет нам завершить работу чего-либо асинхронного? Ну, получается, а контекст может быть >> контекст. О'кей. Чётко контекст. Это вот как раз такая сущность, которая вот позволяет, ну, управлять там, отправлять вот сигналами отмены там deadline, там, value. Ещё что-то есть. А, ну то есть как раз позволит отправить сигнал, чтобы мы завершили работу. >> О'кей. Как мы этот сигнал получаем? Может быть отк откн. Ну не знаю. Ну как будто нам, не знаю, карутина об этом сообщит или поток, что мы отправляем сигнал э на завершение. >> Не, гарутины не умеют ничего сообщать. Всё-таки они достаточно такие скрытные товарищи. Ну о'кей, хорошо. Короче, да, то, что вы сейчас увидели, это пример того мог интервью, которое вы можете у нашего Кате пройти. Но да, ваше интервью будет один на один с ментором, без меня, без зрителей. В общем, всё будет приватно и один на один с ментором. Что такое shortcutт? В двух словах, мы - это менторская платформа. Мы провели уже больше тысячи таких вот, да, подобных мок интервью, нескольких тысяч занятий со средней оценкой 4.9 из пти. И всё это позволило больше чем до 140менте, которые у нас учились, получить офер. Собственно, да, почему это работает, как проходит менторство? Всё начинается с тестового интервью, пример которого вы только что и увидели. По итогам этого тестового интервью мы составляем для вас индивидуальный план развития, по которому вы с ментором дальше пойдёте. Ээ, соответственно, по итогам этого, ну, по этому плану вы дальше идёте, просто занимаетесь один на один как бы с метоми. Почему один на один? Мы считаем, что это лучший формат, когда у вас вы хотите в Авито, не знаю, а у вас есть рядом разработчик из Авито, который сидит и с вами занимается. Это, мне кажется, супер круто. Между занятием ментор никуда не девается, отвечает в чате. В общем, обо всём этом сейчас расскажу. Но, да, первый шаг - это мокнтервью, это фактически тестовый сабес. И в рамках этого тестового сабеса у вас есть возможность, соответственно, пройти секцию по алгосам, по систем дизайну, по кодрев, по лайфкодингу, нечто усреднённое, как сейчас, и так далее. Также у вас есть возможность взять ментор из любой компании. Вы можете сказать: "Хочу вот ментор из э из США". Вот. И мы дадим вам условного Дима Дрофеева. есть, эээ, там, например, вы хотите в Авито, мы дадим вам менторы из Авито и так далее. А, и по итогам этого собеса вы получите такой вот классный план развития, в рамках которого, соответственно, мы скажем, какой у вас грейд, какие у вас сильные стороны, какие слабые стороны и, соответственно, какой грейд для вас будет следующей целью. Аэ здесь, как бы, если вы посмотрите, прямо красным написано, да, в красных баблах, что вам нужно подтянуть. Это фактически ваш план развития до следующего грейда, сделанный ментором, написанный ментором специально для вас, да, без в общем каких-то шаблонов или чего-то такого. И вы можете прямо вот взять по нему идти и его использовать. Собственно, дальше, да, после того, как, э, вы прошли Мок, вы можете стартануть занятия. Это опционально, но очень круто, да, потому что это даст возможность вам просто быстрее прокачаться. Собственно, до каждого занятия ментор вам будет скидывать теорию. Вы сами её будете смотреть, изучать, читать, если нужно задавать вопросы. И дальше, соответственно, э вы с ментором уже встречаетесь, созваниваетесь вживую и, э, да, как бы ментор, да, объясняет какие-то моменты, а дальше задаёт уже вопросы вам, чтобы удостовериться, что вы всё правильно поняли, что не осталось белых пятен и можно идти дальше. И дальше, соответственно, вы практикуетесь. Э, практика может быть либо, да, педреектом, либо системдизайном, либо алгосами или чем-то таким. Само занятие длится час или дольше, проходит раз в неделю или чаще, да, здесь всё индивидуально, и здесь как бы мы тоже под вас подстраиваемся. Между занятиями ментор, конечно, никуда не девается, остаётся в чате, может задавать любые вопросы, можно просить провести кодревью домашки или пэтпроекта, можно просить скинуть допматериалы по теме домашки, собственно. А дальше мы поможем как бы конвертнуть вот эти ваши знания в крутецкий офер. И здесь у нас есть суперкрутая чар Аня Мирошникова, которая помогает, соответственно, всем нашим менте с тем, чтобы сделать классное резюме. Причём мы не просто говорим: "Вот тебя гайд, дальше, в общем, делай, как хочешь". Нет, мы говорим: "Вот тебе гайд, составь, мы посмотрим, покомментим, потом будет несколько итераций, и после этого ты уже выйдешь на рынок". Также мы разберём, да, задачи, которые у вас могут попасться на технический этап. Но я знаю, что сейчас в чате, да, и тоже наверняка, может быть, кто-то даже написал, что сложно прорваться на собес, но мы здесь помогаем с тем, что мы делаем классное резюме, тем, что мы, соответственно, рефералим вас. У нас есть менторы из любой большой российской компании, некоторых зарубежных, э, соответственно, и мы можем вас порекомендовать, порефералить. И с некоторыми компаниями у нас есть вообще договор. Мы не можем, в общем, их в рекламе как-то использовать, но можете спросить у менеджера, да, у нас с некоторыми компаниями есть договор, э, по которому всех менти, которых мы рекомендуем, они в любом случае зовут нас оббес. Понятно, что офер обещать не можем, но можем пообещать, что вас точно позовут на Собес, если да, ментор вас порекомендуют. А, и дальше мы поможем вам ещё пройти Моки, да? То есть мы можем вас, э, подготовить, натаскать, э, сделать так, чтобы, в общем, вы были готовы к собеседованию в компанию, да, и провести несколько тестовых собеседований с людьми. А вот, например, хотите вы в Яндекс, да, у нас есть менторы из Яндекса, которые для вас проведут несколько секций в формате Яндекса. А, собственно, но первый шаг, ребят, Мок интервью, да, если вы хотите либо просто узнать знания, да, либо просто узнать, что вы знаете, а что ещё стоит подтянуть, либо если вы хотите получить план развития до следующего грейда, либо если вы хотите дальше прийти к нам заниматься, да, для всего этого есть MO интервью. Соответственно, Мок интервью можно оплатить сегодня за 2.000 вместо 3900, отсканировав вот этот QR-код на экране, либо по ссылке в описании, да, к этому видео на Ютбе или в нашем боте. Важно сказать, что MOC интервью длится час или дольше, проходит один на один. По итогам вы получите классный развёрнутый фидбэк. Соответственно, мок интервью может быть посвящено systemм-дизайну, алгоритмической секции, лайфкодингу, кодрев и так далее. То есть секции, которые вы бы хотели у себя прокачать, пройти и так далее. Мог интервью может привести ментор из компании, куда вы хотите пойти. И если, ребят, оно вам не поможет, если вот для вас оно почему-то не сработало, вот почему-то что-то пошло не так, мы гарантируем, что вы просто пишите нам: "Мне не понравился Мог". И мы возвращаем деньги. Даже если мог вам на самом деле понравился, можете написать: "Мы всё равно вернём деньги". Такие вот мы, ребята. Потому что для нас важно, да, чтобы вы действительно попользовались МОКОМ. посмотрели, как мы работаем, увидели это и уже сложили своё честное мнение. Поэтому приходите к нам на мок. Э, рисков ноль, польз дофига. Сканируйте QR-код, приходите в описание, да, оставлять заявки. И если у вас есть какой-то вопрос по шорткату, самое время его задать. На все вопросы мы как раз сейчас будем отвечать. Но перед вопросами хочется вызвать Диму. Вызвать, а-а, позвать. >> Призвался. Всё. Так, во-первых, я не буду никаких лейблов ставить, потому что разный опыт человека по-разному оцениваются в разных компаниях. И в какой-то компании Алексей может быть медлом в какой-то джуном, в какой-то сеньором. Ну, то есть это реально зависит от направления работы компании и как Алексей себя проционирует и продаст. И совершенно эти лейблы не говорят ничего о реальном положении дела. Что я заметил? А у Алексея есть некоторые трудности с чтением кода, с определением, где что вызывается и так далее. Мы долго искали, где какие вещи описаны, где вызываются, где проставляется длина канала, где у нас вызывается это создание воркера, где он создаётся. Плюс проблема с чтением, пониманием ошибок. А ошибки, которые появляются в редакторе, они не игнорируются. Идёт чтение, что делает функция, но само, а, само тело ошибки, что оно пишет реально и что оно означает, оно, а, игнорируется в самом начале, и требуется время, чтобы это а определить, что у нас пошло не так. Дальше, а по поводу написания кода. Написание кода мы не смогли корректно сегодня понять, потому что у нас нет лайкодинга. Это только на на ла-кодинге можно сделать. Но а обычно написание не всегда не сильно лучше чтение, то есть чтение всегда определяет. А дальше у нас чтение документации тоже. А да, хорошо, конечно же, читать, что функция принимает, но также хорошо знать, что параметры эти значат. и чтение документации. Каждый раз, когда ты смотришь на функцию, специально в во всех библиотеках в stдлибах есть документация, что конкретно эта штука делает. И, к счастью для го она достаточно подробная, и это можно использовать как ревенс материал. А мы в конечном итоге начали это читать, но а опять же пару вещей не были прочитаны корректно. Я расскажу чуть попозже, что что именно. Ну и то, что меня удивило - это вот эти вот волшебные циферки в Юниксе 0755, которые означают биты для этого для доступа к файлам директори. То есть это доступ на чтение на запись, на исполнение для анера, для группы и для everyone. Они а были в новинку для Алексея. Ну и заметно было, что у Алексея нет опыта. с контекстами и в целом с достаточно такой серьёзной асинхронной разработкой и игрой сшладаунами, на самом деле. То есть понимание есть, но прямо глубокого какого-то опыта я не заметил. Вот это то, что я по итогам интервью могу сказать. >> Супер. Спасибо большое. Но в любом случае, да, хочется сказать для всех, кто нас смотрит по ту сторону экрана, что здесь быть как бы невероятно сложно. И ээ не факт, что тот фидбк, который давал Дима - это не про Лёшу в целом, а про конкретный Собис. Да и возможно, что это нервы, ещё что-то, потому что я раскрою, что Лёша вообще супер-пупер герой. Он к нам подключился за 5 минут до начала стрима. Лёша узнал, что сегодня он участвует в стриме. Вот. Поэтому может быть очень по-разному. Лёш, как тебе сегодняшний собис? Не проявлял, что пришёл? Я единственное думаю, что ты пожалел, что позвал меня. >> Не, я тоже пожалел. Мне, во-первых, очень приятно, что в чате я не нашёл негативных отзывов, как я сейчас проходил. Это правда очень приятно. А потом насчёт задачи Дип, >> да, извини, просто комментарий к тому, что типа в чате никто, так сказать, не обосрал. Спасибо, ребята. Спасибо. На насчёт Диминой задачи, ну, я, честно не был к такому готов. Когда я её увидел, я понял, что, ну, будет капец. Как бы, не знаю, делал, что мог. В целом я согласен вот с замечаниями Димы полностью, то, что, ну, страдает до чтения кода, наверное, такого сложного. Не знаю, насколько он сложный. Мне показалось, он сложный. Также нет глубокого, ну, глубокой работы с контекстом тоже не было. Грес был shтдаун, но как бы всегда делал, но написать бы, ну, ну, точнее делал, но повторить бы сам не смог, но в целом, да, >> спасибо. Спасибо. Да, Дим, >> да, хочу ещё заметить один момент. Алексей очень хорошо подготовился с точки зрения теории. То есть прямо вот эти workкстилинг, как это GMP модель у нас работает. Вот это всё было нормально. Но, к сожалению, в реальности ты, когда приходишь на работу, ты не не делаешь воркстилинг для рутин и не делаешь всё остального. И это, а, в некоторых кейсах менее ценно, чем реально практическая работа с кодом. >> Ну да, если бы был сабес по теории, тут бы была бы ситуация лучше. Ну, мне кажется, что на самом деле как бы каждый сабес, да, нельзя за час делать впечатление какое-то полное, мне кажется, о человеке даже с учётом этого. Вот здесь Мурат написал: "Аксей, ты лучший, мы всё понимаем". Вот поэтому >> спаси спасибо, Мурат. >> Да, собственно, давайте подведём. Алексей Всёок, ты молодец. Супер. Э, да, собственно, давайте подведём итог голосования. У нас народный грейд мы голосовали 64% за джуна. Э, соответственно, на, э, тубе в зуме 60% за инвентарно, 40% за джуна. Но мне кажется, всё равно в общем, э сегодня вот у нас та так, так такая сегодня оценка. А давайте поотвечаем на ваши вопросы, ребят. Задавайте их. Если у вас есть любой вопрос, смело его пишите. Да, пока вы пишите ваши вопросы, я на всякий случай знаю, что просто если, знаете, я раб цифр, и я знаю, что если показать, как оставить заявку на мок интервью, то прилетит ещё несколько заявок, поэтому я это сделаю. Собственно, чтобы оставить заявку на МОК, получить его сегодня за 2.000 руб. вместо 3900 и э классный план развития, возможность часового МОКА по итогу и так далее, приходите в ботшобот. Соответственно, и здесь есть прямо вот последнее сообщение, в котором можно оставить заявку. Нужно нажать на кнопку записаться со скидкой, ответить на четыре вопроса. Какой у вас сейчас грейд, какой грейд вы хотите, а какая у вас цель и хотите ли вы продолжить занятие с ментором. Всё, да, ответили буквально на пару вопросов, и после этого мы с вами свяжемся, дадим ссылку на оплату и так далее. А пока что да, вот вопрос: а что должны были по максимуму сделать из представленного кода? Ну я могу сейчас просто показать, рассказать. М идти по порядку, а без какого-то без какой-то структуры. Первое, что я вижу, у нас есть какая-то внешняя библиотека. Я понимал, как она работает, так как это всё-таки сиго и сишная имплементация. Там есть свои нюансы, а к тому, как код будет работать. Нужно максимально м с точки зрения работы продакшена понимать, как она будет работать с памятью и так далее, потому что оно будет явно вне а зоны контроля нашего приложения. Дальше здесь у нас много, на самом деле, есть мелких проблем. Например, у нас не инициализируются мапы в каких-то местах, в каких-то инициализируются. А, но если коротко, давайте перейдём к местам, в которых мы, в которых мы не нашли проблем, в которых они были. Вот, например, в оплова у нас есть пас multipart. А как вообще мульти партform работает? О, мы передаём сюда всё правильно, 10 Мб, но это не лимит. Это всего лишь то, что будет у нас лежать в памяти. Всё остальное, даже если мы передали стогигабайтный файл, оно будет дампиться на диск. То есть у нас в любом случае любой пальтиpartм вычитает всё боди, и часть из этого просто сдам на диск. И это не очень хорошо. Если мы хотим реально ограничить, то мы можем сделать это несколькими путями. Первое, мы можем либо ограничить полностью BДИ двумя способами, либо мы можем обвернуть BДИ в liimited reader и просто вычитывать из него часть. И если количество вычитанных байт у нас становится, а, меньше, чем количество байт реальных, то мы можем кидать ошибку. А другой путь - это смотреть на content. То есть у нас в любом типа запросе есть длина контента, которая у нас пришла, и мы можем просто от этого отбрасывать. Но это такой тоже так себе подход, потому что мы не ограничиваем размер файла, мы ограничиваем размер всего запроса. В запросе так это мультипар запрос, может быть, что угодно и файл, и просто какие-то поля. Поэтому один из вариантов - это просто руками начать разбирать этот мультипарко мультипарзапрос. Просто руками брать какие-то параметры и смотреть, сколько они у нас занимают. А дальше с у нас были проблемы с стандартными юниксми штуками. А вот здесь 755 и что-то live share у меня косячит. А так это было ниже, да? А 755 - это у нас право доступа. Это восьмиричная система. И у нас до всего, если ты онер, то есть это для до чтения записи и исполнения, так это директория. Исполнение для директории является, а открытием директории. А дальше, ну, именно сама директория, а са все директории исполняемы считаются. Пятёрка - это значит, что у нас есть доступ на а чтение и исполнение. У нас нет чтения для записи на группу. И вторая пятёрка тоже есть на чтение исполнения. А для оунера, а точнее для группы у нас пятёрка - это есть на чтение исполнения, да? И для everyone у нас есть чтение исполнения. То есть только оунер может туда писать. А вот, ну и правильно, нам не нужно это создавать на каждый, а, на каждый запрос. Нам нужно это делать один раз. Вот я, хотя это сильно не делать, потому что директория на самом деле не создастся, если она уже есть. А дальше в целом что ещё можно добавить? Можно было бы добавить во-первых Гресдауна то, что мы рассказывали, это воркеры добавить контекст, сделать везде селекты, где мы будем делать эти xданные и читать из него. И если он заданился, то мы будем, а, завершать приложение и завершать наш workркер. Сделать какой-нибудь таймаут в среднем секунд можно 5-10. И если за 10 секунд оно не замёт 10 секунд оно не остановилось, то прибивать его жёстко. Дальше. А дальше у нас в самом воркере а есть проблема с открытием, закрытиями файлов. То есть где файлы открываются, они не везде закрываются. Вот у нас создаётся файл, но не закрывается. Есть места, в которых у нас не проявляются ошибки. Если мы говорим про более какие-то серьёзные изменения в нашем коде, то мы можем переделать инициализацию базы данных, сделать нормальную работу с миграциями, потому что в данном кейсе у нас, ну, нету контроля миграции. У нас а будет постоянно вот эти вот крейты наполняться. Если что-то меняется наполняться, вот это вот будет количество запросов, которые мы собираемся исполнить. Всё-таки нормальная толая работа с миграциями важна. Даже если это SQL Lite. Вот. А, ну и как уже сказали, у нас проблемы с каналами, и лучше перенести их какую-то персистентную систему для того, чтобы работать с воркерами, потому что в таком виде воркеры не самые идеальные. И если у нас происходит какой-то рестарт, то мы начинаем терять наши сообщения, и у нас не трансформируются файлы. Ну и дальше, если мы говорим про продакшн, то это, во-первых, метрики. У нас нет никакой аналитики. У нас есть аналитика, но у нас нету Нтайте мониторинга. Что у нас происходит на с нашим сервисом? У нас явно нету нормального логирования. То есть логи какие-то есть, возвращаются какие-то HTP ошибки, но это очень-очень недостаточно. Ну и в целом можно ещё как-нибудь заинструментировать это, сделать какие-нибудь трейсы, но в данном достаточно простом примере это, я думаю, не самое обязательное. Ну и обработать везде ошибки и прогнать линтер, потому что линтер тут найдёт ещё кучу кучу всего. Вот. А если если коротко, то так. >> Супер. Спасибо большое, ребят. Если есть какие-то вопросы, да, то смело пишите. На все вопросы сейчас ответим. Про хранение Таск ещё говорил. Ой, ну тут вот коммент немал. >> Ну я рассказал в целом. Дададада. А да, давайте отвечу на вопрос тогда. Есть на Ютбе, есть зуми парочку. Да. Что думаете насчёт людкода? Хороший инструмент, чтобы подготовиться к логоритмической секции интервью, но, наверное, больше ни к чему. Ээ моё такое мнение, Дим, у тебя какое? Мой любимый анекдот - это когда Amazon упал, собрались собрался весь отделпса и с инженеров и решали хардлевел лидкода. И магическим образом всё зачинилось. >> А что это реально? Да. >> Дада. Дасутка. >> О'кей. А цену мок интервью озвучили. А какая цена занятия после? А я сразу скажу, что да, она больше, потому что понятно, что мы не смогли бы вообще никак работать, если бы продавали всё по цене мокнтервью. На всякий случай скажу, что МО интервью мы продаём вообще в убыток, да. Поэтому занятие дальше зависит от того, какой вы выберете план занятий, того, какой вы у вас будет ментор, сколько у вас будет занятий и так далее. Но, да, в среднем это от 4 до 6.000 руб., да, вот где-то в этом диапазоне будет цена вашего занятия дальнейшего. А, да, собственно, ещё вопрос. Добрый вечер. Поздно подключился. Подскажите платформу для подготовки к текстовесу, чтобы найти пробелы и закрепить знания. Точно придите к нам на Мок интервью за 2.000 ээ и спросите ещё у ментора, может быть, да, если даже не хотите дальше заниматься. Можете прямо ментора спросить, типа, а что мне ещё заботать? Куда, на какую платформу мне пойти, что сделать? Он скажет: "Вот, видимо, литкод платформа для подготовки с обесм чат GPT". Ну, кстати, да, но мне кажется, что вообще Chad GPT много для чего помогает, но Ча GPT точно не сможет, мне кажется, субъективное мнение человека воспринять, да, и в целом не сможет провести, наверное, собс эмулировать с ним собисы, но мне кажется, это не то же самое, что проходить их как бы даже в качестве МОК. Вот. А и есть ещё вопрос Q&A, э, насколько возможно устроиться go interтер разработчикам без опыта коммерческой разработки? Здесь вопрос, конечно, являетесь ли вы студентом, являетесь ли или вам побольше лет? Ну, судя по нику, я думаю, что это студент, да, потому что название группы, скорее всего, есть. А это я гипотетически, Илья. Да. Ну, супер. А, Алексей, может быть, ты как раз расскажешь. Я, насколько понимаю, ты недавно этот путь проходил, связанный с поиском стажировок. Можешь рассказать здесь чуть-чуть? >> Ну да, недавно проходил и ещё буду проходить, похоже. Ну я считаю, что реально для меня, ну я думаю, что главное - это пробовать поддаваться, решать задания, которые тебе дают. Если зовут нас обес проходить, приходить, пытаться проходить. Ну и постепенно как это с каждым разом всё будет лучше и лучше, и тебя куда-нибудь возьмут. Поэтому я считаю, что нужно подаваться, ну на все стажировки. как бы сейчас их по минимуму, а, ну вот после нового года должно быть больше. Ну, как бы просто подаваться на все. Если дают какие-то задания, завод на собесы, всё стараться делать, проходить. Ну и тогда кто-нибудь тебя позовёт. >> Ну, глав главное пытаться. Ну и мне кажется, ещё что немаловажно, например, как я попадал на стажировки, ищите какие-то образовательные проекты от больших компаний в вашем университете или в целом какие-то контакты или любые образовательные, на самом деле проекты. У Яндекса Академия Яндекса есть, уf, у Авитоже наверняка что-нибудь есть. Э- идите туда, да? Туда. Отбор на образовательные программы, он, э, обычно проще, чем отбор на стажировку, но зато на образовательной программе вы сможете показать себя классно и, э, как бы потом залететь на работу. А, дайте идею для ПД-проекта, чтобы покрыть требования рынка. Нет такого пэт-проекта, который бы вам заменил коммерческий опыт, да? К сожалению, э, и я думаю, что пт проект нужно выбирать. Что вам по кайфу делать, то и делайте. Вот. Ну, наверное, там, не знаю, может быть, автоскамер лучше не писать, который будет звонить бабушкам и, не знаю, говорить, что до конца земли осталось 5 секунд и иначе нужно перевести карту на карту 5.000. Но как бы всё остальное, я думаю, что можете э начните пэт-проект с бизнес-модели. Это очень хороший совет, если вы хотите сделать не прогерский птпроект, да? Вообще, если делать птекты, существуют двух типов, да? Есть петпроект, когда мы хотим попроть, и тогда мы просто прогаем. Но обычно все такие птекты, 99 таких пдпроектов из 100, они закончатся поделкой на вашем компуктере. Да, большинство. Есть второй тип проектов, когда вы говорите: "Мне пофиг, я прогаю или не прогаю, я хочу, чтобы были пользователи". И тогда, если вы начинаете делать такой птпроект, ни в коем случае нельзя программировать, вообще запрещено. Это запрет. Вы должны покупать рекламу, спрашивать пользовательские потребности, делать ленды, собирать ботов, науковые инструментов, потому что любое программирование, когда появляется, оно значительно усложняет сложность вообще всего, что вы делаете. Вот это моё мнение, как человека, который был разработчиком и делал пт проекты и на собственно канале, которого сейчас вот есть стрим. Э и это тоже начиналось как птект. И как раз шорткат начинался как тект, в котором запрещено кодить. Вот. И у нас до сих пор всё науко инструментах и прочих штуках. Вот. А как-то так. Как вы относитесь к накрутке опыта? С осторожностью. Вот такой. Если от я, видите, у меня сегодня какое-то такое настроение вот так отвечать на вопросы. А если говорить серьёзно, то мне кажется, накрутка опыта - это как бы это инструмент, если вы действительно что-то знаете и можете подтвердить накрученный опыт знаниями, но не так, что вы накрутили себе 5 лет опыта и пришли на Собис и там ничего не можете ответить. Можно, конечно, заскамить особис и попросить знакомого синьора пройти до вас, а потом пойти за ним. Но знакомый синьор за вас вряд ли будет работать. Но бывает, конечно, так, что некоторые сеньёры будут за вас работать, но тут как бы вопрос, как далеко вы готовы в этом всём пойти, да, и в чём ваша цель, да, и мне кажется, что, конечно, человек, который пришёл, э человек, который пришёл и прошёл сам собес, я думаю, на работе себя будет чувствовать гораздо более уверенно, чем человек, который заскамил систему, попал на работу. И думаю, что мне было бы очень тревожно, например, а тогда, э, Дим, а ты, кстати, что думаешь, какое у тебя здесь мнение, как человека более опытного разработки? >> Да у меня нет мнения. В любом случае я приду собяс, посмотрю на человека. >> Ну то есть вот а если человек как бы до этого ему себе слили, твой >> Слушай, не завайбим, значит, всегда есть испыталочка. >> Ну да, да, да. О'кей. Политкорректный ответ. Ну, ну у меня это, а, поли у Дима, наверное, да, у меня, может быть, менее политкорректно. О'кей. Но мне кажется, что если вы сейчас в университете, накручивать опыт, ну, мо каждый решает для себя, но я, например, в универе опыт не крутил. Меня круче пройти на стажировку и с крутыми, так сказать, ребятами повариться. У Дмитрия политкорректный ответ. Ну вот, понимаете, объяснение ста. >> Вот у нас тут двое. >> Вот. Э-э, о'кей. >> Я тут зацепился за один вопрос, точнее за один комментарий. Анализировать размер файла и его тип на стороне клиента. Можно, можно, но это не решает ничего, потому что всегда можно заскамить сервер, а, и отправить любой файл куда угодно, просто попиш. Поэтому на клиент возлагать ничего нельзя. Если вы делаете бэкэнд, делайте любую валидацию, которая возможна на вашей совесть. >> Да, всегда валидация должна быть на бэкэнде >> или в двух местах, если не хочется на бэкэнд что-то отсылать. >> Ну да, да, всё так. >> Лучше в двух. >> Это правда. Это правда. О'кей, ребят, давайте ещё ждём ваши вопросы. На все вопросы будем отвечать. Если у вас вопросов нет, а пока их нет, скажу, что да, можно сегодня прийти на МОК интервью, оставить заявку, оплатить всего лишь 2.000 руб. Если вам не понравится, мы вернём деньги. А это Мок интервью - это супер классный час, который вы проведёте с ментором из бигтеха или из компании, да, куда вы хотите по э где вы будете обсуждать темы, которые, да, вы хотели обсудить, либо такой усреднённый Гош насобец, по итогам, да, которого вы получите классный план развития. Нигде такого ещё нигде такого, в общем, за 2.000 сделать больше 100% нельзя. А, ну я думаю, что мы будем завершаться постепенно, да? Вопросов, кажется, больше нет. Дим, вот можно я тогда спрошу, раз пришёл, вот ты раньше всё на H навыках был, но вот где-то месяцев сколько, 789 назад, ну, навыки вот перестали вообще что-либо выпускать, и ты, не знаю, вот лично для меня куда-то пропал. Потом я как-то, не знаю, может месяц назад смотрю вот в рекламах там в ТГ каналахшо как бы боковый сабес. Я, ну, посмотрел, что такое на Ютубе Shortcutт канал. Смотрю, это ты. Не знаю, вот можешь ли ты объяснить, как так получилось, что ты счков перешёл в шортка? >> Я могу могу Лёш, объяснить, но дава но могу вне эфира. Давай я так сделаю. Думаю, мало, во-первых, кому это интересно. Мало, может, не так много людей знают, что такое чнавыки. Вот. А, да, Димы и Алексей как пришли в Гошку. Э-э, я, ну, как-то вот так вот получилось. В университете у меня был курс по Го, который читал, в том числе Дима. Дима, а ты как пришёл в Гошку? Ну, >> у меня не было курса в университете, но это было тоже в университете. Я выучил Гошку, когда делал один проект по курсу Хайлода. И тогда никто не выбирал Гошку. Гошка только не так давно, на самом деле, появилась. Ну, она появилась уже какое-то время назад, но только начинала становиться популярной. Это было в 2015 году. И, ну, вот 10 лет назад уже, да. И, а, тогда у меня был достаточно большой опыт по хп и фронта, и я решил э посмотреть на этот новый прекрасный язык. А в итоге зашло, и я стал на нём разрабатывать. >> Лёш, а ты как в Гошку пришёл? >> А, ну тоже познакомился с программированием в институте. В начале у меня были плюсы, но плюсы мне как-то не зашли. А потом был питон. Питон мне понравился больше. Стал в нём активно развиваться. Делал бакалаврский вот дипломный проект на Питоне. Потом так получилось, что сменил институт там научного руководителя. И получается, как пришёл в магистратуру, вот новый научный руководитель сказал, что вот теперь у нас будет проект, ну, на Гошке. А так что переучивайся, начал изучать Гошку. В целом Го мне сразу как-то очень понравилось, и я решил просто вот всё в нём дальше развиваться. >> Спасибо. Спасибо. Крутой тоже вопрос, мне кажется. Я думаю, что будет сегодня последним. А GO Java C#P. Что лучше для Bound? Что лучше для CPU bound операции? Есть вот кого-то я просто Дим, может ты знаешь? Я не знаю. Ну слушай, явно гошка для i boу, >> а для CPU bound вопросики нужно смотреть на на конкретику, >> возможно раз, >> да, Cloudфр показал. >> Ну, ээ, я думаю там, ну, видишь, поднялся Дим, мне кажется, они там тоже лидкот решали просто. Ну да, да, да, кстати, 4 часа, конечно, >> 4 часа жёстко собрались, заботали весь леткод. >> О'кей, >> кстати, Зик, да, Зик хороший, хороший вариант. >> А я, кстати, первый слышал вообще к своему сту. Ну ладно. >> Ну, если знаешь, терминал гости, он на Зиге написан. М. О'кей, о'кей. А, о'кей. Я думаю, что будем завершаться. Спасибо большое за то, что, собственно, Лёш, ты к нам сегодня подключился за 5 минут до стрима. Это самое быстрое подключение, так сказать, что у нас было за всё время, что я занимаюсь, что навыками, что шорткатом. Спасибо тебе за это большое. Супер. Благодарен. >> Да, >> спасибо, что позвал. >> Пожалуйста, Дим, спасибо тебе за то, что сегодня подключился. Так вот мы, видишь, как быстро тоже в воздухе ты переобулся с вопросами. Спасибо тебе тоже большое за это и за готовность к нам периодически приходить. Вот. Но самое большое спасибо вам, дорогие наши зрители, за то, что были сегодня с нами, за то, что нас смотрите. А приходите к нам, конечно, во-первых, на мок интервью, да, это стоит 2.000 руб. Это частное едини с ментором, а потом классный фидбэк. Если вам не понравится, мы вернём деньги. И, конечно, спасибо, что приходите к нам на стримы. Без вас бы это всё было ненужно и бесполезно. И до встречи в следующий четверг. Пока-пока.
The words are the caption track's own and nothing is reworded or re-transcribed. Paragraph breaks are placed between sentences so the text reads as prose.
Free tools for your own script. No signup, no login.
Paste your draft and see where viewers are likely to drop off, with a rewrite for each weak line.
Paste the first 30 seconds of your own draft for a hook score and rewrites.
Check your draft against YouTube's advertiser-friendly guidelines before you record it.
Read this channel's public videos and transcripts, and download a writing brief for it.