TGViewer
Channel Public Channel
{ Снежные строки }

{ Снежные строки }

@snowlines

Фронтенд разработка и уютные беседы
Subscribers
89
Photos
22
Videos
4
Links
7
Recent Posts 20 shown
Post #93 334
❄️ Вернулась с отпуска, сейчас нужно заново научиться работать
  • 🔥 12
  • 💯 1
Post #92 303
❄️ Хочу начать серию постов про Redux

Redux - state manager, которым я пользуюсь, как в личных проектах, так и на работе
Пробовала на практике MobX и Zustand - оба интересные, но по личному комфорту Redux у меня на первом месте 🤓

Менеджер состояний (State manager)
Что вообще такое и для чего нужен?
Это инструмент для хранения и управления состоянием приложения.

Пример состояний:
- Авторизован ли пользователь
- Открыто ли модальное окно
- Данные от сервера (например информация о пользователе и тд)

В маленьких приложениях такие данные можно хранить прямо в компонентах через useState и прокидывать дальше через пропсы

Маленькая история из жизни 🤕
На своем первом рабочем проекте я так и начала делать: просто прокидывала все состояния через пропсы в компоненты, где они были нужны.
Но проект начал разрастаться - и цепочка дошла до 10+ уровней вложенности.
Добавить новый экран или фичу - отдельная боль.
Логика дублировалась, дебажить сложно, да и вообще на код без слез не взглянешь

Спустя 3 месяца работы мы с тимлидом все же прикрутили Redux и все зарефакторили (к слову, этот проект мы переписывали с нуля раза четыре 🫠)

❕Зачем нужен Redux?
➖ Хранить состояние в одном месте
➖ Отделить бизнес логику от UI
➖ Очень легко дебажить (у редакса есть свои DevTools)
➖ Сделать состояние предсказуемым

❄️ В следующий раз расскажу более подробно про сам Redux и что там внутри!

#React #Redux
  • 🔥 8
  • 👨‍💻 2
Post #90 237
#Задачи
Post #89 253
❄️ Функция высшего порядка
Тема, которую можно встретить на собеседованиях очень часто. Давайте разберемся! 🤓

Если вы программируете на JavaScript, но никогда не слышали про функции высшего порядка, то вы точно с ними сталкивались.
Так как JavaScript поддерживает функциональное программирование.

❕Функция высшего порядка — это функция, которая принимает другие функции в качестве аргументов или возвращает функции в качестве результата

➖ Функция, которая принимает другую функцию в качестве аргумента - функция обратного вызова.
Возьмем примеры из JavaScript: map, filter, forEach, setTimeout и еще много других.

const numbers = [1, 2, 3];

const doubled = numbers.map((num) => num * 2);

console.log(doubled); // [2, 4, 6]


map - это функция высшего порядка. Она принимает другую функцию (колбэк), которая применяется к каждому элементу

➖ Теперь пример функции, которая возвращает другую функцию:
Такие функции часто используются для замыканий, каррирования или динамического создания логики.

function greet(name) {
return function (greeting) {
console.log(`${greeting}, ${name}!`);
};
}

const greetAnna = greet('Анна');
greetAnna('Привет'); // Привет, Анна!
greetAnna('Доброе утро'); // Доброе утро, Анна!


❕Вопросы, которые могут встретиться на собеседовании по этой теме:
1. Что такое функция высшего порядка?
2. Приведите пример HOF из стандартной библиотеки JS.
3. Какие преимущества дают HOF в коде?


#Собеседование #JavaScript
  • 🔥 7
Post #88 203
❄️ Привет! Хотела у вас поинтересоваться - какие вопросы на собеседованиях вам действительно показались интересными и зацепили?

За последние годы я прошла несколько собесов (не сказала бы, что прям много). Большинство вопросов - вполне ожидаемые, будто достаточно просто зазубрить стандартный список, чтобы пройти.

Но иногда попадаются реально классные вопросы - такие, что заставляют задуматься или, как в моем случае, вспомнить университетскую программу 🤓

Делитесь в комментах: какой вопрос на собеседовании вас удивил или запомнился?
Можно не только по фронтенду - будет интересно посмотреть.

