Заметки за 2012 год (страница 4)

Уборка мусора в Git

Удалить все неиспользуемые объекты можно командой

git gc

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

Удалить все ветки, которых нет во внешнем репозитории можно командой

git remote prune origin

Если даже на какой-либо объект нет явной ссылки, то на протяжении 30 дней на все объекты сохраняется ссылка в reflog . По этому когда производится уборка мусора все коммиты за последний месяц всё равно остаются в репозитории.

Чтобы избавиться от таких недоступных комитов, выполним последовательность команд


git reflog expire --expire=1.minute refs/heads/master
git fsck –unreachable
git gc
Комментарии к заметке: 2

Нелинейная шкала слайдера

Когда слайдере нужно использовать для ввода несоизмеримых по величине данных (например, от 1 тысячи до 10 миллионов рублей), то разумнее использовать какую-то нелинейную шкалу. В частности, для ввода сумм подходящей шкалой будет логарифмическая (по основанию 10).

Для сравнения приведу два слайдера с линейной и нелинейной шкалой.

Нелинейная система координат

Чтобы обычный слайдер превратить такой нелинейный нужно определить две функции, которые будут переводить числа из одной системы отсчета в другую.


function fromSlider(value) {
    return Math.round(Math.pow(10, value));
}

function toSlider(value) {
    return Math.log(value) / Math.log(10);
}

Теперь там где нужно установить значение в слайдер используем toSlider, а там где получаем значение из слайдера — fromSlider.


$(".logarithmic__slider").slider({
    min: toSlider(1000),
    max: toSlider(10000000),
    step: 0.01,
    value: toSlider(initialValue),
    slide: function (e, ui) {
        $(".logarithmic__value").html(fromSlider(ui.value));
    }
});

Округление и форматирование

Чтобы данные выглядели презентабельно их хорошо бы ещё округлить и отформатировать.


function round(n, threshold) {
    var digits, out;

    n = n.toFixed(0);
    digits = n.length;
    out = n.substr(0, Math.min(digits, threshold));

    if (digits > threshold) {
        out = out + "000000000000".substr(0, digits - threshold);
    }

    return parseInt(out);
}

Функция оставляет только указанное количество значимых разрядов в числе. Остальные будут обнулены.


function splitGroups(n, delim) {
    var digits;

    delim = delim || '<span class="tsp"> </span>';

    n = n.toFixed(0);
    digits = n.length > 3 ? n.length % 3 : 0;

    return (digits ? n.substr(0, digits) + delim : '') +
        n.substr(digits).replace(/(\d{3})(?=\d)/g, "$1" + delim);
}

А эта функция разделяет группы разрядов числа. В качестве разделителя по умолчанию я использую пробел половинной ширины.


.tsp {
    font-size: 50%;
    line-height: 1;
}

Или можно указать требуемый разделитель вторым параметром функции.

Комментарии к заметке: 1

Конвертируем в ProRes с помощью FFmpeg

Когда я столкнулся с необходимостью обработать AVCHD видео , то мне пришлось его конвертировать в mp4. Копирование потоков в новый контейнер без обработки вызывало появление какие-то артефактов. Позже я выяснил, что они возникали только во время воспроизведения полученного видео. Когда оно проходит финальный рендеринг, то артефактов уже нет. Думаю, что на это не стоит полагаться. Ведь не понятно что получится в результате. Получить максимальное качество рабочего материала можно, если сконвертировать его в формат ProRes.

Начиная с версии 0.11 кодеки ProRes включены в стандартную сборку FFmpeg.


ffmpeg -i ~/Desktop/00000.MTS \
    -copyts -acodec copy -vcodec prores -profile 0 \
    ~/Desktop/out.mov

Качество видео, а значит и средний битрейт, регулируется параметром profile. Он может принимать значение от 0 до 3 включительно. Эти значения соответствуют профилям:

  • -profile 0 — Apple ProRes Proxy
  • -profile 1 — Apple ProRes LT
  • -profile 2 — Apple ProRes 422 for SD
  • -profile 3 — Apple ProRes HQ for HD

Ещё у FFmpeg есть альтернативная версия с нужными кодеками – FFMedia Broadcast.

Для сборки ffmbc может понадобится установить yasm, если его ещё нет. Я установил его через Homebrew.

brew install yasm

Затем распаковываем исходники ffmbc, конфигурируем их командой ./configure –enable-gpl, собираем make и инсталлируем sudo make install.

У кодека ProRes есть несколько ключей:

  • -qscale <значение> или -cqp <значение>

    Задает фиксированное значение квантайзера, которое будет использоваться для каждого кадра. В выходном потоке будет переменнй битрейт.

  • -profile <имя>

    Профиль может принимать одно из значений: proxy, lt, std, hq . Если не задан битрейт, то он выбирается автоматически на основании размера кадра и профиля.

  • -b <битрейт>

    Задает примерное значение постоянного битрейта.

Итак, для перекодирования исходного видео в ProRes нужно выполнить команду:


ffmbc -i ~/Desktop/00000.MTS \
    -copyts -acodec copy -vcodec prores -profile std \
    ~/Desktop/out.mov
Оставте свой комментарий

Вертикальные метрики у веб-шрифтов

Работая с веб-шрифтами можно натолкнуться на серьёзную проблему с вертикальными метриками на разных платформах (OS X и Windows). Это может проявляется в том, что назначив цвет фону строчного элемента, расцвеченный прямоугольник во всех OS X браузерах будет смещен вниз.

