Открыт репозиторий сайта
necrosfodel
Репозиторий realhistory
Скомпилированные версии сайта

Фактически, была создана платформенная база для исследований в области альтернативной истории. Репозиторий допускает создание форков, код распространяется по лицензии GPLv3 (в коммерческих проектах разрешения на использование не даю).
В принципе, все описание есть по первой ссылке. По второй ссылке выложены скомпилированные локальные 32-битная и 64-битная версии сайта, предназначенные для работы под Windows.
Основная проблема здесь для чайника – установить и настроить PostgreSQL, хотя под Windows она устанавливается несложно.

Что еще необходимо в будущем сделать:
1 Для создания полноценной платформы к сайту требуется прикрутить какой-нибудь вики-движок (чтобы можно было добавлять к каждому событию ссылку на соответствующую статью);
2 Переписать многопоточную программу для поиска дубликатов с C++ и XLS на Go и SQL и добавить ее на сайт.

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

Сайт
necrosfodel

В конце прошлого года я столкнулся с проблемой невозможности удаления загруженных xlsx-файлов (после конвертации в SQL) из кода Beego: их удерживал файл-сервер coquelicot. Сначала долго пытался переписать код coquelicot, чтобы удалять файлы из него, но ничего не получилось. В итоге отказался от использования файл-сервера и написал собственный загрузчик.

В ближайшее время репозиторий сайта на bitbucket будет почищен и выложен в открытый доступ (можно будет создавать форки). Также будут созданы две скомпилированные offline-версии сайта под Windows: 32bit и 64bit.

Вынужден признать, что не имею моральных сил и времени, чтобы поддерживать сайт на своем VDS.


Попробую тут кратенько набросать
necrosfodel
Наткнулся тут на днях на очередную критику Фоменки:
http://www.arhimed007.narod.ru/tatur.htm
"Пользуясь методологией А.Т. Фоменко, мы получили абсурдные выводы. Но таковыми они являются, поскольку мы достоверно знаем, что Сталин не Петр I, поскольку являемся почти современниками событий, которые были подвергнуты сравнениям. Однако, если бы мы жили лет через 100 и имели бы скудный текстовой материал по описанию событий XVII — XX веков, то, применяя метод А.Т. Фоменко, вполне могли бы прийти к выводу, что Сталин=Александр I=Петр I."

Ну, по факту, никто и не утверждает, что Сталин – это Петр I. Исторические ревизионисты и альтернативщики могут утверждать, что основные вехи в биографии Петра I – калька с основных вех биографии Сталина, таким образом доказывая, что Петр I – это выдуманный, подложный персонаж. Никто в здравом уме не будет утверждать, что "Сталин=Александр I=Петр I".

"Таким образом, «найдя» удивительные исторические параллели, А.Т. Фоменко начинает пересмотр всей хронологии человечества вместо того, чтобы признать наличие закономерностей в развитии больших общественных систем, закономерностей, которые определяют не только движение огромных масс людей, но и судьбу конкретных личностей. Вместо того, чтобы отказаться от старой догмы независимости человека от Биосферы, он конструирует свою историю, также оторванную от природного процесса, как и рассматриваемая им."

А вот этот абзац уже более интересный. И в целом я с ним согласен. Объясню почему.
Занимаясь машинной обработкой 30 000 тщательно отобранных Андреем Степаненко исторических дубликатов, я начал искать дубликаты цепочек событий. Результаты получились интересные – программа находит дубликаты цепочек из двух событий (единицы на регион – это очень мало). Дубликаты цепочек из трех событий практически не встречаются. Собственно, вот яркий пример этих коротеньких цепочкек из двух-трех событий:
https://cont.ws/post/420658
То есть, весь массив событий можно представить в виде некого атомарного супа, в котором плавают редкие, но важные и ключевые, путеводные и образующие историю молекулы (наливной пол, армированный волокнами – волокна не связаны между собой, но они укрепляют твердый раствор). Логического дублирования взаимосвязей через время нет, а это значит, что массив событий, к сожалению для всех ревизионистов и альтернативщиков, в целом не подложный. Другое дело, что эти короткие "исторические параллели" – это обнаруженный, зафиксированный, несомненный, доказанный, но никак не объясненный и не интерпретированный факт (в том числе чисто математически). Для альтернативщиков же все просто: все дублированные в прошлое события и вехи в биографиях исторических личностей – это подлог.

