3 заметки с тегом

ПХП

Быстро типографируем текст перед показом на странице

Перед показом текста на странице его надо обработать по правилам типографики. Это может сделать «Типограф» Студии Лебедева, «Типограф» Дениса Селезнева или свой движок.

Если текст написан и не меняется, то его не надо все время типографить. Достаточно оттипографить один раз, сохранить результат и выводить его до тех пор, пока текст снова не изменится.

Для этого использую такой механизм.

  • Создаю исходный текст и сохраняют его в файле с расширением «in».
  • В коде страницы вызываю функцию typo_file( ’имя_файла_с_текстом’ ), которая выводит на страницу оттипографированый текст. Имя файла указывается без расширения.

Функция typo_file( $filename ) делает следующее:

  1. Ищет файл $filename с расширением «in».
  2. Ищет файл с таким же именем и расширением «out».
  3. Сравнивает даты модификации файлов.
  4. Если «out» изменен позже, чем «in», возвращает содержимое «out».
  5. В противном случае типографит содержимое «in», записывает его в «out» и возвращает результат в основной поток.

Код функции typo_file на ПХП:

<?php

function typo_file( $file_name, $input_extension = '.in', $output_extension = '.out' ) {
   if ( !file_exists($file_name.$input_extension) )
      return '';

   $in_time  = filemtime($file_name.$input_extension);
   $out_time = file_exists($file_name.$output_extension) ? filemtime($file_name.$output_extension) : $in_time-1;

   if ($out_time < $in_time) {
      // типографим содержимое файла
      $in_file  = file_get_contents( $file_name.$input_extension );
      $out_file = typo( $in_file );
      // записываем данные в новый файл
      file_put_contents( $file_name.$output_extension, $out_file );
   } else
      $out_file = file_get_contents( $file_name.$output_extension );

   return $out_file;
}
?>

Функция typo типографит текст удобным вам способом.

Содержимое основной страницы выглядит так:

<?php
// …

echo typo_file( ‘page_content’ );

// …
?>

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

2017   ПХП   типограф

Вырезаем пиксельную графику из СВГ

Столкнулся с задачей.

Есть фотография большого размера (более 4 тыс. пикселей по ширине), на которой запечатлены части живых организмов.

Большая фотография с прикрепительными структурами плоского паразитического червя

Организмы — это паразиты. Мизерные примитивные червячки из класса Моногеней, живущие на жабрах рыб. К жабрам они крепятся при помощи крючков.

Рисунок головы кефали из работы Световидова (1964); рисунок жабр и сидящего на них паразита из работы Лопеса-Беленгуэра с сотоварищами (2015)

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

Метод главных компонент описывает разнообразие форм прикрепительных крючков разных родов моногеней. График из статьи Вигнона (2011)

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

Проблема в том, что готовый файл слишком много «весит». Исходный джипег размером 800 Кб, после обводки и сохранения в СВГ, толстеет до 12 Мб. В результате мне присылают мегатонные свгешки с внедренной графикой, которые надо разместить на сервере, а он не резиновый.

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

Я несколько часов пытался уменьшить размер свг-файла с графикой без потери качества. Попробовал уменьшить в Инскейпе, не получилось — размеры фотографии и свг-файла остались огромными. Потом разобрался с форматом и нашел решение.

Формат СВГ поддерживает два способа хранения изображений.

Первый, когда графический файл внедрен в СВГ. Это не оптимальный способ, потому что файл не сжат. Изображение состоит из последовательности символов в позиционной системе счисления с основанием 64 (base64). Отсюда 800 Кб превращаются в 12 Мб.

Фотография, внедренная внутрь свг-файла, занимает очень много места

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

Отделил «мух» от «котлет»

Второй вариант подошел.

Если бы файлов было мало, я бы все переконвертировал вручную. Но файлов много — несколько сотен.

В результате написал скрипт на ПХП. Он извлекает из СВГ фотографию, сохраняет ее в виде отдельного джипега и вставляет в СВГ ссылку на этот джипег. Джипег хранится локально и называется так же, как и свг-файл.

Скрипт умный. Если в разных файлах используется одна и та же фотография, скрипт сохранит ее всего один раз и во всех файлах будет правильно на нее ссылаться. Это экономит место.

Скрипт для всех.

Эта заметка описывает этап создания виртуальной коллекции паразитов рыб Мирового океана

Выполнение Эр скриптов на ПХП

Надо выполнить сложные статистические вычисления с помощью ПХП. Писать свои модули сложно, долго и бессмысленно. Придумал интегрироваться с Эр.

Библиотека php-r Александра Качкаева позволяет выполнять скрипты Эр на ПХП. Примеры убедительны, но сам еще не пробовал.

У кого есть опыт работы с php-r?

С какими другими модулями для выполнения многомерных статистических расчетов на ПХП вы знакомы (дискриминантный анализ, кластерный анализ, ординационный анализ)?