в отличие от некоторых компаний, LiveJournal не предоставляет удобной кнопки «скачать мои данные». С другой стороны, нельзя отказать ему в том, что в некотором виде скачать их всё-таки можно. Нам предоставлен помесячный экспорт записей и отдельно потысячный экспорт комментариев. Пользоваться ими довольно нудно, а попытки автоматизации процесса всегда занимают намного больше времени, чем однократное выполнение его вручную. Но когда нас это останавливало? ;)
повинуясь зову иррациональной тяги на всякий случай хранить свои данные поближе к себе, я написал скрипт для экспорта ЖЖ. Помимо HTML архив получается ещё и в JSON, и в Markdown, поэтому следующим шагом можно скормить его пеликану. Пеликан сделает из 100500 файлов нормальный статический сайт.
в результате архив моего ЖЖ лежит рядом с основным блогом и даже выглядит почти так же. А я думаю, что делать с самим закрытым журналом.
я сделал маленький пример прямой манипуляции объектом с использованием мультитача, потому что не нашёл общий язык с hammer.js. Зато теперь я знаю, как это работает. В правильных реализациях те точки, за которые вы «ухватили» объект, остаются строго под вашими пальцами по мере движения. Например, если один палец остаётся неподвижен, а другой движется по кругу вокруг него, то объект будет вращаться вокруг «зажатой» точки.
трюк заключается в том, чтобы при перемещении пальцев в новые координаты вычислить такое преобразование объекта, которое перенесёт в эти координаты зажатые первыми точки. Можно попробовать задать такое преобразование при помощи операторов CSS transform translate, scale и rotate, но вычислять для них значения будет неудобно. Зато надёжно сработает метод с использованием матрицы, хотя и тут без вычислений не обойтись. Удивительно, что готовых формул в интернете мне найти не удалось, и пришлось самому вспоминать линейную алгебру, операции с матрицами, и решение систем линейных уравнений. Имея новые координаты S1 и S2, матрица для переноса точек I1 и I2 к этим координатам вычисляется так:
var a = ((S1.x - S2.x) * (I1.x - I2.x) + (S1.y - S2.y) * (I1.y - I2.y)) /
(Math.pow(I1.y - I2.y, 2) + Math.pow(I1.x - I2.x, 2));
var c = ((S1.y - S2.y) - a * (I1.y - I2.y)) / (I1.x - I2.x);
var tx = S1.x - a * I1.x + c * I1.y;
var ty = S1.y - c * I1.x - a * I1.y;
return new Matrix([
[a, -c, tx],
[c, a, ty],
[0, 0, 1]
]);
а дальше всё просто: при первых касаниях мы запоминаем точки объекта, за которые ухватились, и при последующих вычисляем по этому алгоритму матрицу и вставляем её в стиль объекта.
если у вас дома бывают гости, и вы не против, чтобы они пользовались вашим домашним WiFi, можно заметно упростить для них подключение. Основные параметры, такие как имя сети и пароль, легко представить в виде QR-кода, и гостю достаточно будет его сосканировать. Вот WiFi QR Code Generator, который позволяет создавать коды вроде такого:
достаточно указать имя сети, пароль, распечатать код, и положить его в удобное место
я сделал на яваскрипте маленький конвертер шрифтов из формата WOFF в формат OTF. Уж не знаю, скольким людям он пригодится, но лично мне он был полезен для того, чтобы разобраться с обработкой двоичных данных в браузере, и чтобы освежить в памяти встроенную поддержку drag-n-drop. К сожалению, и то, и другое сделано не очень-то удобно, хотя свою задачу решает.
а началось всё с того, что мне регулярно стали приходить Unicode Emoji, которые не поддерживались стандартными шрифтами, и потом я увидел статью, как добавить в убунту поддержку Emoji. Рекомендации статьи мне не понравились, так что я решил скачать другой шрифт для этих символов, и нашёл только в WOFF. А чтобы сконвертировать его в OTF, я нашёл скрипт на питоне woff2otf. Обратил внимание на то, что скрипт простенький, и на то, что не очень удобно для разовой задачи скачивать его и передавать ему параметры. Тут кстати вспомнилось, что я ещё не упражнялся со всякими Typed Arrays, и не сделал ещё ничего с перетаскиванием файлов в браузер. Вот и занялся.
впрочем, суть его осталась та же, и добавить поддержку WebFinger всё так же просто: достаточно отдавать небольшой JSON-файлик по адресу https://example.com/.well-known/webfinger?resource=acct:email@example.com. Чуть сложности добавляет только то, что сам емейл теперь — параметр в адресе (и некоторые клиенты вопреки стандартам не экранируют в нём спецсимволы).