Думаю, что в случае с Фоменко все было просто. Он сначала занимался древним миром, так как сказочность и нелогичность последнего не слепит глаза только прожженным историкам-традиционалистам. Но, в итоге, будучи нормальным математиком, обязательно проверяющим границы применимости и достоверности, он применил свою чисто математическую методику к ближайшему прошлому и настоящему. И обнаружил все те же самые закономерности и дубликаты. А потом он вдруг понял, что знает, сколько просидит на царствии, к примеру, Михаил Сергеевич. И чуть позже дата вдруг подтвердилась. И тут Фоменко осознал, что на этом не заработать, а наоборот – можно отхватить пиздюлей. И тогда он написал свою знаменитую фразу о том, что после какого-то там века все события в целом неподложны и отказался далее рассматривать более поздние периоды времени. И начал писать про всяких многократно дублированных наших родных Георгиев(Гюргиев) Чингисханов, Великую (Монгольскую) Русь-Орду и Старый Ымперский Готический стиль. А на альтернативных форумах народ ничего не понял и подумал, что Фоменко просто испугался. И народ продолжил его работу по поиску исторических дубликатов. На самом деле это оказалось совсем неплохо. В итоге была восстановлена общая канва истории с точки зрения развития экономики, науки и техники, логистики, колониальной политики и динамики расширения реальных возможностей для завоеваний. К примеру, один русский царь оказался голоштанным Ольденбургом, планомерно подминающим под себя один речной бассейн, а другой русский царь – носатым Черкесом, захватывающим другой. В истории наконец появилась логика и вещи стали называться своими настоящими именами. И по этому поводу стали серьезно так мандражировать даже некоторые президенты, потому что народ понял, как действует братва. Проблема только в том, что к историческим дубликатам это не имеет никакого отношения.

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

Не нужно во всем этом искать конспирологию, чью-то выгоду, стремление что-то скрыть. Наши правители чаще всего обыкновенные попугаи Попки, которые сами абсолютно не в курсе, как все устроено. Их интересуют бабки и власть, им не до познания. А вот для нас познание этой самой "биосферы" и почему она так устроена – это самое важное. Можно тяжело, муторно и долго "конструировать свою историю" с двумя катастрофами, например в 1707 и 1787 годах, но она совершенно точно будет оторвана от природного процесса, хоть и будет иметь логику, логистику и все остальное тоже. Нельзя все это правильно восстановить, не понимая процессы самоорганизации в природе. А временные события – это точно такой же запрограммированный процесс самоорганизации, который отводит трем Попкам, жившим в совершенно разных эпохах, сроки правления по 49 лет. Мы живем в какой-то матрице, события в которой программируются – это совершенно точно. Надо восстановить (повторить) программу, а не результат ее работы. А может быть можно и восстановить программу по результатам ее работы, посмотрим.

Виджет управления
necrosfodel
Исправлено несколько ошибок:
1 Теперь таблицы загружаются при выборе любой опции, а не при смене опции
2 Исправлено определение имени таблицы при удалении соответствия из таблицы соответствий

Добавление обучения оказалось сущим геморроем – скучным, неинтересным и выматывающим. На данный момент добавлено три туториала:
1 Загрузка таблиц (xlsx)
2 Редактирование таблиц (xlsx)
3 Операции с событиями (grid)
На очереди "добавление связей" (grid), потом обучения по шаблону flot.

Все функции управления были вынесены в отдельный виджет с position: fixed, который может сворачиваться. Иначе работать оказалось невозможно. Виджет можно двигать, и его положение запоминается. Для каждой локации положение и состояние (свернут/демонстрируется) виджета запоминается индивидуально. Для этого на сервере создана таблица coords.


Осталась проблема с захламлением сервера – загруженные файлы занимают место и никак не используются. Придется модифицировать coquelicot.

Обучение
necrosfodel
Использовав javascript-библиотеку sideshow оценил ее простоту и понятливость. Скрипт можно подключить к любой странице. Теперь работа с сайтом будет доступна любому чайнику. Все объясняется по шагам:
При нажатии на F2 запускается модаль с доступными справками для текущей страницы


Пока очередной шаг не выполнишь правильно – дальше не пройдешь.



На моей памяти это вторая приличная бразильская разработка из мира IT. Первая – язык программирования Lua.

(no subject)
necrosfodel
1 Добавлена персонализация (загружаются только принадлежащие пользователю таблицы, данные из таблиц и события). Все таблицы получили связи (ограничения) по foreign keys
2 Добавлена возможность отмены последнего действия для связанных событий (дубликатов и т.п.) с возвращением/удалением виджетов. Для этой цели добавлена таблица last_activities, в которой хранятся данные последнего события для каждого пользователя
3 Реализована замена классов у виджетов связанных событий при их добавлении: меняется цвет, виджет получает адекватный статус, позволяющий дальше им оперировать, в том числе удалять его с помощью отмены. Отмена происходит при нажатии клавиши esc или по клику на кнопку "Отмена" в интерфейсе
4 Добавлена клиентская часть просмотра связанных событий (просмотр в модальном окне)
5 Добавлено плавное исчезновение виджета (после удаления события путем выбрасывания заголовка виджета с помощью drag&drop)

