Блог
Строительство и ремонт
Репетиторы
Красота
Фрилансеры
Разные специалисты
Уход за животными
Тренеры
Автоинструкторы

Подработка для репетиторов по обучению чтению в Москве

Найдено вариантов подработки — 1338

🔸 Преподаёте обучение чтению и ищете подработку в Москве?
🔸 У нас можно найти работу или подработку, выбрав из более чем 1338 вакансий
🔸 Заявки от прямых заказчиков, которым нужно подтянуть знания по обучению чтению
🔸 Актуальных предложений на февраль 2025 года — 1

Подготовка к школе

договорная
Обучение чтению
Москва
Репетиторы
2025-02-02
Откликнуться

Подготовка к школе

на дому
договорная
Обучение чтению, развивающие методики Методика по рекомендации специалиста
Москва
Репетиторы
2025-02-01
Откликнуться

Подготовка к школе

на дому
от 1200.00 руб.
Обучение чтению
Москва
Репетиторы
2025-01-29
Откликнуться

Подготовка к школе

договорная
Обучение чтению
Москва
Репетиторы
2025-01-28
Откликнуться

Подготовка к школе

договорная
Обучение чтению
Москва
Репетиторы
2025-01-28
Откликнуться

Подготовка к школе

возможна работа на дому
договорная
Обучение чтению
Чувашия
Репетиторы
2025-01-27
Откликнуться

Русский язык

без разницы
договорная
Обучение чтению
Москва
Репетиторы
2024-10-26
Откликнуться

Подготовка к школе

договорная
Обучение чтению, развивающие методики Методика по рекомендации специалиста
Москва
Репетиторы
2024-10-22
Откликнуться

Подготовка к школе

договорная
Обучение чтению
Москва
Репетиторы
2024-10-17
Откликнуться

Подготовка к школе

договорная
Обучение чтению
Москва
Репетиторы
2024-10-16
Откликнуться

Обучение Python

