<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0"
  xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
  xmlns:atom="http://www.w3.org/2005/Atom">

<channel>

<title>Математик среди биологов: заметки с тегом прием</title>
<link>https://antonlyakh.ru/blog/tags/priem/</link>
<description>Я немного умею складывать, но от вычитания у меня всегда кружится голова</description>
<author>Антон Лях</author>
<language>ru</language>
<generator>E2 (v3559; Aegea)</generator>

<itunes:owner>
<itunes:name>Антон Лях</itunes:name>
<itunes:email></itunes:email>
</itunes:owner>
<itunes:subtitle>Я немного умею складывать, но от вычитания у меня всегда кружится голова</itunes:subtitle>
<itunes:image href="" />
<itunes:explicit></itunes:explicit>

<item>
<title>Десять принципов Артема Горбунова</title>
<guid isPermaLink="false">480</guid>
<link>https://antonlyakh.ru/blog/all/deyast-principov-artema-gorbunova/</link>
<pubDate>Sun, 12 Nov 2023 15:35:24 +0300</pubDate>
<author>Антон Лях</author>
<comments>https://antonlyakh.ru/blog/all/deyast-principov-artema-gorbunova/</comments>
<description>
&lt;p&gt;Артем Горбунов — дизайнер, основатель и руководитель &lt;a href="https://bureau.ru/"&gt;Бюро Горбунова&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Вот его жизненные принципы.&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;&lt;i&gt;&lt;b&gt;Прямо сейчас.&lt;/b&gt;&lt;/i&gt; Если перед вами стоит сложная задача и вы не знаете, как к ней подступиться, задайте себе вопрос: Что мне мешает достичь цели прямо сейчас? При таком подходе вы начинаете думать о главной проблеме, которая мешает добиться результата.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Не авось.&lt;/b&gt; Если сделать что-то на авось, есть два варианта развития событий. Старший товарищ заметит вашу ошибку и наругает вас. Или, что ещё хуже, вы сделаете проект, запустите его, он начнёт работать и что-то в нём пойдёт не так. Поэтому не полагайтесь на авось.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Я виноват.&lt;/b&gt; Когда что-то идёт не так, хочется обвинять других. Но в этом случае вы перекладываете ответственность на обстоятельства. Если вы признаёте вину, то можете влиять ни происходящее.&lt;/li&gt;
&lt;li&gt;&lt;i&gt;&lt;b&gt;Не ной.&lt;/b&gt;&lt;/i&gt; Нытьё дискредитирует вас в глазах окружающих, и они будут считать, что на вас нельзя положиться.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Не бери деньги у мудаков.&lt;/b&gt; Деньги всегда связаны с доверием и создают ожидания. Поэтому не берите деньги у клиентов, которым вы не доверяете.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Учись.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;i&gt;&lt;b&gt;Не ссы.&lt;/b&gt;&lt;/i&gt; Меняйте профессию, открывайте собственный бизнес и заводите детей даже тогда, когда кажется, что уже слишком поздно&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Путешествуй.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Помни.&lt;/b&gt; Человеческая память ограничена, поэтому чтобы сохранить воспоминания, используйте подручные приспособления. Например, ведите записи, сохраняйте важную переписку, переносите данные из старого компьютера на новый&lt;/li&gt;
&lt;li&gt;&lt;i&gt;&lt;b&gt;Мечтай.&lt;/b&gt;&lt;/i&gt; Делите свои мечты с другими людьми: путешествуйте с ними, делайте совместные проекты. Тогда ваша мечта станет мечтой тех, с кем вы ею поделились.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Это &lt;a href="https://www.youtube.com/watch?v=ZMeWeU1Y6PI"&gt;полная запись выступления&lt;/a&gt;.&lt;/p&gt;
&lt;div class="e2-text-video"&gt;
&lt;iframe src="https://www.youtube.com/embed/ZMeWeU1Y6PI" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;
</description>
</item>

