Немного предыстории
В течение нескольких месяцев я был сосредоточен на одной цели: престижном и известном Google Summer of Code. Я как сумасшедший вносил свой вклад в свою организацию, создавая PR за PR, поднимая проблемы и помогая другим участникам и другим начинающим GSoC-специалистам из слабой команды сообщества.
Настал день результатов, и из двух слотов, предоставленных моей организации, мой проект не попал в список отобранных проектов. Поначалу это было тяжело, я думал, что все сделал правильно, но все же моего имени там не было.
На следующее утро я решил больше не тратить свое время и начал смотреть на светлую сторону вещей, внося свой вклад в проект с открытым исходным кодом помогли мне приобрести бесценные навыки, такие как разработка через тестирование, CI / CD, git (перебазирование, конфликты слияния) и т. д. Возможно, я не получу стипендии за написание кода в течение лета, но я приобрел бесценные навыки, которые я могу использовать в своих будущих проектах.
Итак, было время экзамена, и я, как обычно, взламывал один из своих проектов (инструмент командной строки для загрузки изображений в облачный сервис), когда один из моих крутых друзей (Палаш Нигам) вошел в мою комнату и сказал с тоном удивления: Вы не умеете печатать вслепую? Это жалко . Он представил меня сайту под названием typeracer (я послушал его и начал практиковаться на этом сайте, и меня это зацепило). Один из моих старшеклассников из колледжа (Шибасис Патель) подал мне идею создания инструмента командной строки для игры в typeracer (как я ранее просил у него несколько идей для проекта), который мы могли бы использовать, чтобы познакомить первокурсников с оболочкой и прикосновением. набор текста. Это дало мне новую цель, поэтому я начал писать код. Примерно через неделю написания кода я с гордостью представляю вам typeracer-CLI
Что такое typeracer-cli?
Таким образом, это в основном терминальный клиент для игры в typeracer на вашей оболочке. Как только вы запустите игру, вам будет представлен абзац, который вы должны напечатать, а в конце ваше время и скорость (в словах в минуту) будут записаны и представлены в виде вывода.
Что в этом нового? Версии этой игры с интерфейсом командной строки уже существуют.
Согласны, другие версии уже существуют, но они не предлагают всех функций, которые есть в этом клиенте, например:
- Режим практики (автономный режим)
- Статистика пользователя (слов в минуту, затраченное время)
- Онлайн-режим (устроите гонку, создав сервер и поделившись им с друзьями)
- Запросить матч-реванш после окончания гонки (онлайн-режим)
- Посмотреть 10 лучших рекордов в онлайн-режиме
Причина этого
Ну, говорят, неудача - отличный мотиватор. Я усвоил это на собственном горьком опыте. Неудача в выборе GSoC еще больше мотивировала меня стать лучшим разработчиком. Другой важной причиной было желание сделать что-нибудь для моего колледжа. Я осознал преимущества работы в сообществе разработчиков во время подготовки к GSoC. Хотя я был членом Общества программирования своего колледжа, я не принимал такого активного участия, как следовало бы. Этот проект оказался одним из способов внести свой вклад в мое сообщество, распространяя информацию о слепой печати и инструментах командной строки среди молодых начинающих разработчиков.
Реализация
Изначально задача заключалась в том, чтобы получать нажатия клавиш с пользовательского терминала, что в то время я считал невозможным. Но я обнаружил события readline
и keyspress
в nodejs , которые помогли мне продвинуться дальше в кодировании.
Задачи были разбиты на следующие:
- Преобразуйте этот инструмент в пакет npm
- Автономный режим практики
- Создать случайный абзац для каждой расы
- Добавьте больше разумных абзацев
- Отображение времени и скорости пользователя по мере ввода
- Настройка сервера для онлайн-режима
- Улучшение дизайна API
- Напишите тесты
Подробное рассмотрение каждого вопроса
Преобразование в пакет npm
Это была важная задача, чтобы можно было легко загрузить пакет и установить его глобально из npm. Для этого нам нужно использовать очень важную строку в начале файла, который будет выполняться.
#!/usr/bin/env node
- экземпляр строки shebang: самая первая строка в исполняемом текстовом файле на Unix-подобных платформах, которая сообщает системе, какой интерпретатор передать этот файл для выполнения через командную строку после магического префикса #!
(называемого shebang).
Хотя Windows не поддерживает строки shebang, они фактически игнорируются; в Windows только расширение имени файла данного файла определяет, какой исполняемый файл будет его интерпретировать. Однако они все равно нужны вам в контексте npm.
Внедрение автономного (тренировочного) режима
Изначально некоторые команды были написаны для выполнения тренировочного режима. С помощью пакета командир мне удалось решить эту задачу.
функция game ()
Это основная логика, которая позволяет приложению получать нажатия клавиш от клиента, но мы также должны прослушивать событие keypress
для завершения этой задачи. stdin.on('keypress', keypress)
Теперь в game () я активировал событие keypress
через 5 секунд игры и показывал пользователю абзацы, чтобы у него было время расслабить пальцы, повернуть шею, щелкнуть костяшками пальцев и сказать « давай ».
Я показывал клиенту три вещи, когда они печатали
- Анализ в реальном времени их набора текста с использованием зеленого, красного, представляющего правильные и неправильные символы соответственно.
- Анализ их скорости в реальном времени в словах в минуту.
Следующий фрагмент объясняет, как получить скорость пользователя в соответствии с правильными вводимыми им словами.
- Расчет затраченного времени
В конце есть возможность повторить, где вы можете перезапустить совпадение с генерацией нового абзаца каждый раз.
Онлайн-режим
Это была очень важная функция для реализации, поскольку она отличает этот клиент от других версий интерфейса командной строки.
Это было реализовано с использованием socket.io соответственно:
- Создание сервера
- Подключение клиентов к серверу
- Создайте приватную комнату для соревнований
- Отправляйте счета всем клиентам в конце игры
- Функция реванша
- Случайные абзацы для каждой расы
- 10 лучших рекордов
Подробное рассмотрение каждого вопроса
Создание сервера
Я достаточно свободно владею Javascript и NodeJs, поэтому я использовал NodeJs для создания сервера приложения и разместил его на Glitch.
Socket.io использовался для предоставления клиентам веб-сокетов для подключения и отправки событий серверу для прослушивания. MongoDB использовался в качестве базы данных для хранения 10 самых высоких оценок клиентов.
Подключение клиентов к серверу
Изначально клиентская часть была довольно сложной, так как я не понимал socket.io до базового уровня. Сначала я работал на локальном сервере, а вы можете на localhost. Я использовал socket.io client на стороне клиента, но мне все равно потребовался целый день, чтобы понять основы и подключить клиента к серверу.
Создание отдельной комнаты для соревнований
Теперь в socket.io вы можете создать другое пространство имен или указать комнаты, к которым нужно присоединиться. Поэтому мне пришлось получить некоторые данные от пользователя, чтобы создать частный канал, по которому они могли бы участвовать в гонках, иначе это создало бы бесчисленные проблемы. Я использовал модуль узла crypto
для обеспечения криптографической функциональности, которая включает набор оболочек для хэша OpenSSL, HMAC, шифрования, дешифрования, подписи и проверки, и каждый раз генерировал с его помощью случайные строки.
Другая проблема заключалась в том, как сервер узнает количество игроков в комнате, чтобы он мог выдать событие для начала гонки. Для этого я спросил количество игроков у клиента, с которым они хотели бы участвовать в гонках (используя пакет npm inquirer).
Поэтому, когда пользователь вошел в комнату, я отправил всю информацию о клиенте для разделения, чтобы он мог работать в соответствии с этим.
Теперь, когда сервер знал, что все клиенты присоединились к гонке, он отправил клиентам событие и начал гонку. Было важно отправлять случайные абзацы при каждом подключении, а также один и тот же абзац всем клиентам в одной комнате.
Когда все было в порядке и каждый клиент завершил гонку, сервер отправил событие, отправив все результаты каждому клиенту и спросив, не хотят ли они провести матч-реванш. Аналогично для матча-реванша был сгенерирован случайный абзац.
10 лучших результатов
Чтобы эта функция работала, я изначально создал базу данных оболочки с десятью анонимными пользователями с их оценками, инициализированными равными 0. Теперь, когда кто-то играет в онлайн-игру и набирает более 10-го места в базе данных, он заменяет 10-е место наивысшего балла пользователем в таблице. база данных (это было сделано, чтобы избежать чрезмерного использования базы данных).
Поддержите нас
Этот проект стал для меня отличным опытом, и мы (мои друзья и я) надеемся создать больше таких потрясающих проектов в будущем. Мы - группа студентов, увлеченных разработкой программного обеспечения, которые хотят делать крутые вещи. Немного мотивации и поддержки нам очень помогает. Если вам нравится этот изящный прием, вы можете поддержать нас, выполнив любое (или все 😉) из следующего:
- ⭐️ Пометьте нас на Github и сделайте это модным, чтобы другие люди могли узнать о нашем проекте.
- 👏 Хлопайте по этой статье.
- Установите его и увеличьте количество загрузок на npm.
- Напишите об этом в Твиттере (наш код - psociiit).
- Поделитесь typeracer-cli на Facebook и поставьте лайк на нашей странице.
- Следуйте за нами в LinkedIn.
- Поделитесь этим в своих слабых командах и каналах gitter и распространите информацию.
Спасибо Palash Nigam за помощь в написании этой статьи, а также Shibasis Patel за то, что поделился этой классной идеей.