дистанционно
от 1000.00 руб.
Студент ВШЭ 2 курс Углубленный Питон.Если Вам понятна прилагаемая задача, и Вы с легкость сможете разъяснить как их решить, то милости просим звонить # Кеша и База данных ## Легенда Недавно подруга Кеши - ворона Клара - нашла на помойке выброшенный компьютер. Попугай забрал находку себе - он решил доказать Вовке, что умеет хорошо обращаться с дорогой техникой. Для этого Кеша решил написать собственную нереляционную базу данных для хранения пар "ключ-значение". ## Техническое задание ### Что делать? Вам необходимо реализовать методы класса `StorageAdapter`, чтобы, в конечном счете, Вы получили простенькую базу данных, которая хранит данные на жестком диске Вашего устройства. Ниже будут описаны алгоритмы, которыми Вы должны воспользоваться. ### Где хранить данные? Для своей базы данных попугай выделил отдельную директорию на компьютере. Будем называть ее *директорией-хранилищем*. База данных может проводить любые операции над *директорией-хранилищем*, включая запись, чтение, удаление и так далее. Нашли странный файл? Не беда - просто удалите. Кто-то изменил содержимое файла? Не беда - снова можно удалить. Кто-то создал директорию? Угадаете? Да, можно удалить. В общем, директория полностью выделена для Вас и только Вас. ### Как выполнять операции? Сама по себе база данных будет транзакционной. Это значит, что она где-то копит операции, но не выполняет их до тех пор, пока операции не будут подтверждены или отклонены. Изучите, пожалуйста, тесты, чтобы лучше понять, как это выглядит и как это должно работать. В частности, Вам понадобятся методы `commit` и `rollback`. ### Устойчивость к изменениям К сожалению, на найденном компьютере обнаружились вирусы. Они могут в любой момент менять названия файлов или их содержимое, что-нибудь удалять или, наоборот, создавать. *Директория-хранилище* не является исключением. Кстати, рекомендуем держать в голове, что сама *директория-хранилище* тоже может быть внезапно удалена. ### Какой алгоритм? Чтобы гарантировать защищенность хранилища от внешнего воздействия, мы должны придумать какой-то алгоритм хранения данных, который гарантирует возможность инвалидации в случае внешнего доступа. Кроме того, мы бы хотели обезопасить хранилище таким образом, что никто извне не смог узнать, к какому ключу относится некоторое значение. Будем добиваться такого поведения следующим алгоритмом: 1. Используя [`hashlib.sha256`](https://docs.python.org/3/library/hashlib.html#usage), хэшируем ключ. Полученный хэш - название файла. Посмотрите на пример из документации - используем методы `hashlib.sha256.update` и `hashlib.sha256.hexdigest`. 2. Создаем файл и записываем в него `JSON` следующего формата (воспользуйтесь стандартным модулем [`json`](https://docs.python.org/3/library/json.html)): ```json { "hash": "...", "value": "..." } ``` В атрибут `hash` записываем хеш от последовательного вызова `hashlib.sha256.update` для ключа и для значения. В атрибут `value` записываем значение по ключу. Если кто-то изменит наши данные извне, то мы либо получим ошибку при валидации `JSON`, либо получим разные хеши при чтении. Такого алгоритма нам будет достаточно. Если кто-то изменил данные, то будем считать, что ключа никогда не существовало. То есть если мы записали что-то в базу, а потом файл, в котором хранились данные, испортился, то можно ничего не возвращать пользователю. Увы, но значение потеряно. ### Тестирование В этой задаче приватных тестов нет. Внимательно ознакомьтесь с открытыми тестами, чтобы понимать, как должна работать Ваша база данных. Мы старались делать их максимально простыми и понятными Ниже код, его надо сделать. import hashlib import os import shutil from contextlib import suppress from pathlib import Path from tempfile import gettempdir from uuid import uuid4 import pytest from database import StorageAdapter KEY: str = "key" VALUE: str = "value" ANOTHER_KEY: str = "another_key" ANOTHER_VALUE: str = "another_value" KEY_FILENAME: str = hashlib.sha256(KEY.encode()).hexdigest()@pytest.fixture(scope="function") def sandbox() -> Path: """Фикстура песочницы.""" base_dir = Path(gettempdir()) sandbox_dir = base_dir / str(uuid4()) sandbox_dir.mkdir(parents=True) os.chdir(sandbox_dir) return sandbox_dir @pytest.fixture(scope="function") def adapter(sandbox: Path) -> StorageAdapter: return StorageAdapter(_storage_directory=sandbox) def test__read_write(adapter: StorageAdapter) -> None: """Тест цикла 'запись - чтение'.""" adapter.update(KEY, VALUE) adapter.commit() value = adapter.get(KEY) assert value == VALUE def test__read_write__uncommited(adapter: StorageAdapter) -> None: """Тест цикла 'запись - чтение' без коммита.""" adapter.update(KEY, VALUE) value = adapter.get(KEY) assert value is None def test__overwrite__commited_step(adapter: StorageAdapter) -> None: """Тест перезаписи при промежуточных коммитах.""" adapter.update(KEY, ANOTHER_VALUE) adapter.commit() adapter.update(KEY, VALUE) adapter.commit() value = adapter.get(KEY) assert value == VALUE def test__overwrite__uncommited_step(adapter: StorageAdapter) -> None: """Тест перезаписи без промежуточных коммитов.""" adapter.update(KEY, ANOTHER_VALUE) adapter.update(KEY, VALUE) adapter.commit() value = adapter.get(KEY) assert value == VALUE def test__get__not_exists(adapter: StorageAdapter) -> None: """Тест метода `get`, если значения по ключу нет.""" value = adapter.get(KEY) assert value is None def test__delete__commited_step(adapter: StorageAdapter) -> None: """Тест метода `delete` при промежуточных коммитах.""" adapter.update(KEY, VALUE) adapter.commit() adapter.delete(KEY) adapter.commit() value = adapter.get(KEY) assert value is None def test__delete__uncommited_step(adapter: StorageAdapter) -> None: """Тест метода `delete` без промежуточных коммитов.""" adapter.update(KEY, VALUE) adapter.delete(KEY) adapter.commit() value = adapter.get(KEY) assert value is None def test__delete__uncommited(adapter: StorageAdapter) -> None: """Тест метода `delete` без коммита.""" adapter.update(KEY, VALUE) adapter.commit() adapter.delete(KEY) value = adapter.get(KEY) assert value == VALUE def test__clear__commited_step(adapter: StorageAdapter) -> None: """Тест метода `clear` при промежуточных коммитах.""" adapter.update(KEY, VALUE) adapter.update(ANOTHER_KEY, ANOTHER_VALUE) adapter.commit() adapter.clear() adapter.commit() value = adapter.get(KEY) assert value is None def test__clear__uncommited_step(adapter: StorageAdapter) -> None: """Тест метода `clear` без промежуточных коммитов.""" adapter.update(KEY, VALUE) adapter.update(ANOTHER_KEY, ANOTHER_VALUE) adapter.clear() adapter.commit() value = adapter.get(KEY) another_value = adapter.get(ANOTHER_KEY) assert value is None assert another_value is None def test__clear__update(adapter: StorageAdapter) -> None: """Тест метода `clear`, если до коммита, но после чистки была запись.""" adapter.update(KEY, VALUE) adapter.clear() adapter.update(ANOTHER_KEY, ANOTHER_VALUE) adapter.commit() value = adapter.get(KEY) another_value = adapter.get(ANOTHER_KEY) assert value is None assert another_value == ANOTHER_VALUE def test__rollback__update(adapter: StorageAdapter) -> None: """Тест метода `rollback` для `update`.""" adapter.update(KEY, VALUE) adapter.rollback() value = adapter.get(KEY) assert value is None def test__rollback__clear(adapter: StorageAdapter) -> None: """Тест метода `rollback` для `clear`.""" adapter.update(KEY, VALUE) adapter.commit() adapter.clear() adapter.rollback() value = adapter.get(KEY) assert value == VALUE def test__rollback__multiple_steps(adapter: StorageAdapter) -> None: """Тест метода `rollback` после нескольких команд.""" adapter.update(KEY, VALUE) adapter.commit() adapter.update(KEY, ANOTHER_VALUE) adapter.update(ANOTHER_KEY, ANOTHER_VALUE) adapter.rollback() value = adapter.get(KEY) another_value = adapter.get(ANOTHER_KEY) assert value == VALUE assert another_value is None def test__read_write__magic_methods(adapter: StorageAdapter) -> None: """Тест цикла 'запись - чтение'.""" adapter[KEY] = VALUE adapter.commit() value = adapter[KEY] assert value == VALUE def test__read_write__uncommited__magic_methods(adapter: StorageAdapter) -> None: """Тест цикла 'запись - чтение' без коммита.""" adapter[KEY] = VALUE value = adapter[KEY] assert value is None def test__overwrite__commited_step__magic_methods(adapter: StorageAdapter) -> None: """Тест перезаписи при промежуточных коммитах.""" adapter[KEY] = ANOTHER_VALUE adapter.commit() adapter[KEY] = VALUE adapter.commit() value = adapter[KEY] assert value == VALUE def test__overwrite__uncommited_step__magic_methods(adapter: StorageAdapter) -> None: """Тест перезаписи без промежуточных коммитов.""" adapter[KEY] = ANOTHER_VALUE adapter[KEY] = VALUE adapter.commit() value = adapter[KEY] assert value == VALUE def test__get__not_exists__magic_methods(adapter: StorageAdapter) -> None: """Тест метода `get`, если значения по ключу нет.""" value = adapter[KEY] assert value is None def test__delete__commited_step__magic_methods(adapter: StorageAdapter) -> None: """Тест метода `delete` при промежуточных коммитах.""" adapter[KEY] = VALUE adapter.commit() del adapter[KEY] adapter.commit() value = adapter[KEY] assert value is None def test__delete__uncommited_step__magic_methods(adapter: StorageAdapter) -> None: """Тест метода `delete` без промежуточных коммитов.""" adapter[KEY] = VALUE del adapter[KEY] adapter.commit() value = adapter[KEY] assert value is None def test__delete__uncommited__magic_methods(adapter: StorageAdapter) -> None: """Тест метода `delete` без коммита.""" adapter[KEY] = VALUE adapter.commit() del adapter[KEY] value = adapter[KEY] assert value == VALUE def test__clear__commited_step__magic_methods(adapter: StorageAdapter) -> None: """Тест метода `clear` при промежуточных коммитах.""" adapter[KEY] = VALUE adapter[ANOTHER_KEY] = ANOTHER_VALUE adapter.commit() adapter.clear() adapter.commit() value = adapter[KEY] assert value is None def test__clear__uncommited_step__magic_methods(adapter: StorageAdapter) -> None: """Тест метода `clear` без промежуточных коммитов.""" adapter[KEY] = VALUE adapter[ANOTHER_KEY] = ANOTHER_VALUE adapter.clear() adapter.commit() value = adapter[KEY] another_value = adapter[ANOTHER_KEY] assert value is None assert another_value is None def test__clear__update__magic_methods(adapter: StorageAdapter) -> None: """Тест метода `clear`, если до коммита, но после чистки была запись.""" adapter[KEY] = VALUE adapter.clear() adapter[ANOTHER_KEY] = ANOTHER_VALUE adapter.commit() value = adapter[KEY] another_value = adapter[ANOTHER_KEY] assert value is None assert another_value == ANOTHER_VALUE def test__rollback__update__magic_methods(adapter: StorageAdapter) -> None: """Тест метода `rollback` для `update`.""" adapter[KEY] = VALUE adapter.rollback() value = adapter[KEY] assert value is None def test__rollback__clear__magic_methods(adapter: StorageAdapter) -> None: """Тест метода `rollback` для `clear`.""" adapter[KEY] = VALUE adapter.commit() adapter.clear() adapter.rollback() value = adapter[KEY] assert value == VALUE def test__rollback__multiple_steps__magic_methods(adapter: StorageAdapter) -> None: """Тест метода `rollback` после нескольких команд.""" adapter[KEY] = VALUE adapter.commit() adapter[KEY] = ANOTHER_VALUE adapter[ANOTHER_KEY] = ANOTHER_VALUE adapter.rollback() value = adapter[KEY] another_value = adapter[ANOTHER_KEY] assert value == VALUE assert another_value is None def test__transaction__context(adapter: StorageAdapter) -> None: """Тест контекстного менеджера.""" with adapter as context: context.update(KEY, VALUE) value = adapter.get(KEY) assert value == VALUE def test__transaction__self(adapter: StorageAdapter) -> None: """Тест контекстного менеджера.""" with adapter: adapter.update(KEY, VALUE) value = adapter.get(KEY) assert value == VALUE def test__transaction__context_and_self(adapter: StorageAdapter) -> None: """Тест контекстного менеджера.""" with adapter as context: adapter.update(KEY, VALUE) context.update(ANOTHER_KEY, ANOTHER_VALUE) value = adapter.get(KEY) another_value = adapter.get(ANOTHER_KEY) assert value == VALUE assert another_value == ANOTHER_VALUE def test__transaction__inner_commit(adapter: StorageAdapter) -> None: """Тест контекстного менеджера.""" with adapter: adapter.update(KEY, VALUE) adapter.update(ANOTHER_KEY, ANOTHER_VALUE) adapter.commit() adapter.delete(ANOTHER_KEY) value = adapter.get(KEY) another_value = adapter.get(ANOTHER_KEY) assert value == VALUE assert another_value is None def test__transaction__clear(adapter: StorageAdapter) -> None: """Тест контекстного менеджера.""" with adapter: adapter.update(KEY, VALUE) adapter.update(ANOTHER_KEY, ANOTHER_VALUE) adapter.clear() value = adapter.get(KEY) another_value = adapter.get(ANOTHER_KEY) assert value is None assert another_value is None def test__transaction__multiple_calls(adapter: StorageAdapter) -> None: """Тест контекстного менеджера.""" with adapter: adapter.update(KEY, VALUE) with adapter: adapter.update(ANOTHER_KEY, ANOTHER_VALUE) value = adapter.get(KEY) another_value = adapter.get(ANOTHER_KEY) assert value == VALUE assert another_value == ANOTHER_VALUE def test__transaction__rollback(adapter: StorageAdapter) -> None: """Тест контекстного менеджера при исключении.""" with suppress(OSError), adapter: adapter.update(KEY, VALUE) detail = "Hello, HSE" raise OSError(detail) value = adapter.get(KEY) assert value is None def test__transaction__rollback_and_inner_commit(adapter: StorageAdapter) -> None: """Тест контекстного менеджера при исключении.""" with suppress(OSError), adapter: adapter.update(KEY, VALUE) adapter.commit() adapter.update(KEY, ANOTHER_VALUE) detail = "Hello, HSE" raise OSError(detail) value = adapter.get(KEY) assert value == VALUE def test__transaction__reraise(adapter: StorageAdapter) -> None: """Тест контекстного менеджера при исключении.""" with pytest.raises(OSError), adapter: adapter.update(KEY, VALUE) detail = "Hello, HSE" raise OSError(detail) def test__virus__rename_file(sandbox: Path, adapter: StorageAdapter) -> None: """Вирус переименовал файл.""" with adapter: adapter.update(KEY, VALUE) new_filename = f"test_{KEY_FILENAME}" new_file = sandbox / new_filename file = sandbox / KEY_FILENAME file.rename(new_file) value = adapter.get(KEY) assert value is None def test__virus__delete_file(sandbox: Path, adapter: StorageAdapter) -> None: """Вирус удалил файл.""" with adapter: adapter.update(KEY, VALUE) file = sandbox / KEY_FILENAME file.unlink(missing_ok=True) value = adapter.get(KEY) assert value is None def test__virus__overwrite_file(sandbox: Path, adapter: StorageAdapter) -> None: """Вирус перезаписал файл.""" with adapter: adapter.update(KEY, VALUE) file = sandbox / KEY_FILENAME file.write_text("Hello, HSE") value = adapter.get(KEY) assert value is None def test__virus__delete_storage_directory_after(sandbox: Path, adapter: StorageAdapter) -> None: """Вирус удалил директорию-хранилище после выполнения операции.""" with adapter: adapter.update(KEY, VALUE) shutil.rmtree(sandbox) value = adapter.get(KEY) assert value is None def test__virus__delete_storage_directory_before(sandbox: Path, adapter: StorageAdapter) -> None: """Вирус удалил директорию-хранилище до выполнения операции.""" shutil.rmtree(sandbox) with adapter: adapter.update(KEY, VALUE) value = adapter.get(KEY) assert value == VALUE def test__virus__storage_directory_as_file(sandbox: Path, adapter: StorageAdapter) -> None: """Вирус сделал директорию-хранилище файлом.""" shutil.rmtree(sandbox) sandbox.touch() with adapter: adapter.update(KEY, VALUE) value = adapter.get(KEY) assert value == VALUE def test__virus__storage_directory_as_symlink(sandbox: Path, adapter: StorageAdapter) -> None: """Вирус сделал директорию-хранилище файлом.""" shutil.rmtree(sandbox) sandbox.symlink_to(sandbox) with adapter: adapter.update(KEY, VALUE) value = adapter.get(KEY) assert value == VALUE def test__algorithm__shared_read_write(sandbox: Path) -> None: """Алгоритм разделяет память между адаптерами.""" lhs = StorageAdapter(_storage_directory=sandbox) rhs = StorageAdapter(_storage_directory=sandbox) with lhs: lhs.update(KEY, VALUE) value = rhs.get(KEY) assert value == VALUE def test__algorithm__shared_delete(sandbox: Path) -> None: """Алгоритм разделяет память между адаптерами.""" lhs = StorageAdapter(_storage_directory=sandbox) rhs = StorageAdapter(_storage_directory=sandbox) with lhs: lhs.update(KEY, VALUE) with rhs: rhs.delete(KEY) value = lhs.get(KEY) assert value is None def test__algorithm__shared_clear(sandbox: Path) -> None: """Алгоритм разделяет память между адаптерами.""" lhs = StorageAdapter(_storage_directory=sandbox) rhs = StorageAdapter(_storage_directory=sandbox) with lhs: lhs.update(KEY, VALUE) lhs.update(ANOTHER_KEY, ANOTHER_VALUE) with rhs: rhs.clear() value = lhs.get(KEY) another_value = lhs.get(ANOTHER_KEY) assert value is None assert another_value is None
Москва
Репетиторы
2024-10-08
Откликнуться