<item>
<title>Покажите улучшение градиентом</title>
<guid isPermaLink="false">473</guid>
<link>https://antonlyakh.ru/blog/all/pokazat-uluchshenie-gradientom/</link>
<pubDate>Mon, 07 Aug 2023 15:30:08 +0300</pubDate>
<author>Антон Лях</author>
<comments>https://antonlyakh.ru/blog/all/pokazat-uluchshenie-gradientom/</comments>
<description>
&lt;p&gt;Градиент цветов традиционно используют для изображения плавных отличий каких-либо признаков.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://antonlyakh.ru/blog/pictures/Cooney-et-al-(2002)-Fig-2---Avian-color-latitudinal-gradient.png" width="1000" height="625" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Широтный градиент распределения окраски птиц. &lt;a href="https://www.nature.com/articles/s41559-022-01714-1/figures/2"&gt;Cooney et al., 2002, fig. 2&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Он хорошо отображает динамику распределения значений. Но с его помощью также можно показать какое-то улучшение. Для этого объекты с начальными (худшими) параметрами отметьте самым тусклым цветом. Далее постепенно повышайте насыщенность цветов. Наилучший результат покажите самым насыщенным цветом.&lt;/p&gt;
&lt;p&gt;Для примера на рисунке ниже ↓ изображено, как улучшается форма биологических объектов при использовании все большего и большего числа параметров — гармоник эллиптического преобразования Фурье.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://antonlyakh.ru/blog/pictures/Kontury-(gotovye)---vosstanovlenie-po-garmonikam.png" width="1000" height="687" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Самый светлый серый цвет раскрашивает примитивные эллиптические формы, восстановленные из одной гармоники (второй ряд), а насыщенный черный (последний ряд) — наилучшие формы, восстановленные из 32 гармоник, которые практически не отличаются от исходных. Градиент серого иллюстрирует поэтапное восстановление исходных форм.&lt;/p&gt;
&lt;p&gt;А на следующем рисунке ↓ изображен тот же процесс, но без использования градиента.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://antonlyakh.ru/blog/pictures/Kontury-(gotovye)---vosstanovlenie-po-garmonikam-cvet.png" width="1000" height="687" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Очевидно, что градиент лучше передает динамику процесса.&lt;/p&gt;
</description>
</item>

