Pull to refresh
52
0.4
Дмитрий @bogolt

User

Send message

Собственный сервер Commento с Docker Compose

Reading time9 min
Views6.3K

Апдейт (2023): Проект Commento заброшен и больше не развивается. Я настоятельно рекомендую переходить на Comentario — мой форк, в котором переработано почти всё.


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


TL;DR-версия: я разработал конфигурацию Commento-сервера, которая легко и просто развёртывается в полуавтоматическом режиме. Скопируйте себе этот репозиторий с GitHub и следуйте инструкциям в README.

Некоторое время назад мне неудержимо захотелось сменить Disqus — который является, пожалуй, самой распространённой системой для добавления комментариев к страницам — на свободный и открытый Commento.


Почему именно Commento?


Проблема Disqus, как и многих других «бесплатных» продуктов, в том, что продуктом в данном случае является пользователь — то есть вы. Помимо этого, Disqus «обогащает» каждую страницу, где он используется, мегабайтами скриптов и более чем сотней дополнительных HTTP-запросов.


Плюс к этому, бесплатная его версия показывает рекламу, от которой можно откупиться «всего лишь» за 9 долларов в месяц (план Plus). Уже только этого достаточно, чтобы захотелось найти что-нибудь получше.


В какой-то момент я наткнулся на этот пост и узнал о существовании свободного сервера комментариев под названием Commento. По счастливому совпадению, Commento как раз не так давно стал полностью открытым — раньше он выпускался в двух вариантах, бесплатном Community и коммерческом Enterprise. Спасибо его разработчику Adhityaa Chandrasekar.

Читать дальше →

Статистика сайта и своё маленькое хранилище

Reading time9 min
Views6.7K
Утилита Webalizer и инструмент Google Analytics помогали мне много лет получать представление о том, что происходит на веб сайтах. Сейчас я понимаю, что они дают очень мало полезной информации. Имея доступ к своему файлу access.log, разобраться со статистикой очень просто и для реализации достаточно элементарных инструментов, таких как sqlite, html, языка sql и любого скриптового языка программирования.

Источником данных для Webalizer является файл access.log сервера. Так выглядят его столбики и цифры, из которых понятен лишь общий объём трафика:

image
Читать дальше →

Генерация подземелий и пещер для моей игры

Reading time4 min
Views26K

На этой неделе я начал работать над новой темой: генерацией подземелий и пещер. Я использовал разбиение пространства для генерации комнат, алгоритмы генерации лабиринтов для генерации коридоров и клеточные автоматы для придания пещерам более естествненного внешнего вида.

Разбиение пространства


Существует множество способов генерации комнат для подземелья (случайное размещение, генерация на основе агентов, с использованием separation steering behavior или физического движка, и т.д.). Но мой любимый метод — это разбиение пространства, потому что оно легко контролируется и расширяется.

Способов разбиения пространства тоже очень много: разделение на сетки, двоичное разбиение пространства, разбиение пространства деревом квадрантов, диаграммы Вороного и т.д. Я решил использовать двоичное разбиение пространства, потому что оно хорошо подходит для генерации прямоугольных комнат. Этот метод получил популярность благодаря статье на RogueBasin.

Единственная сложность этого алгоритма — выбор позиции разделения. Если мы не наложим ограничение на позицию разделения, то будем получать странные разбиения пространства:


Такого поведения можно избежать несколькими способами. Один из них — ограничить позицию разделения двумя соотношениями длин сторон, например, в интервале от 30% до 70% или от 40% до 60%. Другой способ — использовать вместо равномерного распределения нормальное или биномиальное, благодаря этому повысится вероятность разделения по центру стороны, а не по краям. Эти способы устраняют проблему, но сложно понять, как конкретно параметры влияют на окончательный результат.
Читать дальше →

Анализ сишного Hello World

Reading time7 min
Views71K
Hello World — одна из первых программ, которые мы пишем на любом языке программирования.

Для C hello world выглядит просто и коротко:

#include <stdio.h>

void main() {
  printf("Hello World!\n");
}

Поскольку программа такая короткая, должно быть элементарно объяснить, что происходит «под капотом».
Читать дальше →

Готовим полнотекстовый поиск в Postgres. Часть 2

