6 заметок с тегом

ПХП

Прием программирования: Вовремя остановиться

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

Для того, чтобы код нельзя было больше выполнить, я внедряю в него оператор die().

Главное — вовремя остановиться.

Приемы веб-программирования. Разрешить Апачу сначала искать файлы в текущем каталоге

Памятка тем, кто (до сих пор) руками пишет веб-движки на ПХП.

У вас есть два файла с одинаковым названием ’konstituciya.php’ в текущем и каком-то системном каталоге. Файл в системном каталоге делает основную работу, например, выводит перечень статей конституции. Файл в текущем каталоге устанавливает локальные настройки, например, вносит в конституцию поправки, а потом вызывает файл из системного каталога. Чтобы поправки вступили в силу, необходимо, чтобы первым был вызван файл из текущего каталога. Вот так:

konstituciya.php → ./system/konstituciya.php

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

php_value include_path ".:/home/system"

Тогда код выполнится правильно:

// Сначала вызовет файл из текущего каталога с поправками, а потом системный файл с основными законами
   include_once "konstituciya.php";

Удачи.

Ошибки программирования. Забыл про юникод

В коде повторяю одни и те же ошибки. Из-за них ничего не работает. Вот одна.

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

if (strtolower($input_name) == $name) { ... }

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

А правильно использовать mb_strtolower.

if (mb_strtolower($input_name) == $name) { ... }

То же самое относиться и к другим функциям работы со строками. При юникоде и других кодировках использовать функции с префиксом mb_.

Успехов.

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

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

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

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

  • Создаю исходный текст и сохраняют его в файле с расширением «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’ );

// …
?>

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

Вырезаем растровую графику из СВГ

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 65   2016   R   ПХП   статистика