<item>
<title>Подписывайте масштабные отрезки</title>
<guid isPermaLink="false">462</guid>
<link>https://antonlyakh.ru/blog/all/podpisyvayte-masshtabnye-otrezki/</link>
<pubDate>Sat, 05 Nov 2022 23:27:27 +0300</pubDate>
<author>Антон Лях</author>
<comments>https://antonlyakh.ru/blog/all/podpisyvayte-masshtabnye-otrezki/</comments>
<description>
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://antonlyakh.ru/blog/pictures/vdnh-motivator-a.png" width="800" height="576" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Держите строй. &lt;a href="https://vdnh.ru/news/4231/"&gt;Правила поведения на ВДНХ&lt;/a&gt;. 2020 год&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Изучим обозначения масштаба на рисунках и фотографиях микроводорослей, случайно выбранных из статей 1950-2020-х годов.&lt;/p&gt;
&lt;h2&gt;Увеличено в × раз&lt;/h2&gt;
&lt;p&gt;Когда автор четко понимал, какого размера будет иллюстрация после печати, под ней писали, во сколько раз увеличен тот или иной объект.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://antonlyakh.ru/blog/pictures/Knudson_(1952)_fig_1.png" width="600" height="705" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;&lt;a href="https://doi.org/10.1093/oxfordjournals.aob.a083325"&gt;Knudson, 1952&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Для понимания истинного размера, необходимо было измерить объект линейкой и разделить на приведенное число. То есть авторы связывали масштаб объекта с конкретным размером иллюстрации.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://antonlyakh.ru/blog/pictures/Koppen_(1975)_figs_11-17.png" width="800" height="710" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;У каждого рисунка свое увеличение. &lt;a href="https://doi.org/10.1111/j.1529-8817.1975.tb02774.x"&gt;Koppen, 1975&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;В цифровую эпоху, когда размер оцифрованного листа может быть любым, а его реальный размер в миллиметрах не известен, такой прием позволяет только приблизительно оценить истинные размеры изображенных организмов.&lt;/p&gt;
&lt;p&gt;Сейчас подобный способ обозначения масштаба — моветон.&lt;/p&gt;
&lt;h2&gt;Масштаб 10 мкм&lt;/h2&gt;
&lt;p&gt;По мнению Платона эйдосы существуют вне времени, но приходят в свое время. Поэтому со временем иллюстраторы поняли, что вместо увеличения лучше нарисовать масштабный отрезок известной длины.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://antonlyakh.ru/blog/pictures/Florin_(1975)_fig-22.png" width="600" height="602" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Длины отрезков подписаны рядом. Florin, 1957. &lt;a href="https://www.diva-portal.org/smash/get/diva2:565461/FULLTEXT01.pdf"&gt;&lt;tt&gt;ПДФ&lt;/tt&gt;&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Однако, по требованиям редакций, из-за технических сложностей или по иным причинам, но длину масштабного отрезка стали писать в легенде.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://antonlyakh.ru/blog/pictures/Sterrenburg_(1991)_figs_11-19.png" width="800" height="828" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Много масштабных отрезков, но все имеют одинаковую длину — 10 мкм. &lt;a href="https://doi.org/10.1080/0269249X.1991.9705182"&gt;Sterrenburg, 1991&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Удобство чтения рисунка от этого сильно пострадало.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://antonlyakh.ru/blog/pictures/Geisen_(2003)_plate-6.png" width="800" height="529" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;&lt;a href="https://doi.org/10.1007/978-3-662-06278-4_13"&gt;Geisen et al., 2003&lt;/a&gt;. Plate 6.&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Потому что для определения масштаба приходится переводить взгляд с фотографии на легенду и там выискивать, какой масштаб соответствует фото с заданным номером, а затем — возвращаться назад.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://antonlyakh.ru/blog/pictures/Benico_et_al_(2019)_figs_1-6.png" width="800" height="730" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;У каждого рисунок свой отрезок и отдельная подпись в легенде. &lt;a href="https://doi.org/10.1080/00318884.2019.1601948"&gt;Benico et al., 2019&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Когда масштабных отрезков много, они отличаются длинной и в их расположении нет порядка — поиск в легенде нужной длины превращается в мучение.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://antonlyakh.ru/blog/pictures/Almeida_et_al_(2016)_figs_73-84.png" width="800" height="616" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Легенда содержит шесть длин масштабных отрезков. &lt;a href="https://doi.org/10.11646/phytotaxa.246.3.1"&gt;Almeida et al., 2016&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://antonlyakh.ru/blog/pictures/Genkal_Yarushina_(2018)_table.png" width="800" height="668" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Здесь пять длин масштабов, но разобраться где-какая — очень сложно. &lt;a href="https://elibrary.ru/item.asp?id=37077346"&gt;Генкал и Ярушина, 2018&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Не делайте так.&lt;/p&gt;
&lt;h2&gt;Пишите длину около масшабного отрезка&lt;/h2&gt;
&lt;p&gt;Авторы и редакции журналов, которые заботятся о читателе, подписывают длину рядом с отрезком.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://antonlyakh.ru/blog/pictures/Lai_et_al_(2019)_fig_3.png" width="800" height="622" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;&lt;a href="https://doi.org/10.7717/peerj.7238"&gt;Lai et al., 2019&lt;/a&gt;. Fig. 3&lt;/div&gt;
&lt;/div&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://antonlyakh.ru/blog/pictures/Wetzel_et_al_(2017)_figs_97-108.png" width="800" height="740" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;&lt;a href="https://doi.org/10.1127/1438-9134/2017/209"&gt;Wetzel et al., 2017&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Поступайте также.&lt;/p&gt;
&lt;h2&gt;Выводы&lt;/h2&gt;
&lt;p&gt;Масштабный отрезок — самое важное обозначение на изображениях микроорганизмов. Только он позволяет понять истинный размер бактерии, водоросли, клетки или простейшего. Поэтому длину масштабного отрезка читатель должен считывать мгновенно, сразу, с листа. Позаботьтесь о читателе — укажите размер рядом с отрезком.&lt;/p&gt;
&lt;p&gt;Если вы полагаете, что требования редакции так делать не позволяют, все равно сделайте удобно читателю наперекор требованиям. Редактор тоже человек. Увидев, что такой прием лучше принятого в редакции, скорее всего он его пропустит.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://antonlyakh.ru/blog/pictures/vdnh-motivator-b.png" width="800" height="533" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Выровнять шеренги. &lt;a href="https://vdnh.ru/news/4231/"&gt;Правила поведения на ВДНХ&lt;/a&gt;. 2020&lt;/div&gt;
&lt;/div&gt;
</description>
</item>