А потом, мало ли, может соберу это в отдельный пост
  • 👨‍💻 7
  • ❤ 1
Post #87 250
❄️ Недавно посетила конференцию DUMP — это первая конференция, на которой я была оффлайн.
Все очень понравилось, и наконец-то дошли руки разобрать доклады.
Хочу начать делиться краткими выжимками докладов

Тема: Тестирование сложных утилитарных типов в реальных проектах
Автор рассказывал про TypeScript и тестирование сложных типов.
Честно, раньше я вообще не задумывалась об этом

❕ Проблема
TypeScript не умеет сравнивать типы напрямую как T1 === T2 на уровне кода.

❕ Решение
Пишем специальные вспомогательные типы, которые проверяют "эквивалентность" типов во время компиляции.

type Expect<T extends true> = T;

type Equals<T1, T2> =
(<T>(x: T) => T extends T1 ? 2 : 1) extends
(<T>(x: T) => T extends T2 ? 2 : 1) ? true : false

type NotEquals<T1, T2> = true extends Equals<T1, T2> ? false : true;


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

Вообще прикольно, как в TypeScript можно завернуть очень нетривиальную логику,
Обычно используются какие-то базовые утилитарные типы - и всё

Вот ссылки на статьи, чтобы разобраться более подробно:
https://habr.com/ru/companies/cloud_ru/articles/860764/
https://habr.com/ru/companies/cloud_ru/articles/860770/
https://habr.com/ru/companies/cloud_ru/articles/868762/
https://habr.com/ru/companies/cloud_ru/articles/860778/
https://habr.com/ru/companies/cloud_ru/articles/865118/
  • 🔥 11
Post #86 220
  • 🫡 9
  • 😁 3
  • 🙊 2
  • 👎 1
  • 🙉 1
Post #85 218
❄️ Я наконец-то пощупала Docker!
Разрабатываем с друзьями приложение, которое близится к завершению (надеюсь).
Перед деплоем на каком-то удалённом сервере возник вопрос — как это всё организовать по-умному?
Захотела сделать всё с помощью докера. Бэкенд написан на Nest.js, база данных MongoDB.

Оказалось, не всё так сложно, как я думала изначально

🐳 Что я сделала:

➖Создала в корневой папке проекта Dockerfile - он описывает, как собрать образ нашего приложения.

#############
# The Build Stage
#############
FROM node:20-alpine AS build
WORKDIR /app
COPY package*.json .
RUN npm install
COPY . .
RUN npm run build

#############
# The Production Stage
#############
FROM node:20-alpine AS prod
WORKDIR /app
COPY package*.json .
RUN npm install --only=production
COPY --from=build /app/dist ./dist
ENV PORT=3000
EXPOSE ${PORT}
CMD ["npm", "run", "start:prod"]


➖ Также создала docker-compose.yml - он управляет несколькими контейнерами.

version: '3.8'

services:
backend:
build: .
container_name: nest_backend
ports:
- "3000:3000"
depends_on:
- mongodb
environment:
- MONGO_URI=<your-mongo-uri>
- SECRET_ACCESS=<your-access-secret>
- SECRET_REFRESH=<your-refresh-secret>
restart: unless-stopped

mongodb:
image: mongo:6
container_name: mongo_db
ports:
- "27017:27017"
volumes:
- mongo_data:/data/db
restart: unless-stopped

volumes:
mongo_data:

📌 Чувствительные переменные лучше хранить в .env. Здесь — просто заглушки для примера.

Сборка и запуск контейнера
docker-compose up --build -d


Локально все работает!
Осталось теперь организовать это все на удаленном сервере.
Изначально была идея воспользоваться бесплатным сервисами, например Railway, но там не вышло. Были ошибки с базой данных 😢
Возможно разберусь с ними, либо буду смотреть на другие варианты

Как будут результаты, расскажу более подробнее!
  • 👨‍💻 8
  • 👍 1
Post #84 233
❄️ Ура, завтра каникулы
  • 🤣 6
  • 😁 5
  • 🔥 2
Post #83 204
На конференции DUMP
  • 🔥 11
  • 👍 2
  • ❤ 1
