Эгея 11.4

Вышел очередной апдейт 11-й версии (сборка v4169).

Редактор новой заметки

Редактор новой заметки теперь работает надёжнее и не требует интернета. Если хотя бы один раз открыть страницу /new/, то она радикально закешируется и дальше уже будет открываться из офлайна. В сочетании с локальным автосохранением в браузере это позволяет писать заметки из самолёта или где вы там пишете. Если попытаться сохранить заметку на сервер, Эгея скажет, что интернета нет, но если просто перезагрузить страницу, то всё откроется с того же места. Также исправлен досадный баг, из-за которого локальное автосохранение в браузере иногда могло не срабатывать.

Можете попробовать сами в демоблоге.

Загрузка и управление файлами

Добавилась поддержка аудиоформата Ogg, графического формата AVIF, а также улучшена поддержка WebP (при условии поддержки этих форматов используемой сборкой ПХП). Теперь в диалоговом окне выбора файла для загрузки не поддерживаемые файлы забледнены.

Заодно исправлены разные мелочи вокруг файлов и редактора:

  • если вы загружали файлы picture.png и picture.jpg, Эгея могла запутаться и показывать одному другой в качестве превьюшки (кажется, этот баг появился в 11.2);
  • при изменении набора картинок, загруженных в тег, мог устаревать кеш картинок в связанных с ним заметках; теперь не устаревает;
  • при перетаскивании картинок, в именах файлов которых содержались неразрешённые символы, Эгея могла их «потерять» (это случалось, например, при перетаскивании картинок напрямую из Телеграма, где в именах файлов он использовал двоеточия);
  • если попытаться перетащить кучу файлов, часть из которых поддерживается, а часть нет, спиннер загрузки продолжал крутиться до бесконечности;
  • у аудиофайлов превьюшка иногда была ноткой в квадратике, а иногда в прямоугольничке;
  • если при загрузке юзерпика на сервере не окажется нужной для него папки, Эгея попытается создать её, и только если не получится, скажет об ошибке;
  • если перетащить пачку файлов прямо в поле текста заметки, они могли вставляться в неожиданном порядке, а если до этого был выделен кусок текста, то он вообще мог замениться, причём после этого ещё и анду не работало; теперь файлы вставляются по порядку, перед абзацем, в котором сейчас курсор, и в зависимости от браузера может даже работать анду;
  • исправлены ещё несколько эзотерических багов вокруг загрузки файлов связанных с определение того, что такой файл уже есть, нумерацией, автоконвертацией в джипег и т. д.;
  • сообщения об ошибке при попытке перетащить файл неподдерживаемого формата стали информативнее; вообще, повысилась внятность сообщений об ошибках при работе с файлами (загрузка, переименование, удаление).

Безопасность

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

Также по умолчанию куки теперь работают только на ХТТПС-соединении и при локальном использовании (можно настоять на использовании всегда, включив insecure_cookies в конфиге). И ещё улучшена защита от перебора пароля, за что спасибо Жене Степанищеву.

Разное

Что ещё изменилось:

  • Лайкли обновились до 3.2 (теперь умеют называть Твиттер «иксом»; обновились иконки части соцсетей);
  • в списке комментариев у каждого комментария появился якорь в коде, чтобы можно было дать ссылку на конкретный.

Исправлено ещё несколько багов:

  • кажется, поля поиска и ввода тегов, наконец, заработали на Андроиде;
  • если при распаковке дистрибутива вы потеряли скрытый файл .htaccess, инсталлятор должен был сам создавать его и работать гладко, да вот только забывал это делать в некоторых случаях, да ещё и не выводил внятных сообщений об ошибках; теперь и пытается создать всегда, и ошибки выводит чёткие, если не получается;
  • в скрытых заметках, которые обычно отображаются бледно-серыми, жирный текст оставался чёрным;
  • если у заметки было слишком длинное описание для соцсетей, его поле забывало растянуться на весь текст, но вдруг вспоминало об этом при первом же изменении (теперь сразу отображается нужного размера);
  • убраны несколько сообщений об ошибках, появлявшихся под ПХП 8.2.

Как обновиться

Если Эгея у вас оплачена, напишите мне, и я дам вам полную версию 11.4. Если вы пользуетесь сервисом, у вас уже последняя Эгея.