<item>
<title>Сделай сам</title>
<guid isPermaLink="false">460</guid>
<link>https://antonlyakh.ru/blog/all/sdelay-sam/</link>
<pubDate>Tue, 18 Oct 2022 16:40:00 +0300</pubDate>
<author>Антон Лях</author>
<comments>https://antonlyakh.ru/blog/all/sdelay-sam/</comments>
<description>
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://antonlyakh.ru/blog/pictures/Sdelay-sam.png" width="800" height="569" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Повторное использование чужих приемов — это нормально&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Я сам пишу большинство программ с использованием своих библиотек. То есть, конечно, у меня есть некие базовые библиотеки, однажды найденные на просторах сети, но этим дело и ограничивается.&lt;/p&gt;
&lt;p&gt;Когда у меня есть задача написать программу, я сажусь и пишу ее сам: продумываю алгоритм, интерфейс, пишу код, тестирую, правлю, опять тестирую и выпускаю релиз.&lt;/p&gt;
&lt;p&gt;Я не люблю ковыряться в чужом коде или разбираться в документации чьей-то библиотеки, так как при этом ничего не получаю взамен, кроме усталости и отупения.&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Дополнено через пару месяцев.&lt;/i&gt;&lt;br /&gt;
Однако мой подход старомоден и в будущем перейду на повторное использование чужих приемов. Ибо любой код когда-нибудь кем-нибудь будет написан, будет написан хорошо и будет доступен всем. Незачем отвергать хорошие вещи.&lt;/p&gt;
</description>
</item>

<item>
<title>Прием программирования: Вовремя остановиться</title>
<guid isPermaLink="false">438</guid>
<link>https://antonlyakh.ru/blog/all/priem-programmirovaniya-vovremya-ostanovitsya/</link>
<pubDate>Tue, 31 Aug 2021 22:13:58 +0300</pubDate>
<author>Антон Лях</author>
<comments>https://antonlyakh.ru/blog/all/priem-programmirovaniya-vovremya-ostanovitsya/</comments>
<description>
&lt;p&gt;Иногда я пишу одноразовый код, который, например, что-то переносит из файла в базу данных. Этот код мне понадобиться один раз, но удалять его после использования жалко.&lt;/p&gt;
&lt;p&gt;Для того, чтобы код нельзя было больше выполнить, я внедряю в него оператор die().&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://antonlyakh.ru/blog/pictures/program-die.png" width="800" height="361" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Главное — вовремя остановиться.&lt;/p&gt;
</description>
</item>

<item>
<title>Буду в Минске 23-28 августа на 17-й Диатомовой школе с лекцией об оформлении биологических иллюстраций</title>
<guid isPermaLink="false">436</guid>
<link>https://antonlyakh.ru/blog/all/budu-s-lekciey-na-17-y-diatomovoy-shkole-v-minske-23-28-avgusta/</link>
<pubDate>Wed, 18 Aug 2021 22:55:54 +0300</pubDate>
<author>Антон Лях</author>
<comments>https://antonlyakh.ru/blog/all/budu-s-lekciey-na-17-y-diatomovoy-shkole-v-minske-23-28-avgusta/</comments>
<description>
&lt;p&gt;23 августа буду выступать в Минске на Диатомовой школе. Буду рассказывать о правилах оформления биологических иллюстраций.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://antonlyakh.ru/blog/pictures/Ris---Nadpisi-na-foto-(rus-i-angl).png" width="2000" height="1300" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Обычно делают как слева, а надо — как справа&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Так, на любой биологической иллюстрации, где есть масштабный отрезок, длина отрезка должна быть написана рядом с ним.&lt;/p&gt;
&lt;p&gt;Запомнить это простое правило поможет картинка-мотиватор, которую выпустили работники ВДНХ. На ней четко прописана необходимая дистанция.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://antonlyakh.ru/blog/pictures/Motivator-VDNH---1.5-m.png" width="800" height="533" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Правила поведения на ВДНХ во время карантина. &lt;a href="https://worldpodium.ru/news/vdnh-vypustila-motivator-o-pravilah-povedeniya-vo-vremya-karantina"&gt;Волдподиум&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;О прочих правилах расскажу на лекции. Презентацию лекции планирую выложить в онлайн. Кому интересно, ставьте лайки или пишите комментарии.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Первая часть серии заметок:&lt;br /&gt;
&lt;a href="http://antonlyakh.ru/blog/all/podpisyvayte-masshtabnye-otrezki/"&gt;Подписывайте масштабные отрезки&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
</description>
</item>