Подготовка к школе

договорная
Обучение чтению
Москва
Репетиторы
2024-10-07
Откликнуться

Подготовка к школе

дистанционно
от 900.00 руб.
Обучение чтению
Москва
Репетиторы
2024-10-04
Откликнуться

Английский язык

на дому или дистанционно
договорная
Научиться читать Уровень владения языком: начальный
Москва
Репетиторы
2024-10-01
Откликнуться

Английский язык

дистанционно
от 800.00 руб.
Хорошее последовательное знание языка в соответствии со стандартами фгос и тд , не просто поговорить , а грамматика, транскрипции, чтение , и тд Уровень владения языком: нулевой
Москва
Репетиторы
2024-09-20
Откликнуться

Подготовка к школе

дистанционно
договорная
Обучение чтению, развивающие методики Методика по рекомендации специалиста
Иркутск
Репетиторы
2024-09-14
Откликнуться

Подготовка к школе

договорная
Обучение чтению
Москва
Репетиторы
2024-09-13
Откликнуться

Подготовка к школе

дистанционно
от 900.00 руб.
Обучение чтению
Москва
Репетиторы
2024-09-09
Откликнуться

Подготовка к школе

договорная
Обучение чтению, обучение письму, обучение счёту, развивающие методики
Москва
Репетиторы
2024-09-05
Откликнуться