Свежий дистрибутив лайт-версии — в конце страницы «Стать пользователем». Замените папку /system/ новой.

Что послушать — 85

Всё, что можно слушать, я стараюсь слушать, а не читать и не смотреть. Потому что когда у меня свободны глаза, я предпочитаю делать что-то более полезное.

Вот что я слушал в последнее время, что мне понравилось:

  1. Павел Дуров у Лекса Фридмана. Круто, чё. Правда, я совсем иначе смотрю на идею дисциплины.
  2. Чейз Хьюс у Джо Рогана. Какой-то эксперт по манипулированию людьми. Рассказывает, какие мы все уязвимые.
  3. Андрей Карпати про настоящее и будущее нейросетей. Я очень порадовался, что он наехал нейросетевой стиль программирования ровно так же, как я (33:10+). В конце очень интересно про то, что нейросети пока очень плохие учителя, но как круто будет, когда станут хорошими; и что учиться мы будем так же, как ходить в спортзал .
  4. Rework: Everybody works. Хорошая мысль, что необязательно быть менеджером, просто если ты старший, ты можешь быть наставником. Это мне нравится.
  5. Новое производство «Тейсти-кофе». Интересно, как заморачиваются с кофе, чтобы получилось нормально!

Станция Фридберг и поезд до Франкфурта

В рамках интереса к транспорту пофоткал станцию Фридберг и внутри поезда до Франкфурта.

Неожиданная и приятная вёрстка экрана с ближайшим и следующими поездами. Вместо строчек — колонки:

Обычный поезд:

Обожаю бесконечное число всяких обозначений и пометок на вагонах снизу.

Нравятся такие поезда с огроменными окнами:

Традиционное германское расписание отправляющихся (жёлтым) и прибывающих (белым) поездов:

Направление на экранчике:

Схема местных электричек над дверью:

Более общая схема региональных поездов. Дизайн совсем другой:

Общий вид вагона. Дизайн экрана опять совсем другой:

Я люблю ставить ноги на сиденья:

Какая-то местная фридбергская железнодорожная будка в окне:

А это выход со станции, когда уже возвращаешься обратно:

Фотографии из поездки в апреле-мае 2022 года. Слетайте во Фридберг!

Близко к теме:

На интерфейсном курсе: эпицентрический дизайн и понятность с первого раза

Разбираем интерфейс конструктора окон. Сначала я говорю о том, что на экране половина места тратится не на то. А потом о том, нужно ли, чтобы интерфейс был понятен с первого раза. 5 минут:

Это фрагмент № 184 онлайн-курса «Пользовательский интерфейс и представление информации». Записано на курсе 5 апреля 2024 года.

Открыта запись на курс, который пройдёт 13 декабря — 11 января, и сейчас −20%. Сейчас −20% из-за ранней записи.

Почитать о курсе

Программа, отзывы, запись

Трек, немножко похожий на мой старый трек

Попался мне трек:

Приятный техно-транс, 2024 год. И напомнил мне о другом треке:

Это мой трек. Пситранс, 2006 год.

Альбом Skin Care целиком — на Саундклауде (нужен ВПН чтобы открыться, но потом играет и без).

Отельный бассейновый тупизм

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

Унисим: апдейт за ноябрь 2025 года

Весной я рассказывал, что использую Унисим. Одна е-симка на весь мир, единый баланс счёта, пополнение рублями. Не надо всякие режимы через сим-меню выбирать, приложение выглядит нормально, а самое главное — связь появляется сразу, а не через десять минут непонятных поисков сети, как было в Дримсиме. С сентября я побывал в Лимассоле, Кракове, Варшаве, Гонконге и Бангкоке — везде связь была отличная, так что продолжаю рекомендовать.

Первые 15 долларов мне закинули на счёт для теста. Потом я дал вам реферальную ссылку (и сейчас даю), чтобы вы могли подключить себе такое тоже. Благодаря этому своих денег я пока ни копейки на это не потратил. Если вы подключитесь по реферальной ссылке, то и вам, и мне добавляют по 5% от суммы вашего пополнения, так что продолжайте делать так и дальше. Можно ещё использовать промокод AZEXAIDO.

Хоть что-то в путешествиях становится легче.

Диалог с «Кодексом» ЧатаГПТ при разрабоке Эгеи

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