Это все совсем неочевидные вещи, которые даже не можешь себе представить, когда начинаешь работу. А вдруг выясняется, что они необходимы. Это то, что нам в итоге кажется простым, удобным и очевидным интерфейсом.

Осталось написать обучение

Обучение
necrosfodel
Из запланированного:

1 Добавлена крутейшая CSS3-анимация процесса регистрации/авторизации. GIF – это прошлый век

2 Сохранение сессий перенесено из оперативной памяти в файл. Для сохранении в БД надо ее запускать с поддержкой ssl-шифрования, что сейчас мне лень
3 Добавлен серверный код просмотра связанных событий/исторических дубликатов/аналогов по клику. В клиенте будет реализовано в виде всплывающего окошка
4 Теперь в виджет вставляются произвольные данные (JSON-пары) по единому шаблону. Думаю, конкретные наиболее важные (пере)именованные данные (как в таблице params) все же стоит оставить, чтобы, например, описание попадало именно в поле "описание", и было как-то выделено
5 Поскольку связанные события у нас теперь clickable, пришлось отделить функцию drag&drop. В виджет связанного события (и заголовка) добавлен handle (ручка, якорь). 35x35 пикселей вполне хватит, чтобы тащить за него. Якорь в виде белого треугольника появляется только в режиме "правка":


Необходимо также реализовать интерактивную справку, которая поможет пользователю освоить интерфейс. Пока у меня на примете есть Sideshow. Чтобы запустить, надо нажать на "Run Example". Название, конечно, просто потрясающее. Тем не менее, она мне нравится тем, что там есть targets (указатели) и триггер, срабатывающий после события drag&drop, что нам как раз и нужно.

(no subject)
necrosfodel
Как правильно указал chispa1707, может возникнуть такая ситуация, когда в разных таблицах, отвечающих за различные типы событий, может находиться одно и то же событие, просто в разных таблицах будут указаны разные его свойства сообразно теме таблицы.
По этой причине я решил дополнить структуру приложения таблицей equals, в которую заносятся аналоги событий во всех таблицах.
Параллельно была проведена большая работа по оптимизации нейминга и идентификации событий для оперирования ими. Теперь везде (кроме загрузки событий из одной таблицы) событие определяется по паре id таблицы + уникальный идентификатор события (idx).
Добавлена проверка на установку аналога. События должны быть из разных таблиц (на скриншоте аналог из таблицы 2 добавлен к событию из таблицы 1.

Чтобы можно было производить операции с событиями из разных таблиц, добавлена toggle-кнопка "Стирать/накапливать данные". Если активирован режим "накапливать данные", можно загрузить сначала данные из одной таблицы, а потом добавить к ним данные из другой.
Также добавлен индикатор количества событий, находящихся в данный момент в памяти браузера (считаются сами события, связанные события, дубликаты и аналоги). Загруженные данные в любой момент можно стереть.

Следующими этапами будут:
1 Юзабилити – добавление "успокоения пользователя" при регистрации и авторизации,
2 Добавление обучения,
3 Реализация сессий не в памяти сервера, а в БД или cookie (чтобы пользователей не выбрасывало после каждой перезагрузке http-сервера),
4 Добавление просмотра связанных событий/исторических дубликатов/аналогов по клику.

Фиг с ним, что долго – надо нормально сделать. Уже наелись результатов работы от "хуяк-хуяк и в продакшн".

Финальные работы
necrosfodel
1 В систему авторизации добавлена криптографическая соль
2 В систему регистрации добавлено подтверждение по email
3 Библиотека salvattore для вставки динамического контента заменена на paginationjs.
4 Продумана система с постраничной навигацией. Если вдруг у нас будет множество страниц и нам потребуется добавить связанное событие со страницы 1 на страницу 3, надо просто активировать режим "Добавлять". Тогда, при переходе на страницу 3, контент со страницы 3 будет добавлен к контенту страницы 1. После этого можно спокойно оперировать всеми событиями с помощью drag&drop. В режиме "Заменять" мы просто листаем страницы (контент меняется).


Думаю, надо еще добавить хотя бы фильтр по регионам, и тогда уже можно в продакшн.

Внешний вид сайта и система авторизации
necrosfodel
Медленно, но верно движемся к финалу. За последнюю неделю:
1 В контроллере flot.go отказался от sqlx, перейдя полностью на gorm
2 Добавил XSRF-защиту
3 Написал систему авторизации, использующую хэши. Очень умную систему авторизации

4 Использовал шаблон для сайта из диплома моей жены :D
5 Жена нарисовала логотип! Спасибо ей! :D


По сути остались мелкие доработки. Главная из них – добавление постраничной навигации в шаблон grid.go. Надо заменить salvattore чем-то более хитрым.

?

Log in