Pull to refresh
3
0
Богдан @bohdan-shulha

User

Send message

Система ролей в данном случае может выглядеть и простым пятистрочным конфигом + одним единственным сервисом, который умеет читать его и говорить "да"/"нет" на запрос доступа от конкретного юзера. 2 минуты подумать, 15 строк кода и Серёжа неправ.

Хорошая архитектура это не про "давайте юзать r/w базу везде и к каждой сущности добавлять инструмент управления", а про поддержку, расширяемость и адаптирование к новым требованиям.

Реактовские компоненты лучше объявлять так:

Когда у вас компонент обрабатывает children и вот так, если нет:

const Person: React.VFC = (props) => ...

Вся соль здесь:

type FC<P = {}> = FunctionComponent<P>;

interface FunctionComponent<P = {}> {
  // Вот тут - PropsWithChildren
  (props: PropsWithChildren<P>, context?: any): ReactElement<any, any> | null
  ...
}

type VFC<P = {}> = VoidFunctionComponent<P>;

interface VoidFunctionComponent<P = {}> {
  // А тут - только те props, которые вы указали
  (props: P, context?: any): ReactElement<any, any> | null
  ...
]

В последнее время я прихожу к тому, что лучше всегда опираться на VFC и явно указывать, где необходимо передавать children

Я думаю, сыграла на руку небольшая армия фанатов (юзеров сайта) и анонс среди своих :)

Мы заметили, что не все голоса с новых аккаунтов проходили (делали опрос по знакомым). Похоже, что у них там много скрытых (и, видимо, работающих) механизмов от накруток.

Помимо этого, день был действительно релаксовым - действительно не было сильных конкурентов.

Наш портал - https://ess.gg

Мы тоже запускались в ноябре :)

Выбрали субботу - у нас тоже, как верно вы заметили, не no-code платформа или очередной редактор картинок. Немного прозаичнее - статистика по киберспорту. Заняли #1 ;)

Стресс, конечно, тот ещё был.

А мне 30 (ой, уже 31...) и я формочки делаю ;)

Люблю современный мир за то, что знания и техника доступы как никогда ранее. Желаю вам успехов в будущей карьере и не выгореть где-то по пути :)

Что касается вышки, я, будучи неучем, всё же рекомендовал бы пройти ВУЗ. И не заочку, что важно, ведь корочка сама по себе сегодня ничего не стоит.

Если повезёт, то это:

  • поможет прокачать фундаментальные знания (самостоятельно это может быть или долго, или неинтересно, или из области, которая совершенно не связана с основной деятельностью напрямую)

  • возможность обрести полезные знакомства (если одногруппники будут адекватными - в будущем будет неплохое подспорье в карьере и бизнесе)

  • участвие во всевозможных хакатонах, получение грантов и прочие увлекательные мероприятия

  • скидки на продукты крупных компаний

  • стажировки в тех же крупных компаниях

  • возможность пожить в другой стране по программе обмена

  • социализация, куда же без неё, особенно в мире удалёнки

Многое из этого можно и без универа, конечно, но расти в конкурентной среде, где Вася за соседней партой получает уже 5 грант за свои наработки, гораздо интереснее и увлекательнее :)

К тому же, это, зачастую, "потеря" всего первых трёх лет, т.к. очень много талантливых студентов уже на 4 курсе трудоустроены и уделяют учёбе ровно столько времени, сколько им нравится (от "пойду заплачу за сессию" до "о, круто, лекция о новых алгоритмах").

Ну да, ну да. Земля плоская, а Pfizer раздаёт 5G :)

Существование товарищей, что верят в вышеуказанные "факты" ещё более странно.

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

Я нисколько не поддерживаю людей из 1-5, но все мы люди уникальные со своим собственным жизненным опытом и своими личными убеждениями.

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

На самом деле, всё просто и сложно одновременно.

Я вижу несколько категорий:

1) Идейные - за Великую Россию, царя-батюшку и всё такое.

2) Специалисты, вырощенные спецслужбами изначально - тут, по умолчанию, будет делаться всё во благо текущего строя.

3) Люди с пониженной самооценкой, которые работали в гос. структуре до внедрения подобных средств, думающие, что их никуда больше не возьмут или боящиеся выходить из зоны комфорта. Боящиеся какого-либо преследования из-за того, что ушли.

4) Простые работяги, которые пришли в структуру за "куском хлеба" и стабильностью.

5) Гении, что стремятся делать максимально сложные и масштабные проекты.

У каждой группы своя мотивация и далеко не все участники совершают деяние с целью навредить.

Любой разработчик знает, что существуют задачи (особенно, если ты работаешь один как фрилансер или в небольшой студии, в которой «один проект — один ответственный») когда можно работать без гита

Видимо, я какой-то фейковый разработчик. Даже работая в одиночку, системя контроля версий приносит пользу: быстрый откат изменений; просмотр истории изменений (вида "ой, а что это я там менял, что у меня всё сломалось?"); собственно, сам контроль версий исходного кода (вида "надо тут эту фичу назад вернуть, раньше было лучше"). В некоторых вариациях, это деплой одной командой или мониторинг "а не закинули нам какого скрипта лишнего?".

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

Только после вашего комментария узнал о том, что там какие-то окошки вылазят :)

Это зависит от времени, которое вы держите Alt. Я переключаю язык без задержек и у меня окошко не вылазит. Может быть, можно через regedit подправить это время.

Мне кажется, не указали самого главного - сколько это стоило заказчику (денег и времени) и какой экономический эффект от переезда (денег и ускорения процессов).

Неплохо было бы обозначить, для чего это надо, поскольку в nextjs из коробки есть сразу несколько решений, которые делают практически то же самое:
- static html export - для получения полностью статической версии сайта
- automatic static optimization - для генерирования статических страниц с возможностью подгрузки новых данных после загрузки страницы.