Вот краткий художественный пересказ сегодняшнего нашего диалога об Эгее:

— Изучи мой код внимательно и расскажи, что нужно, чтобы добавить на страницу новой заметки такую-то фичу.
— Изучил. Чтобы добавить фичу на страницу с адресом /@/new/ есть два способа: первый не работает, а второй работает, это всего 30 строчек кода.
— Почему ты пишешь /@/new, ведь адрес страницы просто /new/. И зачем обсуждать первый способ, если он не работает?
— Ах да, я просто посмотрел, что когда-то раньше (коммит такой-то десять лет назад) адрес был /@/new/, поэтому решил упомянуть это, если вдруг ты захочешь его вернуть.
— Нет, не захочу. Ладно, давай свои 30 строчек кода.
— Вот, написал.
— Окей, у меня не работает. Вот что я делаю, вот чего ожидаю, вот что получаю, а вот что вижу в консоли.
— Всё правильно, оно и не должно работать, это ожидаемое поведение, ведь ты не написал ещё другой кусок кода.
— Как понять «я не написал»? Это же ты не написал. Ну напиши.
— Вот, написал.
— Хорошо, теперь работает, но грузится немыслимые пятнадцать секунд или около того. Надо мгновенно.
— Исправил одну строчку, теперь должно быть мгновенно.
— Всё работает как надо. Давай теперь разбираться, что ты понаписал. Для чего вот это? А вот это? А почему тут не использовать вот такой уже имеющийся у меня код?
— Это на такой-то случай. Это в принципе можно убрать. А тут твой код подходит даже лучше, молодец, что заметил!
— Ну так исправь.
— Исправил. Но теперь не будет работать из-за того-то.
— Ёлки, так что ж ты сразу не сказал?
— Прости, я не так тебя понял. Хочешь, верну как было.
— Я хочу, чтобы ты убрал лишнее и переиспользовал имеющийся код, где можно, но чтобы всё работало.
— Хорошо, сделал.
— Теперь я заметил, что ты положил новый файл в такую-то папку, а у меня всё подобное лежит в другой. Давай перенесём.
— Перенёс. Заодно убрал комментарии и поменял стиль кода в случайных местах.
— А об этом-то кто просил? Верни мой нормальный стиль кода и комментарии. Ещё ты добавил в конфиг Вебпака исключение чисто ради нашей новой фичи. Мне не нравится это, потому что я никогда не вспомню, что оно там. Придумай, как локализовать всё про неё в одном месте.
— Готово.
— Я смотрю, ты заодно переписал файл .htaccess, добавил туда какую-то отсебятину, а мои правила убил. Это что такое?
— Чтобы фича работала, нужно отправить определённые хедеры браузеру, вот я и добавил правило в .htaccess. Твои правила случайно удалил, прости, уже вернул.
— Так, а эта функция вообще будет у нас работать, если пользователь установил Эгею не в корень блога, а в подпапку? Я смотрю, ты какие-то пути к файлам там пишешь от корня.
— Не будет, и вот тебе объяснение на три страницы, почему именно.
— Ну так а надо-то, чтобы работало. Напиши так, чтобы работало.
— Готово, я добавил по 2-3 строчки разного кода в десяток файлов, теперь всё будет работать. Файл .htaccess теперь будет генерироваться динамически во время инсталляции и содержать нужный путь, чтобы работало в любой подпапке.
— Боже, ты с ума сошёл? Смотри сколько всего ты нагородил. Надо придумать, как сделать, чтобы работало без этого. Зачем ты вообще этот .htaccess трогать вздумал? Во всех остальных случаях я шлю хедеры просто из кода на ПХП функцией header (). Почему вдруг именно тут ты решил это сделать через .htaccess? Давай сделаем как везде.
— Ты прав. Я написал ПХП-файл и положил его вместо .htaccess, чтобы он слал нужные хедеры. Всё, что нагородил до этого, удалил.
— А почему этот ПХП-файл ты положил туда? У меня в проекте такого нет, у меня весь ПХП-код живёт в одном месте, а не в раскиданных где попало ПХП файлах. Если надо, чтобы этот файл отдавался по определённому урлу, для этого у меня есть роутер. Разберись как он работает и положи свой ПХП-код в логичное место, как у меня принято.
— Сделал. Я ещё написал вспомогательную функцию, которая конкатенирует две строки, и теперь вызываю её в двух местах!
— Жесть. Я удалил твою функцию и просто конкатенирую две строки напрямую. Я ещё переписал твой код так, чтобы он стал вдвое короче, убрал часть проверок. Убедись, что я ничего не сломал.
— Твоё исправление выглядит отлично! Действительно, ничего этого проверять не нужно было! Осталось только убедиться, что значение не заканчивается слешем.
— Не понял. Зачем ты написал, что осталось убедиться? Я ж эту проверку как раз оставил, то есть убеждаюсь.
— Да, убеждаешься, это я так просто написал, разговор поддержать...
— Также я смотрю, ты ещё и часть логики в шаблон дизайна засунул. Где такое видано? Перенеси эту логику в ядро, а в шаблоне дизайна используй уже подготовленную переменную.
— Код из шаблона в ядро перенёс, заодно добавил там других ненужных проверок.
— Убери.
— Убрал.
— Так, а вот эта штука у тебя зачем?
— Это нужно для того-то.
— Но для того-то у меня уже есть вот такая своя штука, давай использовать её.
— Давай. Отличная идея. У тебя тут ещё и такой-то случай учтён, ну надо же! Какой ты молодец!

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

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