<item>
<title>Приемы программирования. Вернуть вектор</title>
<guid isPermaLink="false">391</guid>
<link>https://antonlyakh.ru/blog/all/priemy-programmirovaniya-vernut-vektor/</link>
<pubDate>Wed, 16 Sep 2020 18:29:33 +0300</pubDate>
<author>Антон Лях</author>
<comments>https://antonlyakh.ru/blog/all/priemy-programmirovaniya-vernut-vektor/</comments>
<description>
&lt;p&gt;Иногда функция должна вернуть не одно, а несколько значений. Например флаг успеха или неудачи, несколько найденных параметров и массив. Фактически она возвращает векторный результат.&lt;/p&gt;
&lt;p&gt;Раньше для получения векторного результата я передавал несколько переменных по ссылке и ждал булево значение функции.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;// Здесь ожидаю два параметра и двумерный массив, а функция возвращает флаг успеха-неудачи.
function navalniy( 
    source_data : TVector; var temperature : real; var blood_pressure : real; var spy_data : TVector
) : boolean;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Теперь я просто получаю один векторный результат.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;function navalniy( source_data : TVector ) : TVector;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Первый компонент вектора содержит флаг успеха и вычисленные скалярные параметры, остальные — заполненный массив.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="cpp"&gt;
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]);
  // Все в порядке, продолжаем готовить революцию
  // …
}
&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;Единственное, при таком подходе нужно следить, чтобы размерность второй координаты массива (resulted_array[•][×]) была не меньше размерности ожидаемых дополнительных параметров (param{i}). В противном случае параметры следует вернуть в нескольких начальных  компонентах ветора-результата.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="cpp"&gt;
spy_data = navalniy( source_data );
if (spy_dat[0][0] &gt; 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]);
  // …
}
&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;Векторы — это сила.&lt;/p&gt;
</description>
</item>

<item>
<title>Приемы веб-программирования. Разрешить Апачу сначала искать файлы в текущем каталоге</title>
<guid isPermaLink="false">385</guid>
<link>https://antonlyakh.ru/blog/all/priemy-veb-programmirovaniya-razreshit-apachu-snachala-iskat-fay/</link>
<pubDate>Wed, 10 Jun 2020 16:13:07 +0300</pubDate>
<author>Антон Лях</author>
<comments>https://antonlyakh.ru/blog/all/priemy-veb-programmirovaniya-razreshit-apachu-snachala-iskat-fay/</comments>
<description>
&lt;p&gt;Памятка тем, кто (до сих пор) руками пишет веб-движки на ПХП.&lt;/p&gt;
&lt;p&gt;У вас есть два файла с одинаковым названием ’konstituciya.php’ в текущем и каком-то системном каталоге. Файл в системном каталоге делает основную работу, например, выводит перечень статей конституции. Файл в текущем каталоге устанавливает локальные настройки, например, вносит в конституцию поправки, а потом вызывает файл из системного каталога. Чтобы поправки вступили в силу, необходимо, чтобы первым был вызван файл из текущего каталога. Вот так:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;konstituciya.php → ./system/konstituciya.php&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Чтобы установить такую последовательность вызовов, в .htaccess в списке путей первой поставьте точку, а потом перечислите прочие каталоги:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;php_value include_path &amp;quot;.:/home/system&amp;quot;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Тогда код выполнится правильно:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;// Сначала вызовет файл из текущего каталога с поправками, а потом системный файл с основными законами
   include_once &amp;quot;konstituciya.php&amp;quot;;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Удачи.&lt;/p&gt;
</description>
</item>