Подготовка к школе

без разницы
от 900.00 руб.
Обучение чтению
Москва
Репетиторы
2024-09-04
Откликнуться

Подготовка к школе

договорная
Обучение чтению
Москва
Репетиторы
2024-08-20
Откликнуться

Подготовка к школе

дистанционно
договорная
Обучение чтению
Москва
Репетиторы
2024-08-13
Откликнуться

Подготовка к школе

возможна работа на дому
договорная
Обучение чтению
Москва
Репетиторы
2024-08-07
Откликнуться

Подготовка к школе

дистанционно
от 400.00 руб.
Обучение чтению
Ростов-на-Дону
Репетиторы
2024-08-03
Откликнуться

Обучение C#

договорная
Для ребёнка Ребенку 5,5 лет. Требуется подготовка к школе (алфавит, обучение чтению, счету…) и общее развитие. Логопедия как преимущество. Занятия у нас, в будни в 19 или позднее
Москва
Репетиторы
2024-08-02
Откликнуться

Русский язык

от 1500.00 руб.
Научить читать
Москва
Репетиторы
2024-07-29
Откликнуться

Подготовка к школе

договорная
Развивающие методики, обучение чтению, Подготовительный класс Методика по рекомендации специалиста
Москва
Репетиторы
2024-07-22
Откликнуться