Reading time7 min
Views24K

В прошлой статье мы оптимизировали поиск в PostgreSQL стандартными средствами. В этой статье мы продолжим оптимизацию с помощью индекса RUM и проанализируем его плюсы и минусы в сравнении с GIN.

Читать дальше →

Лабиринты: классификация, генерирование, поиск решений

Reading time44 min
Views93K

В этом классическом посте подробно рассказывается о самых популярных способах создания и прохождения лабиринтов. Статья разделена на четыре части: классификация, алгоритмы генерации, алгоритмы решения лабиринтов и другие операции с лабиринтами.

Классификация лабиринтов


Лабиринты в целом (а значит, и алгоритмы для их создания) можно разбить по семи различным классификациям: размерности, гиперразмерности, топологии, тесселяции, маршрутизации, текстуре и приоритету. Лабиринт может использовать по одному элементу из каждого класса в любом сочетании.
Читать дальше →

Умеренный Hardening для Firefox

Reading time20 min
Views40K


Современный веб состоит из множества разных технологий, которые предоставляют самые разные возможности… но ещё и создают немалое количество угроз. Современные браузеры давно стали самыми сложными приложениями на компе, обогнав по сложности даже ядро ОС (в Firefox в несколько раз больше строк кода, чем в ядре Linux или офисных пакетах). Мы проводим в браузере большую часть своего времени, так что не удивительно, что браузер находится под прицелом: его постоянно пытаются взломать, использовать в ботнете, пытаются украсть из него наши данные, прослушать его трафик, отслеживать посещаемые нами сайты и наши действия на этих сайтах.


Сейчас самое время сказать, что всё не так уж плохо, и со всеми этими проблемами можно справиться… но это не так. Из коробки браузеры уже делают немало: регулярно обновляются, стараются затыкать дыры в безопасности, внедряют новые технологии для защиты, предоставляют возможность расширять их функционал сторонними расширениями. Но серьёзной защиты из коробки нет, и вряд ли она когда-нибудь появится: она идёт в комплекте с усложнением интерфейса браузера и частичным отключением его функционала, что "ломает" сайты и вряд ли понравится обычным пользователям. Но самое печальное, что даже такой ценой невозможно полноценно защитить браузер — слишком уж он стал сложным.


Тем не менее, для усиления защиты браузера можно много чего сделать.

Читать дальше →

Шесть историй, как код переписали с нуля

Reading time24 min
Views41K
Новый взгляд на извечный вопрос: следует ли переписывать приложение с нуля или это «самая худшая стратегическая ошибка, которую может сделать разработчик программного обеспечения»? Оказывается, при работе со зрелой кодовой базой есть более двух вариантов ответа.



«Исходный код словно заржавел!» — Джоэл Спольски

Почти два десятилетия назад Джоэл Спольски устроил разнос Netscape за то, что она переписала кодовую базу браузера, в своём эпохальном эссе «Чего никогда нельзя делать». Он пришёл к выводу, что функционирующий софт абсолютно никогда не следует переписывать с нуля. У него было два основных аргумента:

  • Кажущиеся мусором части кодовой базы часто включают в себя трудом заработанные знания о пограничных ситуациях и странных ошибках.
  • Полная переделка — длительное предприятие, которое отвлекает от улучшения существующего продукта, что даёт козыри конкурентам.
Читать дальше →

Nintendo чётко даёт понять, что только пиратство может сохранить историю видеоигр

Reading time6 min
Views43K

Закрывая Wii Store Channel и не давая пользователям скачивать старые игры, компания Nintendo снова демонстрирует, что в современную цифровую эпоху вещи, которые вы покупаете, на самом деле вам не принадлежат




Пробыв в онлайне больше десятилетия, Nintendo закрывает Wii Shop Channel. Компания убрала возможность покупки внутримагазинной валюты (Wii Points) уже в прошлом марте, а с 30 января пользователи уже не могут покупать WiiWare или игры с Virtual Console.