Post #82 196
  • 👍 4
Post #81 230
❄️ Слышали ли вы когда-нибудь о верстке в слепую? Или может практикуете?

Когда в рабочих задачах доходит до верстки макетов - я люблю делать это вслепую. То есть пишу компоненты и стили, не заглядывая в браузер.
Как будто челлендж: а получится ли всё идеально с первого раза?

Плюс в этом режиме хочется верстать максимально быстро - пока не засекала время, но наверное стоит попробовать.

❕ Хотела выделить преимущества и плюсы, которые дает такая практика:

➖ Меньше скуки.
Перенос макетов - рутинный этап задачи (особенно по сравнению с написанием логики). А если добавить элемент челленджа — становится веселее.

➖ Больше уверенности.
В начале свое пути во фронтенде, верстка пугала. Особенно сложные макеты и комментарии от дизайнера уже после релиза, так как не было уверенности в своих знаниях 😢

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

Кстати, недавно узнала, что на IT-конференциях иногда проводят соревнования по верстке вслепую.
Надеюсь будет возможность как-нибудь поучаствовать, очень интересно

❔ И еще вопрос, который меня волнует.
Как вы считаете, должен ли фронтенд разработчик верстать? Или тут все зависит от грейда разработчика?
  • 👍 6
  • 🙉 1
Post #80 245
❄️ Решила пощупать Telegram Mini Apps
Приложение максимально простое — тест с вопросами по фронтенду, сделалa за вечер после работы буквально на коленке

Цель была — потрогать SDK и понять, как вообще работают TMA. Использовала telegram-apps/sdk

Для такого простого приложения со серьезными сложностями я не столкнулась, нужно будет придумать что-то посерьезнее, но пока вот делюсь этим 😌
В планах - разобраться глубже в документации и не забрасывать

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

Ссылка на приложение:
https://t.me/ReactRushBot
  • 🔥 10
Post #79 229
❄️ Продолжим разбираться в алгоритмах!
Хочу разобрать самую первую задачу на leetCode.

1. Two Sum
Описание:
Дан массив целых чисел nums и целое число target.
Нужно найти два разных индекса i и j, такие что:
nums[i] + nums[j] === target.
Вернуть нужно массив [i, j].
Гарантируется, что решение всегда есть, и один элемент нельзя использовать дважды.

❕ Решать данную задачу рекомендуется с помощью хэш-таблиц.
Хэш-таблицы - Структура данных, реализована ассоциативным массивом. Структура связывает ключи со значением.

Алгоритм работы:

Сначала заполняем хэш-таблицу: кладём туда все элементы из массива, где:
- ключ — это само число
- значение — его индекс

Затем проходим по массиву снова:
1. Для каждого числа nums[i] считаем, какое число нужно к нему в пару, чтобы в сумме получился target.
target - nums[i]
2. Проверяем: а есть ли такое число в нашей хэш-таблице?
3. Если есть, и его индекс не совпадает с текущим — возвращаем пару индексов.

Код
var twoSum = function(nums, target) {
    const hash = {};
    nums.forEach((item, index) => hash[item] = index);

    for (let i = 0; i < nums.length; i++)
    {
        let findKey = target - nums[i];

        if (hash[findKey] && hash[findKey] != i)
            return [i, hash[findKey]];
    }

    return [];
};


❄️ Задачи для практики:
217. Contains Duplicate
219. Contains Duplicate II
560. Subarray Sum Equals K

#JavaScript #Алгоритмы
  • 👍 8
  • 🔥 4
Post #78 199
❄️ Ура, с пятницей!
  • ❤ 9
  • 🙊 3
  • 🔥 1
  • 🤣 1
Post #77 216
❄️ Давайте погружаться в TypeScript!

Сегодня хочу рассказать про Utility Types. В начале своей карьеры я почти не использовала их и не понимала, почему про них так часто спрашивают на собеседованиях.
Но спустя время и набравшись больше опыта, поняла, что это реально удобно!

🔹Utility Types – что это такое?
Это набор встроенных типов, они помогают:
- Избегать дублирования кода
- Делать типы более гибкими
- Упрощать сложные операции с типами

🔹Основные Utility Types

