Как стать автором
Обновить
32
0
Иван @Cooler2

Indie Games Developer

Отправить сообщение

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

Как самообразовательный проект может быть полезным. Как продакшн решение явно нет.

Тем не менее, сайт в продакшене, сервер игры — тоже, как и сервера еще 3-х игр. В продакшене с 2004-го (один правда уже закрылся).

Модули. Именно это я и сделал — выделил модуль SCGI для самостоятельного использования.

Справедливости ради, минимальное консольное приложение выглядит так:


{$APPTYPE CONSOLE}
begin
end.

Многословность не есть недостаток, зачастую она повышает читаемость кода. Код гораздо чаще читают, чем пишут, поэтому читабельность важнее "писабельности", тем более что с последней хорошо помогает IDE — автодополнение, шаблоны.

Кстати я тоже не в восторге от того, что в Delphi сделали со строками, считаю это большой глупостью. Нормально же всё было! Захотели сократить зоопарк строковых типов — добавили ещё один :(

Какие плейсхолдеры?

  1. Так есть и FastCGI и SCGI. Но идея писать, а тем более дебажить такое на Perl меня весьма пугала. Хотя вероятно для опытного Perl-разработчика это норм.


  2. Если таблицу можно кэшировать сервером, значит её можно и вовсе сделать статической. Что, собственно, я в итоге и сделал. Ведь смысл скрипта как-раз в том, чтобы генерировать уникальный контент.


Спасибо!
Насчёт memory leaks и падений: у меня там запущено еще 2 сервера старых игр, написанных на Delphi, которые уже года 3-4 никто не трогал. Кроме рестартов, связанных с обновлением системы (примерно раз в полгода), они не перезапускались. И вот они работают, люди играют — ни одного падения за эти годы, и память не течет. Конечно, так получилось не сразу, но постепенно я пришел к простому выводу: если не создавать объекты, не выделять явно память, а использовать лишь managed-типы, то и течь нечему :) Включенный Range Check защищает от выходов за пределы массивов, тем самым предотвращая порчу памяти. А повсеместные блоки try/except не дают мелким проблемам перерасти в крупные.


Вероятно в ближайшее время на Patreon'е будет достигнута следующая цель: тогда опубликую код сервера игры и напишу новую статью о его устройстве.

Не упадёт — всё везде завёрнуто в try/except. Ну и есть же способы следить за процессом и запускать его в случае падения.
Перезапуск при обновлении — да, на 2-3 секунды сайт отключается. При большом желании можно повозиться чтобы этого избежать.

Ну вот например я недавно скачал свежий официальный дистрибутив и установил Лазарус, запустил его пересборку — ошибка! Скачал 32-битную версию — то же самое. Ну как так?


Другой пример:


var s:string
...
 s.ToUpper;

В mode=Delphi — работает, в mode=DelphiUnicode — ошибка. А по документации должно работать.

Imho с грамматикой проблем нет. Основных проблем на мой взгляд две:


  • Долгое время не было бесплатного инструмента, тогда как C++, Java, Nodejs, Python — всё бесплатно.
  • Долгое время была фактически монополия на язык, который был железобетонно связан с библиотеками. Получается закрытая проприетарная экосистема, которая пусть и хороша как коммерческое решение, но долгосрочно с ней связываться стрёмно: мало ли что… С развитием FPC/Lazarus стало менее стрёмно.

Другой тест — на 150 клиентов, тут уже видно, что некое равновесие наступает при нагрузке в ~45 запросов в секунду, сайт при этом уже тормозит:

Судя по логам, worker тратит на выполнение запроса 20-100 мс, в среднем примерно 40 мс. Запросы сложились в очередь — отсюда большое время ожидания.

Вообще результат сильно зависит от того, как написана реализация конкретной страницы. Можно запросто обрабатывать и тысячи запросов в секунду, если не делать в каждом запросе десятки обращений к БД, а использовать только данные в памяти.

Стресс-тест: 20 запросов в секунду в течение 20 секунд.
Домашняя страница (самая тяжелая):

И шаблоны там выглядят как-то так:


<br>
Something here for the body

<table border=1>
 <tr>
  <td valign="center" width=200 height=200>
{+INCLUDETEMPLATE [-TEMPLATEFILE=body_left.html-]+}
  </td><td valign="center" width=200 height=200>
{+INCLUDETEMPLATE [-TEMPLATEFILE=body_right.html-]+}
  </td>
 </tr>
</table>

Но писать в Лазарусе — это боль.

Пока к сожалению нельзя.

Обратите внимание, все эти warning'и происходят из сторонних скриптов.


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

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

Здесь MySQL, кавычки повсюду использую двойные, поскольку запросы со строками обычно выглядят так:


db.Query('SET param="%s"', [value]);

т.е. поскольку одинарные уже задействованы, логично использовать двойные.


Но вообще спасибо за замечание, действительно стоит обрабатывать и одинарные.

Информация

В рейтинге
Не участвует
Откуда
Минск, Минская обл., Беларусь
Дата рождения
Зарегистрирован
Активность