У Font Squirrel есть решение этой проблемы.

Исправление вертикальных метрик шрифта с помощью Font Squirrel

Приведу примеры с использованием PT Sans до и после исправления вертикальных метрик.

Отображение в OS X

Safari 5.1

PT Sans в Safari 5.1 (OS X)

Firefox 13

PT Sans в Firefox 13 (OS X)

Chrome 19

PT Sans в Chrome 19 (OS X)

Opera 12

PT Sans в Opera 12 (OS X)

Отображение в Windows

Interner Explorer 9

PT Sans в Internet Explorer 9 (Windows)

Firefox 13

PT Sans в Firefox 13 (Windows)

Chrome 19

PT Sans в Chrome 19 (Windows)

Opera 12

PT Sans в Opera 12 (Windows)

Интересное наблюдение

Любопытно, но рендеринг текста в Windows версиях Opera, Firefox, Chrome оказывается поразительно идентичен между собой вплоть до межбуквенных и межстроковых интервалов. Увы, но такого же постоянства нет в OS X браузерах.

Комментарии к заметке: 2

Разные начертания веб-шрифта

Font Squirrel после конвертирования шрифтов создает CSS файл, в котором все начертания одной и той же гарнитуры представлены в виде совершенно разных гарнитур. Рассмотрим в качестве примера PT Sans.


@font-face {
    font-family: 'PTSansRegular';
    src: url('PTS55F-webfont.eot');
    src: url('PTS55F-webfont.eot?#iefix') format('embedded-opentype'),
         url('PTS55F-webfont.woff') format('woff'),
         url('PTS55F-webfont.ttf') format('truetype');
    font-weight: normal;
    font-style: normal;
}
@font-face {
    font-family: 'PTSansItalic';
    src: url('PTS56F-webfont.eot');
    src: url('PTS56F-webfont.eot?#iefix') format('embedded-opentype'),
         url('PTS56F-webfont.woff') format('woff'),
         url('PTS56F-webfont.ttf') format('truetype');
    font-weight: normal;
    font-style: normal;
}
@font-face {
    font-family: 'PTSansBold';
    src: url('PTS75F-webfont.eot');
    src: url('PTS75F-webfont.eot?#iefix') format('embedded-opentype'),
         url('PTS75F-webfont.woff') format('woff'),
         url('PTS75F-webfont.ttf') format('truetype');
    font-weight: normal;
    font-style: normal;
}
@font-face {
    font-family: 'PTSansBoldItalic';
    src: url('PTS76F-webfont.eot');
    src: url('PTS76F-webfont.eot?#iefix') format('embedded-opentype'),
         url('PTS76F-webfont.woff') format('woff'),
         url('PTS76F-webfont.ttf') format('truetype');
    font-weight: normal;
    font-style: normal;
}

Когда используется такой шрифт в сочетании с модификаторами начертаний font-weight и font-style , то браузер автоматически пытается «сделать» шрифт полужирным или наклонным не обращая внимания, что для этого есть специально созданные начертания.


h1, h2, h3 { font-family: PTSansBold, Arial, sans-serif; }

Если такой шрифт подключается только для заголовков, где применяется, как правило, только полужирное начертание, то для альтернативных гарнитур полужирного начертания уже не будет!

Чтобы с начертаниями был полный порядок нужно поправить описания шрифтов.


@font-face {
    font-family: 'PTSansWeb';
    src: url('PTS55F-webfont.eot');
    src: url('PTS55F-webfont.eot?#iefix') format('embedded-opentype'),
         url('PTS55F-webfont.woff') format('woff'),
         url('PTS55F-webfont.ttf') format('truetype');
    font-weight: normal;
    font-style: normal;
}
@font-face {
    font-family: 'PTSansWeb';
    src: url('PTS56F-webfont.eot');
    src: url('PTS56F-webfont.eot?#iefix') format('embedded-opentype'),
         url('PTS56F-webfont.woff') format('woff'),
         url('PTS56F-webfont.ttf') format('truetype');
    font-weight: normal;
    font-style: italic;
}
@font-face {
    font-family: 'PTSansWeb';
    src: url('PTS75F-webfont.eot');
    src: url('PTS75F-webfont.eot?#iefix') format('embedded-opentype'),
         url('PTS75F-webfont.woff') format('woff'),
         url('PTS75F-webfont.ttf') format('truetype');
    font-weight: bold;
    font-style: normal;
}
@font-face {
    font-family: 'PTSansWeb';
    src: url('PTS76F-webfont.eot');
    src: url('PTS76F-webfont.eot?#iefix') format('embedded-opentype'),
         url('PTS76F-webfont.woff') format('woff'),
         url('PTS76F-webfont.ttf') format('truetype');
    font-weight: bold;
    font-style: italic;
}

Для начала указываем всем начертаниям одно и тоже имя.

Конкретно в этом примере я выбрал PTSansWeb . Я намеренно отказался от оригинального имени для демонстрации подключения требуемого шрифта, а не какого-то другого. Разумеется в продакшине, если есть шанс, что гарнитура уже установлена у пользователя в системе, то его не стоит упускать. По этому для популярных шрифтов важно сохранять исходное название семейства шрифтов («PT Sans», в моём случае).

Затем в модификаторах начертания указываем значения, которые реально соответствуют начертанию каждого файла.

Всё это позволит браузеру выбирать нужное начертание шрифта как это происходит для обычных шрифтов, установленных в системе пользователя.

Комментарии к заметке: 13