<item>
<title>Приемы программирования. Залить файлы на сервер</title>
<guid isPermaLink="false">352</guid>
<link>https://antonlyakh.ru/blog/all/priemy-programmirovaniya-zalit-fayly-na-server/</link>
<pubDate>Tue, 17 Mar 2020 17:47:11 +0300</pubDate>
<author>Антон Лях</author>
<comments>https://antonlyakh.ru/blog/all/priemy-programmirovaniya-zalit-fayly-na-server/</comments>
<description>
&lt;p&gt;Облачные сервисы предлагают загрузить файлы на виртуальный диск при помощью интерфейса. Тащишь группу файлов, бросаешь в окно и они понемногу загружаются, а сервис выдает красивые прогресс-бары. При этом внутри кипит работа: сервис проверяет формат и размер файлов, следит за устойчивой передачей и рисует прогресс-бары, по завершению выдает сообщения, заносит данные в базу данных и размещает файлы в надежном месте.&lt;/p&gt;
&lt;p&gt;Такой сценарий нужен, когда виртуальным диском пользуются десятки пользователей. А для тестирования небольших проектов, когда группа пользователей ограничена двумя-тремя персонами, рекомендую закачивать файлы в выделенный каталог сервера. По Эс-Эс-Аш или ФТП, например. После, специальный скрипт сканирует каталог, обрабатывает файлы, запоминает метаданные в таблицах и реализует дальнейший интерфейс.&lt;/p&gt;
&lt;p&gt;Именно так я тестирую «Фотосистематизатор».&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://antonlyakh.ru/blog/pictures/fotosistema-screen-1.png" width="800" height="526" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Фотосистематизатор берет фотографии прямо из каталога, а пользователь закачивает их туда напрямую, без интерфейсных наворотов&lt;/div&gt;
&lt;/div&gt;
</description>
</item>

<item>
<title>Приемы программирования. Ненужный файл с кодом не удаляю, а переименовываю</title>
<guid isPermaLink="false">339</guid>
<link>https://antonlyakh.ru/blog/all/priemy-programmirovaniya-nenuzhny-fayl-s-kodom-srazu-ne-udalyayu/</link>
<pubDate>Wed, 26 Feb 2020 00:39:33 +0300</pubDate>
<author>Антон Лях</author>
<comments>https://antonlyakh.ru/blog/all/priemy-programmirovaniya-nenuzhny-fayl-s-kodom-srazu-ne-udalyayu/</comments>
<description>
&lt;p&gt;Бывает, что файл с фрагментом кода уже не нужен. Например потому, что код из него переписан, усовершенствован и перенесен в другой файл. Тогда такой файл я сразу не удаляю, а приписываю к нему приставку &lt;i&gt;’del-’&lt;/i&gt;.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://antonlyakh.ru/blog/pictures/del-prefix.png" width="228" height="121" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;После тестирую, нет ли ошибок и все ли работает правильно. Потом жду несколько дней и только после этого бесповоротно удаляю файл.&lt;/p&gt;
</description>
</item>

<item>
<title>Как быстро закомментировать блоки кода</title>
<guid isPermaLink="false">260</guid>
<link>https://antonlyakh.ru/blog/all/kak-bystro-zakommentirovat-bloki-koda/</link>
<pubDate>Fri, 01 Feb 2019 00:27:16 +0300</pubDate>
<author>Антон Лях</author>
<comments>https://antonlyakh.ru/blog/all/kak-bystro-zakommentirovat-bloki-koda/</comments>
<description>
&lt;p&gt;Блок — это фрагмент кода заключенный в условный оператор или цикл.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;if (push_index &amp;gt; 0 ) {
  // Блок кода
}

for (i=0; i &amp;lt; row_of_areolae.length-1; i++) {
  // Блок кода
}

