Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Messages - Квас

Pages: [1] 2 3 ... 104
1
Компьютеры и интернет / Re: Props
« on: 15 February 2026, 23:32:15 »
Никогда не юзал MutationObserver-ы! Но, очевидно, они работают в другую сторону: реагируют на изменения DOM-а.
  • 1
  • 0

2
Компьютеры и интернет / Re: Props
« on: 13 February 2026, 18:08:42 »
Конечно, объекты можно передавать в качестве аргументов.

Магия пропов заключается в том, что реакт следит за их изменениями и модифицирует DOM, когда их значения меняются. (В этом и заключается "реактивность".)
  • 1
  • 0

3
Потому что файлы проекта - это исходный код, который не попадает в браузер непосредственно, а предварительно преобразуется ("билдится") вместе с зависимостями в так называемый "бандл" - набор файлов, который хостится на сервере. Поэтому нужна по крайней мере команда "сбилдить".

Во-вторых, при разработке неудобно билдить приложение после каждого изменения. Поэтому используется "дев-сервер", который позволяет запустить приложение локально и автоматически обновляет его, когда файлы приложения меняются. Поэтому на практике очень полезна команда "запустить дев-сервер".

В-третьих, при разработке могут использоваться утилиты. Например, eslint, который следит за стандартным форматированием кода. Хотя обычно линтер не приходится запускать руками: он используется через IDE или хуки гита.

Ну и гит - куда же без него.
  • 2
  • 0

4
 :up: Надо будет попробовать!
  • 0
  • 0

5
Можно ещё докер поковырять по этому поводу. Наверно, вторым шагом. Докер - это поразительно удобно. Он позволяет запускать софт в контейнерах, то есть не устанавливая его на своей машине. Например, легко сделать три контейнера: в одном - сервер, в другом - база данных, в третьем - pgadmin. Сеть, по которой общаются сервер и база данных - тоже внутри докера, порты выделять не надо. Конфигурация прописывается в файле docker-compose.yml и запускается единственной командой docker-compose.yml.

Я один раз даже совместил таким образом dev-сервер фронтенда с бэкендом, избегая CORS, но конфиг, к сожалению, утерян.
  • 0
  • 0

6
Так они для ī и использовали (только у них это фонема, не аллофон). Другие долгие гласные могли обозначать чёрточкой, а ī - длинной буквой.
  • 0
  • 0

7
Компьютеры и интернет / Re: Что с Replit?
« on: 22 January 2026, 16:59:42 »
https://codesandbox.io/ для примеров побольше, многофайловых.
  • 2
  • 0

8
Компьютеры и интернет / Re: Что с Replit?
« on: 22 January 2026, 15:18:14 »
Это не то же самое примерно? https://rextester.com/ https://onecompiler.com/ А вот конкретно для тайпскрипта https://www.typescriptlang.org/play/
  • 0
  • 0

9
А как получить доступ к серверу? Через домен? :what?

Во-первых, надо его арендовать! И следовать инструкциям хозяина. Бывают платформы, которые позволяют бесплатно хостить небольшие приложения.
  • 0
  • 0

10
Это как, через fetch()? Я бэкэнд ещё вообще не трогал?

Т.е. я создаю <span>, пишу в него, браузер выполняет appendChild() и отправляет данные на сервер.

Ну, не span, наверно, а textarea. А appendChild - после того, как сервер вернёт "окей". Мало ли что - сетевая ошибка, или неавторизованная операция. Нужно следить, чтобы у браузера и у сервера совпадали идеи о наборе постов. А пока fetch работает, показывать спиннер какой-нибудь.

В проектах я библиотеками пользовался: axios или встроенный в Angular http-клиент.

А чтобы писать мог только я надо создавать многостраничный сайт? Редактор поста и ленту?

Достаточно и одной - ведь окно ввода может быть в самой ленте, как много где, на реддите том же. (Но даже если страниц несколько и поддерживается маршрутизация, всё равно реализовано может быть как single-page application.)
  • 0
  • 0

11
Общая архитектура? Нужен бэкенд, то есть сервер, на котором работает приложение блога. Фронтенд отправляет бэкенду текст с пометкой: сохрани эту запись блога. Бэкенд где-то её сохраняет - вероятно, в базе данных. Когда фронтенд попросит показать её - бэкенд достанет из базы и отправит фронтенду. Аутентификация и авторизация регулируют разрешения чтения и записи.
  • 1
  • 0