Подготовка к школе

договорная
Развивающие методики, Рисование, Монтессори, Хореография, Музыка, Гимнастика, Лепка, Чтение, Кукольный театр, обучение чтению Система Монтессори
Москва
Репетиторы
2024-07-17
Откликнуться

Подготовка к школе

дистанционно
договорная
Развивающие методики, обучение чтению
Москва
Репетиторы
2024-07-13
Откликнуться

Подготовка к школе

от 1000.00 руб.
Обучение чтению
Москва
Репетиторы
2024-07-11
Откликнуться

Подготовка к школе

дистанционно
договорная
Развивающие методики, обучение чтению, Начать говорить на русском языке, так как основной у него испанский
Москва
Репетиторы
2024-07-02
Откликнуться

Подготовка к школе

договорная
Обучение чтению
Москва
Репетиторы
2024-06-23
Откликнуться

Подготовка к школе

от 1000.00 руб.
Обучение чтению
Москва
Репетиторы
2024-06-09
Откликнуться

Английский язык

дистанционно
договорная
Научить читать Уровень владения языком: нулевой
Челябинск
Репетиторы
2024-05-29
Откликнуться

Английский язык

дистанционно
от 1200.00 руб.
Постановка произношения, чтение Уровень владения языком: начальный
Москва
Репетиторы
2024-05-27
Откликнуться