Partial<T>
Делает все свойства типа T необязательными.

Required<T>
Противоположность Partial — делает все поля обязательными.

Readonly<T>
Запрещает изменять свойства объекта.

Pick<T, K>
Создаёт тип, выбирая набор свойств K
interface User {
name: string;
age: number;
}
type UserName = Pick<User, "name">;
// { name: string }


Omit<T, K>
Создаёт тип, выбирая все свойства из T и затем удаляя K
interface User {
name: string;
age: number;
}
type UserName = Omit<User, "name">;
// { age: number }


Record<Keys, Type>
Создаёт тип объекта, ключи свойств которого — K и значения свойств — T
type PageUrls = Record<string, string>;
// { [key: string]: string }


❄️ Для работы я в основном использую Record, Omit и Pick - они покрывают большинство повседневных задач

#typeScript
  • 👨‍💻 11
Post #76 218
❄️ 12 недель: как я планировала свои цели и что из этого вышло

В начале года я прочитала книгу Брайана Морана "12 недель в году.". Основная идея книги — ставить цели не на год, а на 12 недель.
Автор утверждает, что такой подход помогает достигать результатов быстрее и эффективнее. Я решила попробовать и в январе начала свои первые 12 недель. Сейчас, когда этот период подошел к концу, хочу поделиться результатами и выводами. ✨

Мои направления и результаты: 

Frontend 💻
➖ Личный проект с друзьями: Наконец-то сдвинулся с мертвой точки! По плану релиз должен был состояться в конце марта, но мы немного не успели. Тем не менее, прогресс есть, и я уверена, что скоро мы завершим проект.
➖ Алгоритмы: В начале я забыла про этот пункт, но потом взяла себя в руки и начала стабильно изучать по одной теме в неделю, решая задачи на Leetcode. Однако из-за отсутствия четких целей оценить результаты сложно. 🤔

Gamedev 🎮
Тут все пошло не так, как планировалось. Мотивация быстро пропала, и я не могла заставить себя выделять время на это. Проблема, как я теперь понимаю, в отсутствии четкого плана. Я начала читать документацию по Unity и смотреть уроки, но из-за того, что у меня уже есть базовые знания программирования, уроки казались скучными. В следующий раз я постараюсь поставить конкретные цели (например, создать простую игру за 12 недель, нужно подумать).

Личный технический блог ✍️
Цель была — не забрасывать блог и писать посты регулярно. С этим я справилась: посты выходили стабильно. Я не ставила целей по количеству подписчиков, но их рост приятно радует. Правда, теперь чувствую больше ответственности перед аудиторией.

Накопления 💰
Тут все прошло гладко. Я поставила цель накопить определенную сумму и выполнила ее без проблем.


‼️ Ошибки и выводы:

Недавно я прочитала книгу Катерины Ленгольд "Agile Life", где автор предлагает планировать задачи на спринты: 3 недели работы и 1 неделя отдыха. Это открыло мне глаза на одну из моих главных ошибок — я не учла время на отдых.
В результате на 7-й неделе я выгорела и ничего не делала, а 11-я неделя вылетела из-за отпуска. Это повлияло на мои результаты. 😓

Пришло понимание, что отдых — это необходимость. Если не планировать его заранее, то организм неожиданно сам его себе организует. После завершения этих 12 недель я возьму паузу, чтобы проанализировать свои результаты и спланировать следующий цикл с учетом уже новых знаний. 🧘‍♀️

А как вы планируете свои цели? Мне будет интересно узнать!
  • 🔥 11
  • 👨‍💻 2
  • 👍 1
Post #75 225
#Задачи
  • 👍 6
Older posts →

About this channel

How can I read @snowlines without a Telegram account?
TGViewer shows the public web preview Telegram publishes for { Снежные строки }: recent posts, photos, videos and the subscriber count, with no app, login or account.
How many subscribers does { Снежные строки } have?
{ Снежные строки } (@snowlines) has 89 subscribers on Telegram, refreshed roughly every 30 minutes.
Does { Снежные строки } know I viewed it here?
No. Public channel previews carry no viewer identity, and TGViewer has no accounts or tracking of what you look up.
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →