MathGames

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

Это был отличный проект, помогающий детишкам постигать основы математики и геометрии в школах загнивающего запада. В школе мне всегда говорили что мне повезло «тут» учиться потому что «там» все печально, и только на этом проекте я понял насколько все печально. В 7-9 классах мы отрешали два тома задач Сканави М.И (алгебра, комбинаторика, геометрия, тригонометрия и тд), а наши западные коллеги учатся искать гипотенузу в восьмом классе.

Код попал ко мне сразу ровно год назад, после демонстрации наспех сделанного демо, то есть крепко запутанные студенческие спагетти с соусом из экзотических технологий и капельку ui. За пару недель проект был приведен в состояние из которого можно дописывать новый функционал. Основным новшеством было использование Q и mongoose вместо pyramid of doom


var handleDeleteQuestions = function (request, response) {
	api.checkAPI(request, accessPrivileges.admin, [], function (err) {
		if (err) {
			repsonse.send(500, err.message);
			return;
		}

		deleteQuestions(request.query, function (err) {
			if (err) {
				response.send(500, "Could not clear old database - " + err);
				return;
			}
			generateQuestions(function (err) {
				if (err) {
					response.send(500, "Unable to delete questions - " + err.message);
				} else {
					response.send(200, "Questions successfully deleted");
				}
			});
		});
	});
};

Еще одним большим изменением было внедрение express, как слепить эти три библиотеки, можно посмотреть в G.O.A.T.

FE код для игр был разделен на модули и собирался с помощью requirejs + grunt-contrib-requirejs о том как их сконфигурировать можно посмотреть тут

HTML шаблоны были сначала переписаны на underscore templates, а потом мигрированы на handlebars и sass.

Скуки ради затеял небольшой но интересный генератор LaTeX уравнений суть примерно такая


var div = new Division(256, 2);
console.log(div.toString());
$$ \begin{align*} 1 2 8 \\ 2 \enclose{longdiv}{2 5 6} \\ \underline{\llap{-}2} \phantom{0} \phantom{0} \\ 0 5 \phantom{0} \\ \phantom{0} \underline{\llap{-}4} \phantom{0} \\ \phantom{0} 1 6 \\ \phantom{0} \underline{\llap{-}1} \underline{6} \\ \phantom{0} \phantom{0 } 0 \end{align*} $$

По желанию можно задать точность деления до X знаков после запятой, или вывести определенный шаг решения, то есть что-то типа «сносим 6», так же можно получить объект со всеми шагами. Такая штука реализована для сложения, вычитания, умножения и деления и некоторых других операций типа округления и сравнения, есть модуль для постройки всяких матриц. К сожалению эта часть закрыта авторским правом и вряд ли вы сможете ей воспользоваться.

Еще один большой кусок кода и времени был посвящен генерации картинок из этого LaTeX’а при помощи svgtex, inkscape и pngcrush. Результат хранился в базе в трех форматах TeX, SVG, PNG.

Проект стал поводом для написания нескольких статей Node.js and Q, MySQL vs MongoDB, filter, Говнокод и как на этом заработать, Как стать программистом?, StartUp, Проект с нуля, Жопа на проекте, Require.js & jQuery UI, Программы, которые я использую каждый день.

Теперь у меня есть немного времени на новые статьи, постараюсь написать парочку. И главное — не упустите возможность меня нанять!