while (level &amp;lt; maximal_level) {
  // Блок кода
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Чтобы быстро исключить блок кода из потока программы, достаточно к условию дописать выражение «Ложь и».&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;if (false &amp;amp;&amp;amp; push_index &amp;gt; 0 ) {
  // Блок кода
}

for (i=0; false &amp;amp;&amp;amp; i &amp;lt; row_of_areolae.length-1; i++) {
  // Блок кода
}

while (false &amp;amp;&amp;amp; level &amp;lt; maximal_level) {
  // Блок кода
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Когда фрагмент кода не содержится в цикле или условном операторе, но его нужно то закомментировать, то оставить — принудительно заключаем его в блок. Потом меняем условие блока на «Истину» или «Ложь».&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;// Фрагмент выполняется
if (true) {
	angle = g_sectors[i].fi[1] - ksi;
	k = new_areolae.length-2;
	while ((k&amp;gt;push_index) &amp;amp;&amp;amp; (angle&amp;gt;=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&amp;gt;push_index) &amp;amp;&amp;amp; (angle&amp;gt;=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--;					
	}
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Чтобы закомментировать тот же фрагмент кода, надо поставить символы комментария в его начале и конце.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;/*
	angle = g_sectors[i].fi[1] - ksi;
	k = new_areolae.length-2;
	while ((k&amp;gt;push_index) &amp;amp;&amp;amp; (angle&amp;gt;=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--;					
	}
*/&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Очевидно, что дописать true или false к условию быстрее и удобнее, чем окружить или освободить блок от символов комментария.&lt;/p&gt;
</description>
</item>

<item>
<title>Быстро типографируем текст перед показом на странице</title>
<guid isPermaLink="true">https://antonlyakh.ru/blog/all/bystro-tipografiruem-tekst-pered-pokazom-na-stranice/</guid>
<link>https://antonlyakh.ru/blog/all/bystro-tipografiruem-tekst-pered-pokazom-na-stranice/</link>
<pubDate>Tue, 24 Oct 2017 00:31:06 +0300</pubDate>
<author>Антон Лях</author>
<comments>https://antonlyakh.ru/blog/all/bystro-tipografiruem-tekst-pered-pokazom-na-stranice/</comments>
<description>
&lt;p&gt;Перед показом текста на странице его надо обработать по правилам типографики. Это может сделать «&lt;a href="https://www.artlebedev.ru/typograf/"&gt;Типограф&lt;/a&gt;» Студии Лебедева, «&lt;a href="https://github.com/typograf"&gt;Типограф&lt;/a&gt;» Дениса Селезнева или свой движок.&lt;/p&gt;
&lt;p&gt;Если текст написан и не меняется, то  его не надо все время типографить. Достаточно оттипографить один раз, сохранить результат и выводить его до тех пор, пока текст снова не изменится.&lt;/p&gt;
&lt;p&gt;Для этого использую такой механизм.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Создаю исходный текст и сохраняют его в файле с расширением «in».&lt;/li&gt;
&lt;li&gt;В коде страницы вызываю функцию &lt;nobr style="font-family: SegoeUI"&gt;typo_file( ’имя_файла_с_текстом’ )&lt;/nobr&gt;, которая выводит на страницу оттипографированый текст. Имя файла указывается &lt;i&gt;без расширения.&lt;/i&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Функция &lt;nobr style="font-family: SegoeUI"&gt;typo_file( $filename )&lt;/nobr&gt; делает следующее:&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Ищет файл &lt;nobr style="font-family: SegoeUI"&gt;$filename&lt;/nobr&gt; с расширением «in».&lt;/li&gt;
&lt;li&gt;Ищет файл с таким же именем и расширением «out».&lt;/li&gt;
&lt;li&gt;Сравнивает даты модификации файлов.&lt;/li&gt;
&lt;li&gt;Если «out» изменен позже, чем «in», возвращает содержимое «out».&lt;/li&gt;
&lt;li&gt;В противном случае типографит содержимое «in», записывает его в «out» и возвращает результат в основной поток.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Код функции &lt;nobr style="font-family: SegoeUI"&gt;&lt;b&gt;typo_file&lt;/b&gt;&lt;/nobr&gt; на ПХП:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;&amp;lt;?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 &amp;lt; $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;
}
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Функция &lt;nobr style="font-family: SegoeUI"&gt;&lt;b&gt;typo&lt;/b&gt;&lt;/nobr&gt; типографит текст удобным вам способом.&lt;/p&gt;
&lt;p&gt;Содержимое основной страницы выглядит так:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;&amp;lt;?php
// …

echo typo_file( ‘page_content’ );

// …
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Вместо файла с результатом, можно использовать базу данных. В нее заносить оттипографированный текст и время последнего изменения. Ключ для доступа к записи — имя файла.&lt;/p&gt;
</description>
</item>


</channel>
</rss>