12
Компьютеры и интернет / Re: Front vs Back
« on: 19 January 2026, 00:04:32 »
В браузере js используется для манипуляций с загруженной страницей. Это язык, встроенный в браузер. Поэтому фронтенд по сути ограничен js-ом - нужно писать или на js, или на языке, который можно преобразовать в js.

На бэкенде node.js используется не просто для скриптов, а для самого веб-приложения. На бэкенде живёт основная логика, а в браузере - только пользовательский интерфейс. На бэкенде можно использовать какой угодно язык. Почему те или иные языки становятся мэйнстримными в индустрии - неочевидный вопрос. Объективно можно отметить такие свойства node.js как платформы: она не очень производительна, но очень оптимизирована для асинхронного ввода-вывода. Поэтому её имеет смысл использовать для приложений с нехитрой логикой и большой ролью ввода-вывода: грубо говоря, для прослойки между пользователем и базой данных.

Вообще, формулировка вопроса не очень понятная. 1 + 1 везде даст 2, в этом отношении реализации js в браузере и на node.js мало отличаются. Язык один и тот же, но применяется в разных ситуациях для разных задач.
  • 1
  • 0

13
> Как работают многоязычные сайты/приложения/игры?

По-разному, очевидно. Например, веб-сервер может вызывать внешнюю программу (неважно, на каком языке написанную) для создания динамических страниц. Тогда они общаются как юниксовые процессы, через стандартный вывод. А может быть, приложение организовано в виде микросервисов, которые общаются по HTTP.

> Как, например, работают JS и PHP не конфликтуя?

Обычно PHP работает на сервере, а JS - в браузере, и друг с другом не сталкиваются.
  • 1
  • 0

14
Насчёт чего у меня зачесались руки - что нужно разделить формулировку правил и транслитерацию текста. Потому что тут как бы два «специалиста» работают. «Филологу» интересно разрабатывать набор правил, а как они применяются к строке - неважно, технический вопрос. «Программисту», наоборот, конкретные правила не очень интересны. Loose coupling означает, что «программист» и «филолог» стараются минимально вмешиваться в работу друг друга. Они договорились, что набор правил будет объектом, определяющим правила преобразования конкретных литер. Ради гибкости такое правило может формулироваться в виде функции, преобразующей контекст. Использование функций в качестве входных данных обычно выводит гибкость на новый уровень.

Каждое нетривиальное правило реализовано в виде функции. Это всегда полезно, когда сущности предметной области соответствует сущность программы. Например, если есть проблема с транслитерацией буквы «о», мы сразу понимаем, что нужно дебажить, и не боимся, что фикс конкретного правила повлечёт неожиданные регресии. В качестве бонуса - можно одновременно экспериментировать с разными транслитами.

Такой подход, когда логика формулируется в виде некоего объекта, скармливаемого «движку», иногда называется data-driven programming.

Приведённая реализация не очень удобна для ди- и более графов. Для украинского это не очень важно, потому что нам нужно обработать только один диграф - ьо. Если её предполагается использовать для ситуаций, когда диграфов много, можно допилить «движок»: например, так, чтобы ключами объекта-преобразования допускались бы не только однолитерные строки.
Code: [Select]
/*
 * В задаче есть две подзадачи.
 * 1. Формулировка правил транслитерации.
 * 2. Применение правил к транслитерации текста.
 * Эти задачи достаточно независимы, и мы постараемся избегать tight coupling.
 *
 * Правило транслитерации может быть простым, когда транслитерируемой литере
 * соответствует строка транслита, или специальным, когда литера
 * транслитерируется в зависимости от контекста. Мы будем моделировать набор
 * правил объектом, в котором однолитерным строкам ставятся в соответствие или
 * строки, или функции, преобразующие контекст в строки. Под «контекстом» будем
 * понимать тройку (currentIndex, text, currentChar). Такое представление
 * правил не очень удобно для диграфов, но работает для данной задачи.
 */

/*
 * Сначала напишем "движок", преобразующий набор правил в
 * функцию-транслитератор текста.
 */