Подготовка к школе

на дому
договорная
Обучение чтению, обучение письму
Москва
Репетиторы
2024-05-23
Откликнуться

Подготовка к школе

на дому или дистанционно
договорная
Обучение чтению
Москва
Репетиторы
2024-05-03
Откликнуться

Подготовка к школе

дистанционно
от 1000.00 руб.
Обучение чтению
Москва
Репетиторы
2024-04-26
Откликнуться

Подготовка к школе

договорная
Обучение чтению, развивающие методики
Москва
Репетиторы
2024-04-23
Откликнуться

Подготовка к школе

от 1500.00 руб.
Обучение чтению
Москва
Репетиторы
2024-04-18
Откликнуться

Часто задаваемые вопросы


Как мне найти учеников по профилю обучение чтению в Москве?

Зарегистрируйтесь и создайте привлекательный профиль с упоминанием вашей специализации. Обратите внимание на количество доступных заявок от учеников, которое на февраль 2025 года составляет 248

Какие требования к преподавателям на вашем сайте?

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

Могу ли я установить гибкий график работы?

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

Каков потенциальный заработок для репетитора обучения чтению?

Заработок зависит от количества занятий и квалификации. В среднем, за одно занятие можно заработать 1023.08 рублей с занятия. Больше занятий в неделю – выше доход