На первый взгляд этот ход легко отмести как естественную гибель сервиса, привязанного к стареющей консоли, в результате эволюции. Особенно учитывая, что Nintendo дала пользователям достаточно много времени на то, чтобы потратить Wii Points до закрытия магазина. Однако день, когда Nintendo отключает Wii Store Channel, должен стать серьёзным предупреждением для всех, кого волнует сохранение видеоигр, и для любого потребителя, использующего цифровой магазин: часто продукты, которые мы покупаем в цифровом виде, нам не принадлежат, и когда один из цифровых магазинов закрывается, единственным способом сохранения его для истории остаётся пиратство.
Читать дальше →

256 строчек голого C++: пишем трассировщик лучей с нуля за несколько часов

Reading time8 min
Views150K
Публикую очередную главу из моего курса лекций по компьютерной графике (вот тут можно читать оригинал на русском, хотя английская версия новее). На сей раз тема разговора — отрисовка сцен при помощи трассировки лучей. Как обычно, я стараюсь избегать сторонних библиотек, так как это заставляет студентов заглянуть под капот.

Подобных проектов в интернете уже море, но практически все они показывают законченные программы, в которых разобраться крайне непросто. Вот, например, очень известная программа рендеринга, влезающая на визитку. Очень впечатляющий результат, однако разобраться в этом коде очень непросто. Моей целью является не показать как я могу, а детально рассказать, как подобное воспроизвести. Более того, мне кажется, что конкретно эта лекция полезна даже не столь как учебный материал по комьпютерной графике, но скорее как пособие по программированию. Я последовательно покажу, как прийти к конечному результату, начиная с самого нуля: как разложить сложную задачу на элементарно решаемые этапы.

Внимание: просто рассматривать мой код, равно как и просто читать эту статью с чашкой чая в руке, смысла не имеет. Эта статья рассчитана на то, что вы возьмётесь за клавиатуру и напишете ваш собственный движок. Он наверняка будет лучше моего. Ну или просто смените язык программирования!

Итак, сегодня я покажу, как отрисовывать подобные картинки:


Читать дальше →

Реализация горячей перезагрузки С++ кода в Linux

Reading time10 min
Views18K

image


* Ссылка на библиотеку в конце статьи. В самой статье изложены механизмы, реализованные в библиотеке, со средней детализацией. Реализация для macOS еще не закончена, но она мало чем отличается от реализации для Linux. Здесь в основном рассматривается реализация для Linux.


Гуляя по гитхабу одним субботним днем, я наткнулся на библиотеку, реализующую обновление c++ кода налету для windows. Сам я слез с windows несколько лет назад, ни капли не пожалел, и сейчас все программирование происходит либо на Linux (дома), либо на macOS (на работе). Немного погуглив, я обнаружил, что подход из библиотеки выше достаточно популярен, и msvc использует ту же технику для функции "Edit and continue" в Visual Studio. Проблема лишь в том, что я не нашел ни одной реализации под не-windows (плохо искал?). На вопрос автору библиотеки выше, будет ли он делать порт под другие платформы, ответ был отрицательный.


Сразу скажу, что меня интересовал только вариант, в котором не пришлось бы менять существующий код проекта (как, например, в случае с RCCPP или cr, где весь потенциально перезагружаемый код должен быть в отдельной динамически загружаемой библиотеке).


"Как так?" — подумал я, и принялся раскуривать фимиам.

Читать дальше →

GLSL: Центр или центроид? Или когда шейдеры атакуют

Reading time5 min
Views6.2K
Дорабатывая шейдер для готовящейся к выходу игры, я столкнулся с неприятным артефактом, который проявляется только при включении аппаратного MSAA. На скриншоте ландшафта видно несколько чересчур ярких пикселей. Значения цвета в нескольких из них было настолько велико, что после наложения блума они превратились в разноцветных «призраков».

image

Предлагаю вашему вниманию перевод статьи, которая детально объясняет причину этого феномена и способ борьбы с ним.
Читать дальше →

Внутренняя и внешняя линковка в C++

Reading time9 min
Views72K
Всем добрый день!

Представляем вам перевод интересной статьи, который подготовили для вас рамках курса «Разработчик C++». Надеемся, что она будет полезна и интересна для вас, как и нашим слушателям.

Поехали.

Сталкивались ли вы когда-нибудь с терминами внутренняя и внешняя связь? Хотите узнать, для чего используется ключевое слово extern, или как объявление чего-то static влияет на глобальную область? Тогда эта статья для вас.

В двух словах