Конечно, они работают без Redis, но я не понимаю, для чего необходимо делать лишний round-trip по сети для отображения статических ресурсов.

Я использую plopjs. Очень прост в настройке и использовании. Рекомендую :)
По моему опыту, тесты (в частности, юнит-тесты) помогают не баги отлавливать (это делает QA команда), а дают хотя бы минимальную уверенность в том, что при рефакторинге или добавлении нового функционала что-то да не отвалится. Поскольку тесты пишет тот же человек, что и код, покрывает он только те случаи, о которых разработчик сам догадается. Тест тут магическим образом, увы, не поймает багу. :(
> нам ведь нет смысла реализовывать back/forward логику в телеграмме

Очень спорно. В своем боте реализовал поддержку истории со многоуровневыми меню и переходами между разными «экранами», пользователи, вроде бы, довольны.

Я, правда, использую кастомную клавиатуру, а не инлайн-кнопки, но то такое.

В общем, юз-кейсы могут быть абсолютно непредсказуемыми и утверждать, что чего-то не надо — опрометчиво.
А как доказать, что строка, которая пришла с сервера, это действительно UserName, а не что-то иное? Предполагается, что приведение типов будет использоваться в фабриках, а по приложению будут ползти уже Value Object. Этот способ, как минимум, гарантирует, что нельзя будет случайно передать рандомную строку вместо UserName.

Я могу ошибаться, но вы именно о таком поведении писали в комментарии выше.
Буквально вчера делал у себя на проекте похожую штуку. Работает :)

type UserName = string & { readonly tag: unique symbol };
type Password = string & { readonly tag: unique symbol };

const nameOf = (name: string) => name as UserName;

function stringOf(name: UserName): string {
  return name;
}

stringOf(nameOf("bingo347")) // OK
stringOf("bohdan-shulha") // Argument of type '"bohdan-shulha"' is not assignable to parameter of type 'UserName'.
stringOf("hellowrld" as Password) // Argument of type 'Password' is not assignable to parameter of type 'UserName'.

Не сталкивались ли вы с задачей ограничения доступа к тесту по времени? Делал небольшое исследование по доступным плагинам, но руки не дошли попробовать ни один из них.
Мне не сильно по душе классы — я больше сторонник clojure подхода к данным. Но это всё вкусовщина.

Я сейчас много пишу на Реакте и тоже привык к функциональному подходу и иммутабельными данными и трансформациями (как я раньше без этого жил?). У классов в моём случае преимущество состоит в том, что можно применять декораторы к полям. Я планировал добавить поддержку кастомных трансформеров.

В выдуманном примере может быть так:
@Transform()
class DataObject {
  @Expose({ 
    toClassField: (value) => value.split(';'), 
    fromClassField: (value) => value.join(';') 
  })
  dataField: Array<number>;
}

const input = JSON.parse('{ "dataField": "1;2;3;4" }');

const obj = plainToDataObject(input);

// isArray(obj.dataField) === true
Я в исследовательских целях делал генератор на базе AST для конвертирования JSON в инстансы классов и наоборот. Рантайм оверхед — 0. Работу вёл в рамках proof of concept, до рабочей версии довести это пока нет времени. Пользоваться можно было бы как-то так (но с дополнительным степом вызова CLI, чтобы среда разработки, линтеры и люди тоже подхватили новые функции):

// src/models.ts
import { Transform, Expose } from 'mycooljsonlib@localhost';

// Декораторы удаляются из скомпилированного кода, если использовать transformer, 
// поставляемый с либой. Подключение, правда, костылями, через ttypescript,
// потому что MS не желают (пока?) адекватно поддерживать 
// плагины в дефолтном конфиге TypeScript
// Декораторы сами по себе - просто маркеры для трансформера, они не меняют
// поведение классов и полей
@Transform()
export class PhoneNumber {
  name: string;
  countryCode: string;
  phone: string;
}

@Transform()
export class User {
  id: string;
  name: string;
  gender: "male" | "female";
  // Опциональные поля тоже допустимы
  age?: number;

  // Возможность переименовывать поля
  @Expose('phone_book')
  // В оригинале был объект, но я до этого не дополз, массив работал
  phoneBook: Array<PhoneNumber>;
}

// index.ts

// Я делал предположение, что лучше разрешить конвертировать любой объект,
// чем изначально завязываться на JSON строку
const plainObject = JSON.parse('<...input...>');

import { plainToUser } from './generated/models';

// В дальнейшем можно было бы добавить функции jsonToUser()
// На выходе получаем инстанс класса юзер
const user = plainToUser(plainObject);

// При обратной конвертации - объект
const plainAgain = userToPlain(user);

// generated/models.ts

export function plainToUser(plain): User {
  const obj = new User();

  if (typeof plain['id'] === 'string') {
    obj.id = plain['id'];
  } else {
    throw new Error('Invalid type for id: expected string, got <...>');
  }

  if (isArray(plain['phone_number'])) {
    obj.phoneNumber = plain['phone_number'].map(plainToPhoneNumber);
  } else {
    throw new Error('...');
  }

  // тут остальные проверки для оставшихся свойств

  return obj;
}
У меня Scaleway стабильно и непредсказуемо отваливался, в панели управления он отображался работающим. Решалось только через поддержку, ребут из панели управления не срабатывал.

Как-то уехал отдыхать, а сервер слёг где-то на неделю. Что интересно, ни разу не было ни «извините», ни «вот вам компенсация за ДНИ простоя». Перешёл на Hetzner и не жалею, хоть и плачу на 30% больше (решил немного мощнее инстанс взять).
1
23 ...

Information

Rating
Does not participate
Location
Винница, Винницкая обл., Украина
Registered
Activity