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

прием

Десять принципов Артема Горбунова

Артем Горбунов — дизайнер, основатель и руководитель Бюро Горбунова.

Вот его жизненные принципы.

  1. Прямо сейчас. Если перед вами стоит сложная задача и вы не знаете, как к ней подступиться, задайте себе вопрос: Что мне мешает достичь цели прямо сейчас? При таком подходе вы начинаете думать о главной проблеме, которая мешает добиться результата.
  2. Не авось. Если сделать что-то на авось, есть два варианта развития событий. Старший товарищ заметит вашу ошибку и наругает вас. Или, что ещё хуже, вы сделаете проект, запустите его, он начнёт работать и что-то в нём пойдёт не так. Поэтому не полагайтесь на авось.
  3. Я виноват. Когда что-то идёт не так, хочется обвинять других. Но в этом случае вы перекладываете ответственность на обстоятельства. Если вы признаёте вину, то можете влиять ни происходящее.
  4. Не ной. Нытьё дискредитирует вас в глазах окружающих, и они будут считать, что на вас нельзя положиться.
  5. Не бери деньги у мудаков. Деньги всегда связаны с доверием и создают ожидания. Поэтому не берите деньги у клиентов, которым вы не доверяете.
  6. Учись.
  7. Не ссы. Меняйте профессию, открывайте собственный бизнес и заводите детей даже тогда, когда кажется, что уже слишком поздно
  8. Путешествуй.
  9. Помни. Человеческая память ограничена, поэтому чтобы сохранить воспоминания, используйте подручные приспособления. Например, ведите записи, сохраняйте важную переписку, переносите данные из старого компьютера на новый
  10. Мечтай. Делите свои мечты с другими людьми: путешествуйте с ними, делайте совместные проекты. Тогда ваша мечта станет мечтой тех, с кем вы ею поделились.

Это полная запись выступления.

Покажите улучшение градиентом

Градиент цветов традиционно используют для изображения плавных отличий каких-либо признаков.

Широтный градиент распределения окраски птиц. Cooney et al., 2002, fig. 2

Он хорошо отображает динамику распределения значений. Но с его помощью также можно показать какое-то улучшение. Для этого объекты с начальными (худшими) параметрами отметьте самым тусклым цветом. Далее постепенно повышайте насыщенность цветов. Наилучший результат покажите самым насыщенным цветом.

Для примера на рисунке ниже ↓ изображено, как улучшается форма биологических объектов при использовании все большего и большего числа параметров — гармоник эллиптического преобразования Фурье.

Самый светлый серый цвет раскрашивает примитивные эллиптические формы, восстановленные из одной гармоники (второй ряд), а насыщенный черный (последний ряд) — наилучшие формы, восстановленные из 32 гармоник, которые практически не отличаются от исходных. Градиент серого иллюстрирует поэтапное восстановление исходных форм.

А на следующем рисунке ↓ изображен тот же процесс, но без использования градиента.

Очевидно, что градиент лучше передает динамику процесса.

Подписывайте масштабные отрезки

Держите строй. Правила поведения на ВДНХ. 2020 год

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

Увеличено в × раз

Когда автор четко понимал, какого размера будет иллюстрация после печати, под ней писали, во сколько раз увеличен тот или иной объект.

Для понимания истинного размера, необходимо было измерить объект линейкой и разделить на приведенное число. То есть авторы связывали масштаб объекта с конкретным размером иллюстрации.

У каждого рисунка свое увеличение. Koppen, 1975

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

Сейчас подобный способ обозначения масштаба — моветон.

Масштаб 10 мкм

По мнению Платона эйдосы существуют вне времени, но приходят в свое время. Поэтому со временем иллюстраторы поняли, что вместо увеличения лучше нарисовать масштабный отрезок известной длины.

Длины отрезков подписаны рядом. Florin, 1957. ПДФ

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

Много масштабных отрезков, но все имеют одинаковую длину — 10 мкм. Sterrenburg, 1991

Удобство чтения рисунка от этого сильно пострадало.

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

У каждого рисунок свой отрезок и отдельная подпись в легенде. Benico et al., 2019

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

Легенда содержит шесть длин масштабных отрезков. Almeida et al., 2016
Здесь пять длин масштабов, но разобраться где-какая — очень сложно. Генкал и Ярушина, 2018

Не делайте так.

Пишите длину около масшабного отрезка

Авторы и редакции журналов, которые заботятся о читателе, подписывают длину рядом с отрезком.

Поступайте также.

Выводы

Масштабный отрезок — самое важное обозначение на изображениях микроорганизмов. Только он позволяет понять истинный размер бактерии, водоросли, клетки или простейшего. Поэтому длину масштабного отрезка читатель должен считывать мгновенно, сразу, с листа. Позаботьтесь о читателе — укажите размер рядом с отрезком.

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

Выровнять шеренги. Правила поведения на ВДНХ. 2020

Сделай сам

Повторное использование чужих приемов — это нормально

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

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

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

Дополнено через пару месяцев.
Однако мой подход старомоден и в будущем перейду на повторное использование чужих приемов. Ибо любой код когда-нибудь кем-нибудь будет написан, будет написан хорошо и будет доступен всем. Незачем отвергать хорошие вещи.

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

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

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

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

Буду в Минске 23-28 августа на 17-й Диатомовой школе с лекцией об оформлении биологических иллюстраций

23 августа буду выступать в Минске на Диатомовой школе. Буду рассказывать о правилах оформления биологических иллюстраций.

Обычно делают как слева, а надо — как справа

Так, на любой биологической иллюстрации, где есть масштабный отрезок, длина отрезка должна быть написана рядом с ним.