Преодолеваем телеграмный запрет на войсы

Сегодня я хотел отправить коллеге голосовое сообщение с размышлениями о том, как сделать задачу, но оказалось, что у него отключён приём голосовых. Тогда я пошёл в ЧатГПТ, попросил распознать мою запись и чуть-чуть привести её в читаемый вид. В итоге отправил ему уже текст. Такой вот лайфхак на случай, если очень хочется отправить голосовое, а тебе не дают.

Полагаться на телеграмовское распознавание речи не стоит. Если наговорить полторы минуты, а Телеграм превратит это в одну простыню, читать будет невозможно. А ЧатГПТ умеет разбить текст на абзацы и убрать чисто голосовые особенности.

Кстати, эту заметку я тоже наговорил голосом, пока шёл по городу, а ЧатГПТ её привёл в порядок.

На что я смотрю, когда фотографирую

Обещал рассказать, как я фотографирую, чтобы получалось клёво. Во-первых, я уже как-то писал о неприятных пересечениях на фотках. Также выкладывал видео о том, что телефон нужно держать ровно. Сегодня просто поделюсь ходом мысли в момент съёмки. Покажу, какие кадры мне показались неудачными и как я сделал их лучше.

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

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

Сначала получилось мимо из-за въехавшей в кадр машины, потом она проехала и стало нормально:

Разница между кадрами — 4 секунды

Такси слева ехало и выехало из кадра, обрезавшись его границей. Но ясно же, что оно щас повернёт и въедет обратно в кадр. Надо его поймать, как только оно въедет полностью, но не слишком поздно, чтобы оно не заняло собой весь кадр. Получилось идеально, что ещё и мотик поехал его обгонять:

Разница между кадрами — 7 секунд

С автобусом нормально, но не супер; с двумя тук-туками намного аутентичнее:

Разница между кадрами — 3 секунды

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

Разница между кадрами — 3 секунды

Ну при чём тут белый мерседес? Вот мусоровоз — другое дело:

Разница между кадрами — 7 секунд

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

Разница между кадрами — меньше секунды

Чел слева ваще не вписывается в картину. Подождём пока он свалит... О, какой автобус! Берём:

Разница между кадрами — 4 секунды

Как видите, нигде речь не идёт о какой-то постановке или поиске особенно художественного образа. Это всё совершенно проходные фотки, но каждую из них я делаю так, чтобы она была нормальной. Это же совершенно ничего не стоит. Да, бывает нужно подольше потерпеть, пока человек рассмотрит что-то на витрине и отойдёт, или даже прождать целый светофорный цикл, чтобы фура уехала. Но чаще всего это просто автопилот: «так не очень, а вот так получше». Я специально подписал, сколько времени я ждал между кадрами, чтобы было ясно, что удачный момент обычно не так сложно поймать.

Последняя фотка даже удостоилась публикации, вот в таком виде:

Исходные кадры я бы удалил в обычном случае, но тут они стали материалом для заметки.

Ранее Ctrl + ↓