a.i. Archive
История моих блогов начинается не с вордпреса и даже не с ЖЖ, как можно было бы подумать. Она начинается с вордовских документов, которые я исписывал рассказами о том, как провел летние каникулы в деревне. Можно сказать, что она начинается с тех пор как я в принципе научился писать. Эта история так же терниста тем, что свои блоги я то закрывал то начинал вести заново, в зависимости от моего психологического состояния и популярности платформы. В конце-концов я, как мне кажется, пришел в гармонию с собой, устаканился и принял неизбежное — я люблю писать и буду это делать всегда. Вне зависимости от того, читает это кто-то или нет. Как показало время, это одна из немногих постоянных частей меня, и я был бы рад ее сохранить. И хоть к сожалению все эти летние истории уже давно утеряны, остались как раз таки архивы вордпреса и живого журнала. Было бы очень больно их потерять. Но и держать их в ZIP архивах на жестком диске тоже не имеет большого смысла, поэтому я решил их восстановить и вылить в публичное пространство. Как минимум будет легче шарить эти истории когда возникает такая необходимость. Раньше мне приходилось искать сохраненные PDF файлы с этими постами и скидывать их в мессенджере.
Эта идея пришла мне в голову на вдохновении после написания простых вещей. Мне так же захотелось чего-то простого и постоянного, только своего, родного. Какого-то места, которое будет подвластно только мне и будет находиться в интернете постоянно. Я уже подымал тему удаления контента в своем первом альбоме, и там я рассуждал о соблазне его удаления из веба, но невозможности удаления из книги (или альбома в данном случае). Раньше я относился к этому легкомысленно и считал, что устаревшая информация уже ничего не стоит. Сейчас мне кажется, что её ценность кроется в самой её истории — в возможности наблюдения за изменением себя и других, которое проявляется в проделанной работе, будь то фотография или текст. Так наглядно видно развитие или деградация в творчестве, и на это интересно посмотреть.
С другой стороны, закрытие ЖЖ и вордпреса в целом было неплохими идеями. ЖЖ в итоге устарел и куда-то пропал, сейчас к нему вообще нету доступа. А вордпрес... ну вордпрес это вордпрес. Так или иначе меня всегда не устраивала проприетарность этих платформ. Их судьба в чьих-то чужих руках, а следовательно и мой контент тоже. Посты из ЖЖ я поначалу импортировал в вордпрес, но почти все записи из него были в приватном статусе, невидимые для публики. А при закрытии вордпреса я экспортировал его содержимое себе на комп. Проблема в том, что экспорт вордпреса — это пара гигантских XML файла, в которых хранится вся информация о публикациях и комментариях к ним, и отдельно архив с медиа (фотографиями). Фотографии из живого журнала к сожалению были полностью утеряны, они не импортировались в вордпрес и вместо них были картинки с битыми ссылками. Из этого всего происходит главная проблема любого разработчика ПО — как привести в порядок всю эту информацию?
Задача
Иными словами, я решил сделать отдельный сайт с архивом своих публикаций. Мне не нужно было что-то вычурное и много-функциональное. Нужна была просто страничка со списком постов и фотографиями, которую можно листать и читать, приблизительно как тут в телетайпе. Первая мысль, это почему бы не загрузить просто все сюда? Но есть несколько проблем:
- снова vendor lock;
- нет возможности поставить дату публикации в прошлом, поэтому все старые записи будут сверху;
- ненавистный мною бесконечный скролл, а я люблю постраничную навигацию;
- нету экспорта;
- шрифт, который мне не по нраву;
- периодические комментарии каких-то левых руснявых пользователей, которые пытаются привлечь к себе внимание.
Мне кажется, что рано или поздно я съеду и с телетайпа. Но пока что мне его хватает, поэтому я буду продолжать публиковать сюда. Проблему отсутствия экспорта я решаю периодическим копированием публикаций себе в блокнот. Так я могу быть уверен, что они никуда не пропадут.
Еще я долго думал, восстанавливать ли мне полностью все, или от чего-то отказаться, и в итоге решил восстановить только часть публикаций. Из ЖЖ много постов тупо ни о чем — там мои статус-апдейты о сдаче контрольных работ и просто всякая чепуха, типа постов с названием "Нармусик пацанчеГи!"...
Хотя нет, я передумал и восстановлю все, что смогу восстановить.
Посты
Посты из ЖЖ оказались самыми сложными. В первую очередь из-за своей давности, во вторую, из-за битых ссылок на фотографии. Если в вордпресе в ссылке фотографии присутствует имя файла, то живой журнал генерировал собственные сокращенные ссылки, и получить референс на файл нереально. Для того, чтоб это все восстановить хоть в каком-либо приемлемом виде, мне пришлось потратить несколько дней на реструктуризацию своего архива фотографий. После этого мне стало легче сопоставлять даты постов и даты "альбомов" моих фоток. Ради этого мне пришлось изучить экшены и батч-процессинг в фотошопе, а так же пописать немного кода, чтоб выудить из этих фотографий информацию из EXIF метаданных об их создании. Даты создания самих файлов, как многие знают, ни о чем не говорят. Сначала я думал, что смогу понять какие где фотки чисто по контексту публикаций. В итоге часто, особенно в более ранних постах, я натыкался на несоответствия. Типа я могу писать о том, что вышел погулять и поснимать подол и выкладываю при этом пару фотографий... вообще за другой день и с другого места. Некоторые посты содержали исключительно фотографии без текста. При этом заголовки обычно тоже ни о чем не говорят. Приблизительно 15% из всех постов мне не удалось восстановить по этим причинам.
Заголовки в моих постах в ЖЖ — это отдельная тема. Они пестрят нецензурной бранью и обилием троеточий (собственно, как и сам текст). В финальной версии троеточий в заголовках практически нету, я решил их убрать, но неосознанно отдал им дань в виде разделителей между постами:
Разделители эти, кстати, могут с первого взгляда показаться бесполезными, но на практике они решают небольшую проблему дизайна, чисто визуальную. Вообще я старался уделять внимание каждой мелочи и её назначению, чтоб ничего не казалось лишним или бесполезным. При этом я так же руководствовался своим видением и желаниями.
Посты из ЖЖ имеют ужасный вид по большей части из-за моей неграмотности в те времена. По правде говоря, мне было как-то насрать на грамотность и красоту текста в то время. Это сейчас я заморачиваюсь над каждым словом и форматированием, перебираю шрифтами и отступами, пишу длинное тире вместо короткого. Конечно, все равно все далеко не идеально. Я мог бы конечно привести все в порядок, но ради истории и сохранения сил оставил как есть. По мере перебора этих постов я исправил только очевидные опечатки. Лет пять назад мне наверное было бы стыдно это все выкладывать в таком виде, но сейчас мне все равно. Это история, это я, мои мысли и слова, мое правописание тех лет. Это нельзя перечеркнуть, это было. Возможно в этих ужасных ошибках в словах и "падонкоффском изыке" есть какая-то изюминка.
Чего не осталось, так это постов из групп, они из ЖЖ не экспортировались. zabroshennye еще существует, но комментариев и постов удалившихся пользователей там к сожалению нет.
Всю эту информацию мне нужно было преобразовать в единый и удобный для меня формат. Держать их в XML или HTML нет особого смысла — это неудобно и не универсально. Поэтому я выбрал уже привычный для себя markdown, который довольно легко и быстро преобразуется во все, что угодно. Я временно восстановил весь сайт на вордпресе для удобства, и принялся копировать пост за постом оттуда в свой блокнот. Я использую Bear, в нем все заметки хранятся по умолчанию в markdown. Там же я могу вставить все отсутствующие фотографии и удобно экспортировать во что угодно и как угодно.
Фотографии
Следующий вопрос у меня возник к хостингу фотографий, потому как их реально дофига. Просто загрузить их на образный Flickr не удастся, везде есть ограничения и это будет vendor lock. Хотя, если так подумать, vendor lock всегда будет в каком-то виде. Но я решил пойти суровым путем, и сделал аккаунт на Amazon AWS, там сделал S3 Bucket и настроил CloudFront CDN. Посмотрю потом, какой счет мне выставит Amazon за пару гигабайт моих фоток с редким доступом к ним.
Как я уже сказал касаемо самого сайта — я хотел что-то простое. Буквально WEB 1.0. Но сейчас уже невозможно такое делать: кто-то откроет это на айпаде, кто-то на айфоне, кто-то в браузере на retina экране, а кто-то на не дорогом ноуте. В целом, на сайте нет ничего такого — список публикаций с пагинацией и несколько ссылок в заголовке. Основное, над чем пришлось попотеть, это форматирование текста и незнание новой технологии. Я решил убить двух зайцев одним выстрелом и попробовать сделать это на фреймворке NextJS. Он идеально подходит именно для статических сайтов и довольно популярен, а интеграция на Vercel настолько тесная, что сайт разворачивается в проде буквально в пару нажатий кнопок. Собственно, из-за маленького объема работы я уделял больше внимания деталям: логичные ссылки, стабильное форматирование и отзывчивый дизайн под разные экраны. И главное — весь контент по центру и без всяких выезжающих панелек!
Пейджинг
Я терпеть не могу бесконечный скроллинг. В первую очередь потому что ты никогда не видишь конечность информации, во-вторую, потому что он всегда сбивается: вкладка перезагрузилась и ты снова в начале списка. Хочешь сохранить его состояние, на какой странице сейчас находишься — и ты идешь нахер, ничего не выйдет из-за проблемы плавающих по страницам записей. И добавь еще к этому мою странную привычку пролистывать все списки с конца (да, я люблю сразу пойти в конец списка и листать в начало).
Поэтому пейдждинг сделан как ни в каком другом месте. Кажется, что сделать его проще простого, но при подходе к этой задаче в первую очередь сталкиваешься с количеством разного вида отображения страниц, коих довольно много:
Наверное выбор зависит от каждой конкретной задачи, количества информации и свободного места в лейауте. У меня информации не много и не мало, всего на данный момент около 300 постов. Если отображать по 10 на странице, то выходит 30+ страниц. Мне больше всего импонировали 7 и 8 варианты — в них всегда есть возможность перейти на близлежащие страницы, или на первую и последнюю, и всегда видно сколько страниц есть вообще на данный момент. Но есть одно но. Если задуматься, недостаток таких видов отображения страниц в том, что посты никогда не привязаны к конкретной странице. Если на данный момент есть 30 публикаций, они расположатся на 3-х страницах. При добавлении 31-й, самая первая окажется уже на 4-й. То есть публикации все время будут "плавать" по страницам после добавления новых. В книгах все просто — каждая новая страница всегда добавляется в конец, а в вебе мы отображаем свежие записи в начале, хотя страницы показываем как и в книге. Немного не сходится. Просто отображение страниц в обратном порядке не сильно спасает ситуацию, потому что так все публикации будут всегда плавать между двумя близлежащими страницами из-за неравномерности размера всего списка. Для решения этой проблемы нужно буквально уложить список задом-наперед, чтоб плавающее количество последних записей было всегда на первой странице, а не на последней, как в привычных для нас списках. Поток постов идет сверху-вниз и слева-направо. Таким образом каждая запись всегда останется на своей странице, и если кто-то сохранил ссылку на целую страницу, то со временем ее содержимое не поменяется.
Другой проблемой тут является отзывчивость дизайна. Каждый размер экрана может уместить определенное количество страниц. А от этого должна меняться и общая ширина этого компонента, и диапазон видимых страниц. Это пришлось долго и нудно подгонять под разные устройства.
Превью
Механизм ката (cut) в ЖЖ, вордпресе и телетайпе немного отличается. Насколько я помню, в ЖЖ можно было делать вообще несколько катов, но я всегда ограничивался одним. В вордпресе можно было задать посту "заглавное изображение", которое будет красоваться в шапке поста в списке, а сам кат мог быть в одном месте. Тут, в телетайпе, в принципе похожий функционал, только кат делается всегда по первому абзацу. Хотя это вроде можно поменять при паблишинге. В Архиве я сделал просто и гибко — отдельное поле в базе для превью в списке и отдельное непосредственно со всем содержимым. Так у меня есть возможность задать и превью картинку для списка, и сделать кат по сути в любом месте. Тут еще играет роль то, что markdown не поддерживает никаких "катов" и является просто синтаксисом для разметки. Кат это всегда некая кастомная надстройка над существующим синтаксисом, и каверкать markdown такими кастомными разделителями я не очень то хотел. Минус только в том, что в случае изменения текста в части до ката, его приходится менять в двух местах. Другими словами — есть вероятность ошибки, при которой будут расхождения в тексте в превью и в самой статье.
Консистентность
Дабы соблюдать консистентность цели этого сайта, все текущие посты из телетайпа в нем тоже восстановлены, а последующие будут так же добавляться с задержкой в минут 10 после их публикации. Таким образом всегда будет единое место "правды", где собрано все-все-все, что я когда-либо писал в своих блогах.
Косяки
Одной серьезной ошибкой было пренебрежение временем в типе даты публикации. Я на него просто решил забить, аж пока не начал обнаруживать "летающие" по разным страницам посты. Тогда то я и понял, что где-то беда в сортировке. Ровно тогда же я обнаружил, что все-таки я бывало писал по два поста за день, и в контексте сортировки время публикации становится очень важным. Решил я это добавлением в предикат сортировки еще и идентифкатор поста. Но тут как повезет — если порядок постов в контексте дня не имеет значения, то можно забить, а если имеет, то приходится еще шаманить с идентфикатором, чтоб все стало на свои места. В принципе это не критичная проблема и ее можно будет исправить позже, просто поменяв тип данных даты публикации и добавив время, где это нужно.
Было бы плюсом
Из плюшек, которые я добавлю в перспективе — это не назойливая кнопка копирования ссылки поста возле его заголовка. Так же в перспективе хотелось бы добавить и возможность комментировать, но это отдельный большой пласт работы, в отличии от простой кнопочки.
Еще чуть позже я наверное займусь закреплением заголовка с меню. Иногда подбешивает, что с самого низа статьи нужно скролить наверх, чтоб перейти к пунктам меню. То же самое в принципе касается и списка страниц, но я не уверен, что закреплять их снизу это хорошая идея.
Если я все-таки когда-то буду переезжать с телетайпа на Архив, то обязательно добавлю возможность уведомлений о новых постах. В телетайпе все пользуются телеграмм ботом, тут можно сделать или так же, или через имейл, или на выбор.
Ладно, хватит с тебя
Наконец ты дочитал всю эту нудную дрочь, поэтому добро пожаловать в архив.