Запомнить это простое правило поможет картинка-мотиватор, которую выпустили работники ВДНХ. На ней четко прописана необходимая дистанция.

Правила поведения на ВДНХ во время карантина. Волдподиум

О прочих правилах расскажу на лекции. Презентацию лекции планирую выложить в онлайн. Кому интересно, ставьте лайки или пишите комментарии.


Первая часть серии заметок:
Подписывайте масштабные отрезки


Приемы программирования. Вернуть вектор

Иногда функция должна вернуть не одно, а несколько значений. Например флаг успеха или неудачи, несколько найденных параметров и массив. Фактически она возвращает векторный результат.

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

// Здесь ожидаю два параметра и двумерный массив, а функция возвращает флаг успеха-неудачи.
function navalniy( 
    source_data : TVector; var temperature : real; var blood_pressure : real; var spy_data : TVector
) : boolean;

Теперь я просто получаю один векторный результат.

function navalniy( source_data : TVector ) : TVector;

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


spy_data = navalniy( source_data );
if (spy_data[0][0] == 0) {
  alert(‘Явка провалена. Немедленно уходить!’);
  exit();
} else {
  temperature = spy_data[0][1];
  blood_pressure = spy_data[0][2];
  list_of_comrades = (spy_data[1], …, spy_data[M]);
  // Все в порядке, продолжаем готовить революцию
  // …
}

Единственное, при таком подходе нужно следить, чтобы размерность второй координаты массива (resulted_array[•][×]) была не меньше размерности ожидаемых дополнительных параметров (param{i}). В противном случае параметры следует вернуть в нескольких начальных компонентах ветора-результата.


spy_data = navalniy( source_data );
if (spy_dat[0][0] > 0) {
  temperature =spy_dat[0][1];
  blood_pressure = spy_dat[0][2];
  leukocytes = spy_datt[1][0];
  hemoglobin = spy_dat[1][1];
  erythrocytes = spy_dat[1][2];
  // Возвращенный массив начинается с N-ой компоненты вектора-результата
  list_of_comrades = (spy_dat[N], …, spy_dat[M]);
  // …
}

Векторы — это сила.

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

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

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

konstituciya.php → ./system/konstituciya.php

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

php_value include_path ".:/home/system"

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

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

Удачи.

Приемы программирования. Залить файлы на сервер

Облачные сервисы предлагают загрузить файлы на виртуальный диск при помощью интерфейса. Тащишь группу файлов, бросаешь в окно и они понемногу загружаются, а сервис выдает красивые прогресс-бары. При этом внутри кипит работа: сервис проверяет формат и размер файлов, следит за устойчивой передачей и рисует прогресс-бары, по завершению выдает сообщения, заносит данные в базу данных и размещает файлы в надежном месте.

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

Именно так я тестирую «Фотосистематизатор».

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

Приемы программирования. Ненужный файл с кодом не удаляю, а переименовываю

Бывает, что файл с фрагментом кода уже не нужен. Например потому, что код из него переписан, усовершенствован и перенесен в другой файл. Тогда такой файл я сразу не удаляю, а приписываю к нему приставку ’del-’.

После тестирую, нет ли ошибок и все ли работает правильно. Потом жду несколько дней и только после этого бесповоротно удаляю файл.

Как быстро закомментировать блоки кода

Блок — это фрагмент кода заключенный в условный оператор или цикл.

if (push_index > 0 ) {
  // Блок кода
}

for (i=0; i < row_of_areolae.length-1; i++) {
  // Блок кода
}

while (level < maximal_level) {
  // Блок кода
}

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

if (false && push_index > 0 ) {
  // Блок кода
}

for (i=0; false && i < row_of_areolae.length-1; i++) {
  // Блок кода
}

while (false && level < maximal_level) {
  // Блок кода
}

Когда фрагмент кода не содержится в цикле или условном операторе, но его нужно то закомментировать, то оставить — принудительно заключаем его в блок. Потом меняем условие блока на «Истину» или «Ложь».

// Фрагмент выполняется
if (true) {
	angle = g_sectors[i].fi[1] - ksi;
	k = new_areolae.length-2;
	while ((k>push_index) && (angle>=g_sectors[i].fi[0])) {
		new_areolae[k][3] = angle;
		new_areolae[k][0] = Math.cos(angle)*level_po;
		new_areolae[k][1] = Math.sin(angle)*level_po;
		//pivot_areola = new_areolae[k];
		angle -= ksi;
		k--;					
	}
}

// Фрагмент не выполняется
if (false) {
	angle = g_sectors[i].fi[1] - ksi;
	k = new_areolae.length-2;
	while ((k>push_index) && (angle>=g_sectors[i].fi[0])) {
		new_areolae[k][3] = angle;
		new_areolae[k][0] = Math.cos(angle)*level_po;
		new_areolae[k][1] = Math.sin(angle)*level_po;
		//pivot_areola = new_areolae[k];
		angle -= ksi;
		k--;					
	}
}

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

/*
	angle = g_sectors[i].fi[1] - ksi;
	k = new_areolae.length-2;
	while ((k>push_index) && (angle>=g_sectors[i].fi[0])) {
		new_areolae[k][3] = angle;
		new_areolae[k][0] = Math.cos(angle)*level_po;
		new_areolae[k][1] = Math.sin(angle)*level_po;
		//pivot_areola = new_areolae[k];
		angle -= ksi;
		k--;					
	}
*/

Очевидно, что дописать true или false к условию быстрее и удобнее, чем окружить или освободить блок от символов комментария.

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

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

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

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

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

// …
?>

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

 49   2017   прием   программирование   ПХП   типограф