Tom Adler’s blog

экспорт жж

в отличие от некоторых компаний, 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

если у вас дома бывают гости, и вы не против, чтобы они пользовались вашим домашним WiFi, можно заметно упростить для них подключение. Основные параметры, такие как имя сети и пароль, легко представить в виде QR-кода, и гостю достаточно будет его сосканировать. Вот WiFi QR Code Generator, который позволяет создавать коды вроде такого:

пример QR-кода с параметрами WiFi-сети

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

,

woff в otf на javascript

я сделал на яваскрипте маленький конвертер шрифтов из формата WOFF в формат OTF. Уж не знаю, скольким людям он пригодится, но лично мне он был полезен для того, чтобы разобраться с обработкой двоичных данных в браузере, и чтобы освежить в памяти встроенную поддержку drag-n-drop. К сожалению, и то, и другое сделано не очень-то удобно, хотя свою задачу решает.

а началось всё с того, что мне регулярно стали приходить Unicode Emoji, которые не поддерживались стандартными шрифтами, и потом я увидел статью, как добавить в убунту поддержку Emoji. Рекомендации статьи мне не понравились, так что я решил скачать другой шрифт для этих символов, и нашёл только в WOFF. А чтобы сконвертировать его в OTF, я нашёл скрипт на питоне woff2otf. Обратил внимание на то, что скрипт простенький, и на то, что не очень удобно для разовой задачи скачивать его и передавать ему параметры. Тут кстати вспомнилось, что я ещё не упражнялся со всякими Typed Arrays, и не сделал ещё ничего с перетаскиванием файлов в браузер. Вот и занялся.

, , ,

обновлённый webfinger

почти пять лет назад я писал о том, как добавить для своего почтового адреса поддержку WebFinger. С тех пор он довольно сильно изменился. Во-первых, опубликовали официальную RFC7033 WebFinger. Во-вторых, переключились с XML на модный JSON. В-третьих, начали использовать в нескольких ещё менее известных системах

впрочем, суть его осталась та же, и добавить поддержку WebFinger всё так же просто: достаточно отдавать небольшой JSON-файлик по адресу https://example.com/.well-known/webfinger?resource=acct:email@example.com. Чуть сложности добавляет только то, что сам емейл теперь — параметр в адресе (и некоторые клиенты вопреки стандартам не экранируют в нём спецсимволы).

nginx:

include mime.types;
types { application/jrd+json jrd; }

location = /.well-known/webfinger {
    if ($arg_resource = 'acct%3Aemail%40example.com') {
        rewrite .* /.well-known/email@example.com.jrd break;
    }
}

email@example.com.jrd:

{
  "subject": "acct:email@example.com",
  "aliases": ["https://example.com/"],
  "links": [
    {
      "rel": "http://webfinger.net/rel/avatar",
      "href": "https://example.com/favicon.svg"
    },
    {
      "rel": "http://webfinger.net/rel/profile-page",
      "href": "https://example.com/"
    }
  ]
}

здесь для примера приведены только два типа ссылок, можно использовать и все остальные существующие значения rel