В единицу трансляции включены файл реализации (.c/.cpp) и все его заголовочные файлы (.h/.hpp). Если внутри единицы трансляции у объекта или функции есть внутреннее связывание, то этот символ виден компоновщику только внутри этой единицы трансляции. Если же у объекта или функции есть внешнее связывание, то компоновщик сможет видеть его при обработке других единиц трансляции. Использование ключевого слова static в глобальном пространстве имен дает символу внутреннее связывание. Ключевое слово extern дает внешнее связывание.
Компилятор по умолчанию дает символам следующие связывания:

  • Non-const глобальные переменные — внешнее связывание;
  • Const глобальные переменные — внутреннее связывание;
  • Функции — внешнее связывание.


Читать дальше →

Секс — продавец классических аркадных игр. А кто же покупатель?

Reading time5 min
Views30K
Насколько я помню, в 70-80 годах лозунг «секс — двигатель рекламы» был невероятно притягателен. Было такое ощущение, что предметом общего согласия в рекламе был образ полуодетой красавицы, которую достаточно поставить перед неким продуктом и сфотографировать, после чего этот продукт разлетится как горячие пирожки. Это касалось джинсов, лосьонов после бритья, автомобилей, да всего чего угодно, щедро приправляемого двусмысленными образами, призванными вытягивать деньги из карманов альфа-самцов. Где-то этот приём использовался утончённо и элегантно, где-то — более грубо, пожалуй, найти можно самые разные примеры.

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

Всё это началось с игры Computer Space. Пожалуй, лучше всего начать наш разговор именно с неё, так как она была представлена первым игровым автоматом, получившим широкое распространение. Автомат выпустила в 1971 году компания Nutting Associates. Тогда явно чувствовалось, что для того, чтобы эту игру продавать, нужно немного гламура. В результате игровая индустрия, с самого начала, прибегала к услугам женщин-моделей для того чтобы привлечь внимание аудитории.

Читать дальше →

Тема бронелифчиков в культуре Востока и Запада

Reading time8 min
Views88K

......


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


Явление «бронелифчиков» существует уже довольно давно. Есть несколько вариантов названий, часто еще используется «бронетрусы», но смысл от этого не меняется. Бронелифчик это броня, которая предназначена для чего угодно кроме, собственно, защиты стратегически уязвимых мест.


Такая броня ужасно неудобна, она натирает и гарантирует носящему простуду в регионе со средним климатом и огромное количество укусов насекомых в регионах с теплым климатом. Ну и конечно же все колюще-режущие предметы которые в вас летят достигнут цели.


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


Для начала я бы хотела внести небольшое уточнение. Современный игропром сейчас буквально поделен на два лагеря — «Восток» и «Запад». Под Востоком обычно подразумевается Япония, чуть реже Китай или Корея, история и культуры которых взаимодействовали и переплетались веками. Запад это, по сути, все страны современной Европы (там практически каждая побывала чьей-нибудь колонией или имела колонии, что способствовало культурному обмену).


Какое это имеет отношение к бронелифчикам?


Игровая индустрия сейчас тоже разделена на восточную и западную. Если выбрать любую японскую или корейскую игру и любую европейскую а потом попросить человека угадать какая где, то абсолютное большинство угадает с первого раза. Серия TES и серия Metal Gear Solid. World of Warcraft и, например, Perfect World или более современная Black Desert, Лара Крофт и Байонетта.

Читать дальше →

Пара иногда востребованных хитростей при работе с git

Reading time6 min
Views26K

Хочу поделиться рецептами решения пары задач, которые иногда возникают при работе с git, и которые при этом не "прямо совсем очевидны".


Сперва я думал накопить подобных рецептов побольше, однако всему своё время. Думаю, если есть польза, то можно и понемногу...


Итак...

Читать дальше →

Моё разочарование в софте

Reading time11 min
Views393K

Суть разработки программного обеспечения
— Нужно проделать 500 отверстий в стене, так что я сконструировал автоматическую дрель. В ней используются элегантные точные шестерни для непрерывной регулировки скорости и крутящего момента по мере необходимости.
— Отлично, у неё идеальный вес. Загрузим 500 таких дрелей в пушку, которые мы сделали, и выстрелим в стену.