function createTranslit(rules) {
  return text => {
    const result = [];
    const textLength = text.length;
    for (let index = 0; index < textLength; ++index) {
      const currentChar = text[index];
      const translation = rules[currentChar];
      if (typeof translation === 'string') {
        // простое правило транслитерации
        result.push(translation);
      } else if (typeof translation === 'function') {
        // специальное правило транслитерации: функция, преобразующая контекс
        result.push(translation(index, text, currentChar));
      } else {
        // если правило не определено для литеры, литера не транслитерируется
        result.push(currentChar);
      }
    }
    return result.join('');
  }
}

// Правила и транслитератор для украинской письменности


const LOWERCASE_CONSONANTS = 'бвгґджзйклмнпрстфхцчшщ';

const CONSONANTS = new Set(LOWERCASE_CONSONANTS + LOWERCASE_CONSONANTS.toUpperCase());

function isUaConsonant(ch) {
  return CONSONANTS.has(ch);
}

// Специальное правило для йотированных букв.
function jotatedTranslation(jotated, softening) {
  return (index, text) => {
    const prevChar = text[index - 1];
    // После согласной - смягчающий вариант, иначе - йотированный
    return isUaConsonant(prevChar) ? softening : jotated;
  }
}

// Транслитерация мягкого знака: «ьо» преобразуется в смягчающее «о», иначе
// возвращается softSignChar
function softSignTranslation(softSignChar, softeningOChar) {
  return (index, text) => {
    const nextChar = text[index + 1];
    if (nextChar === 'о') return softeningOChar;
    return softSignChar;
  }
}

// Транслитерация «о»: преобразуется в oChar за исключением позиции после
// мягкого знака. В последнем случае буква является частью диграфа и не
// добавляется к транслитерируемому тексту
function oTranslation(oChar) {
  return (index, text) => {
    const prevChar = text[index - 1];
    return prevChar === 'ь' ? '' : oChar;
  }
}

const translitUa = createTranslit({
  'я': jotatedTranslation('ja', 'ǎ'),
  'Я': 'Ja',
  'є': jotatedTranslation('je', 'ě'),
  'Є': 'Je',
  'ю': jotatedTranslation('ju', 'ǔ'),
  'Ю': 'Ju',
  'ь': softSignTranslation('í', 'ǒ'),
  'Ь': 'Í',
  'о': oTranslation('o'),
  'О': 'O',
  "'": '',
  '’': '',
  'а':'a',
  'б':'b',
  'в':'v',
  'г':'h',
  'ґ':'g',
  'д':'d',
  'е':'e',
  'ж':'ž',
  'з':'z',
  'и':'y',
  'і':'i',
  'й':'j',
  'к':'k',
  'л':'l',
  'м':'m',
  'н':'n',
  'п':'p',
  'р':'r',
  'с':'s',
  'т':'t',
  'у':'u',
  'ф':'f',
  'х':'x',
  'ц':'c',
  'ч':'č',
  'ш':'š',
  'щ':'ś',
  'А':'A',
  'Б':'B',
  'В':'V',
  'Г':'H',
  'Ґ':'G',
  'Д':'D',
  'Е':'E',
  'Ж':'Ž',
  'З':'Z',
  'И':'Y',
  'І':'I',
  'Й':'J',
  'К':'K',
  'Л':'L',
  'М':'M',
  'Н':'N',
  'О':'O',
  'П':'P',
  'Р':'R',
  'С':'S',
  'Т':'T',
  'У':'U',
  'Ф':'F',
  'Х':'X',
  'Ц':'C',
  'Ч':'Č',
  'Ш':'Š',
  'Щ':'Ś',
});

// translitUa('Сучасні USB на ноутбуках стали більш енергоощадливі, через що бувають казуси, як-от проблема зі зовнішнім CD-приводом у мене. Вирішення дійсно одне: додаткове живлення, якщо конструкція передбачує.')
// "Sučasni USB na noutbukax staly bilíš enerhoośadlyvi, čerez śo buvajutí kazusy, jak-ot problema zi zovnišnim CD-pryvodom u mene. Vyrišennǎ dijsno odne: dodatkove žyvlennǎ, jakśo konstrukcija peredbačuje.
// translitUa("льод м'яч")
// "lǒd mjač"
  • 0
  • 0

15
С йотированными вроде понятно, что должно быть, а какие правила для "йо" и "ьо"?
  • 0
  • 0

Pages: [1] 2 3 ... 104