Я занимаюсь программированием уже 15 лет. Но в последнее время при разработке не принято думать об эффективности, простоте и совершенстве: вплоть до того, что мне становится грустно за свою карьеру и за IT-отрасль в целом.

Для примера, современные автомобили работают, скажем, на 98% от того, что физически позволяет нынешняя конструкция двигателя. Современная архитектура использует точно рассчитанное количество материала, чтобы выполнять свою функцию и оставаться в безопасности в данных условиях. Все самолёты сошлись к оптимальному размеру/форме/нагрузке и в основном выглядят одинаково.

Только в программном обеспечении считается нормальным, если программа работает на уровне 1% или даже 0,01% от возможной производительности. Ни у кого вроде нет возражений.

Процедурные миры из простых тайлов

Reading time14 min
Views21K
image

В этом посте я опишу два алгоритма для создания сложных процедурных миров из простых наборов цветных тайлов и на основе ограничений расположения этих тайлов. Я покажу, как при аккуратном дизайне этих наборов тайлов вы можете создавать интересный процедурно генерируемый контент, например, ландшафты с городами или подземелья со сложной внутренней структурой. В видео ниже показана система, создающая процедурный мир на основании правил, закодированных в 43 цветных тайлах.


На изображении ниже показан набор тайлов (тайлсет), на основании которого сгенерирован мир из видео. Мир снабжён примечаниями, которые помогут представить его в настоящей среде.

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

Reading time21 min
Views24K
image

Недавно я выпустил свою первую игру BYTEPATH и мне показалось, что будет полезно записать свои мысли о том, чему я научился в процессе её создания. Я разделю эти уроки на «мягкие» и «жёсткие»: под мягкими я подразумеваю идеи, связанные с разработкой ПО, жёсткие — это более технические аспекты программирования. Кроме того, я расскажу о том, почему хочу написать собственный движок.

Мягкие уроки


Сообщу ради контекста, что начал делать собственные игры примерно 5-6 лет назад и у меня есть 3 «серьёзных» проекта, над которыми я работал до выпуска первой игры. Два из эти проектов мертвы и полностью провалились, а последний я временно приостановил, чтобы поработать над BYTEPATH.

Вот gif-анимации из этих проектов



Первые два проекта провалились по разным причинам, но с точки зрения программирования они провалились (по крайней мере, как мне это видится) потому, что я слишком часто пытался быть слишком умным и заранее обобщал слишком многое. Большинство мягких уроков связано с этим провалом, поэтому важно было сказать об этом.
Читать дальше →

C++ велосипедостроение для профессионалов

Reading time36 min
Views50K
Классы, которые люди самостоятельно пишут, а потом копируют из одного проекта в другой, хотя они уже есть в стандартных библиотеках, в простонародье называются велосипедами. Первый вопрос, который возникает при встрече с таким «велосипедом» — зачем люди переписывают что-то заново? Вариантов может быть несколько.

  • Некоторые делают это для самообучения: берут класс стандартной библиотеки, пишут его сами с нуля, сравнивают то, что получилось, с тем, что есть в стандартной библиотеке — в процессе узнают для себя что-то новое.
  • Некоторые проекты имеют особое требования к коду. В embedded-разработке принято работать без RTTI и без exception, поэтому части стандартной библиотеки, которые используют RTTI и exception, необходимо переписать без них.
  • Редко, но бывает, когда велосипед пишут, потому что могут написать лучше, чем в стандартной библиотеке. Как правило, такие нововведения рано или поздно попадают в стандартную библиотеку.
  • Другим только кажется, что они могут написать лучше, и таких людей больше. Но в процессе они обучаются, выясняют для себя что-то новое и что-то интересное открывают.
  • Могут быть другие причины.

Сегодня мы не будем говорить о том, что велосипеды — это плохо, это не обязательно так. Мы поговорим о том, что действительно плохо:

  • бездумно переносить устаревшие технологии 20-30-летней давности в современные проекты;
  • пользоваться «вредными» бенчмарками и оптимизациями.

А также затронем «вредные» советы, обсудим новейшие практики программирования (C++ 11 и позднее), подумаем, что делать с «идеальным» велосипедом.

Information

Rating
3,233-rd
Registered
Activity