Заметка для эйчаров

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

Потом отпускает. Я возвращаюсь в короткую счастливую жизнь. Но вот чего не могу понять, так это описания офиса в каждой второй вакансии. «Офис рядом с метро», «дружный коллектив», «возможность заниматься спортом на работе», «чай, кофе, печенюшки всегда в наличии». Что это за феерический бред?

Единственные критерии, по которым я оцениваю вакансию, это интересность задач, свобода действий и размер заработной платы. Причем последнее играет самую малую роль. Многие считают, что один и тот же фактор стимулирует и дестимулирует в зависимости от величины, но это не так. Просто ради денег человек в носу ковырять не станет. Но нищета — офигенный дестимулятор, который вынуждает бросить даже самую интересную работу.

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

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

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

Невнятный подкаст. Сезон 2. Выпуск 1. Зачем ковырять деревья

Экономика, генетика, тухлые яйца, сверхпроводники, сонные лемуры и этичные нейросети.

Абстрактное мышление

Я давно публикую свои богомерзкие заметки, каждый год наблюдая как падает наш уровень абстрактного мышления. Напишешь про то, как много времени мы тратим на ерунду — все думают, что это про разведение клещей. Напишешь про тоску в глазах — все думают, что это про СПИД и делецию в гене. Поговоришь с человеком про страх смерти — все решат, что я предлагаю удалить базу OpenStreetMap.

Некий человек сегодня спросил, могу ли я называть себя натуралистом если верю в реинкарнацию души? Ответ только один: современный натуралист-материалист, опираясь на знания, вынужден признать реинкарнацию. А все потому, что в стародавние времена у писаря завис гугл-транслейт и люди решили будто «душа» и «тело» — это два разных слова.

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

У Библии наверняка есть свое логичное объяснение. Только дебил может верить в историю про невидимого бородатого мужика, который сотворил Землю за семь дней. Но вполне допускаю, что в локальном регионе планеты могли происходить ощутимые события, которые протекали в семь этапов. Причем по описанию очень похоже на какие-то вулканические процессы с постепенным рассеиванием пепла и последующей первичной сукцессией.

Полагаю, вы поняли, что этот текст не про абстрактное мышление. Верно ведь?

fleur.js

Оценка кормовых угодий на JavaScript

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

Представим, что вы заимели в распоряжение некоторую площадь земли и намереваетесь распорядиться ей по хозяйски. Решив финансовые, кадастровые и прочие вопросы вы неизбежно придете к вопросу: «Какова земля по своим качествам?». Годится ли для посадки помидоров или кроме кривой сосны ничего не вырастет? Какой цемент выбрать для фундамента: исходя из сухой почвы или периодически подтопляемой? Почему у соседа вызревает полна жопа огурцов, а у вас дохнет последний подорожник? Потому, что в почве элементов не хватает или соседские коровы все вытоптали?

Когда участок мал, ответ познают органолептическим методом. Но что делать, если вам нужны точные результаты? Например, ваша сестра вышла замуж за премьер-министра и вы завладели миллионами гектаров угодий. Первая мысль — отобрать пробы почв из разных мест и отдать в физико-химическую лабораторию. Идея хороша, но есть три «но». Во-первых, это будет стоить безумных денег. Во-вторых, физико-химические свойства почвы постоянно меняются. Прошел дождь — и вот вам иное соотношение растворимых солей. Выглянуло солнце — изменилась влажность. В третьих, и это самое главное, вам необходимо знать не абсолютные концентрации микроэлементов, а то, насколько успешно они поглощаются растениями.

Логично оценить угодья по местным растениям. Если условные редька и одуванчик нуждаются в одинаковых условиях, значит поле одуванчиков подходит для редьки. Это примитивная, но верная мысль. Преимущество растений в длительном росте, который накапливает свойства территории за большой период. Кроме того, изучая растительность мы снижаем риск ошибки, связанной с бочкой Либиха.
Бочка Либиха

Бочка Либиха — принцип названный по фамилии немецкого профессора. В скучной экологической литературе он чаще упоминается как закон лимитирующего фактора. Наполним водой деревянную бочку, которую сколотили из досок разного размера. По заполнению, вода начнет вытекать через самую короткую доску. Наша редька будет дохнуть именно от самого проблемного элемента. Мы проверили все: азот, фосфор, калий, серу, железо и кучу других элементов — все в порядке. Но случайно забыли про марганец и вот наша условная редька уже в точечных пятнах хлороза тщетно пытается синтезировать аскорбиновую кислоту, дожидаясь малейшего повода для смерти. Условный одуванчик реагирует на всю совокупность физико-химических условий произрастания. Если он бодр и весел, за редьку можно не переживать.

Жизнь устроена сложнее наших условностей. Не бывает двух организмов, а уж тем более видов с одинаковыми требованиями к условиям обитания. «Что русскому хорошо, то немцу смерть» в переводе на экологический язык называется нормой реакции и выражается в кривой жизнедеятельности:
Кривая жизнедеятельности

Принцип влияния экологических факторов на организм выражается пословицей «Все хорошо в меру». Задача — сравнить между собой «меры» различных видов и применить к ним школьный принцип «меньше большего, больше меньшего». Если мы нашли одуванчик, значит условия жизни для одуванчика подходят. Если рядом с одуванчиком сныть, значит условия жизни подходят для одуванчика и сныти одновременно. Если мы собрали тридцать разных видов, значит условия подходят одновременно для каждого из них. Чем больше видов, тем уже диапазон факторов произрастания:
Сужение диапазона факторов произрастания

Теоретически, мы можем построить такие кривые для любого фактора окружающей среды (вопрос эмергентности опустим — это тема долгого и сложного разговора). Нас не волнует медианное значение влажности почв. Мы хотим знать, достаточно ли влаги растениям? Это не одно и тоже: весной воды хоть залейся, но растения живут в условиях физиологической сухости, поскольку не могут впитать воду из холодной почвы. Вопрос шкалирования («в каких единицах измерять») решается принципом канторово-пелевинской «сиськой в себе». Рисуем пустую стобалльную шкалу, после идем в самое сухое место, определяем найденные растения и вписываем их в левую часть шкалы. Потом идем в самое сырое место и вписываем местные растения в правую часть шкалы. После делаем несколько десятков тысяч описаний из разных мест и расставляем на шкале встреченные виды.

В одну из ночей опустите луч фонарика вертикально вниз. На землю ляжет тень от травы — проекция растений на плоскость. Если забыть, что луч бьет из одной точки или взять громадный прожектор, то площадь тени будет пропорциональна густоте растений. В геоботанике этот показатель называется проективным покрытием. Глазомерно он вычисляется как доля покрытой растениями территории. Сумма проективных покрытий всех видов больше общего покрытия травостоя, поскольку разные виды перекрывают друг друга. Псевдоматематики называют проективное покрытие вероятностью обнаружения вида в точке со случайными координатами или говорят о других диких концепциях, но на практике без инструментов никто не способен оценить густоту растений точнее 5-10 процентов (хоть все говорят, что могут), поэтому описание дополняют словами «единично», «незначительно» и прочей гуманитарной фигней.

Идя по градиенту влажности от сырого к сухому месту, вы встретите новые виды. Пока еще чахлые и редкие. Они едва выживают при такой влажности. Скоро этих растений станет больше. В идеальных условиях проективное покрытие возрастет до ста процентов — вспомните непроходимые заросли крапивы urtica dioica. На подходе к сухому месту проективное покрытие уменьшается, в сухих условиях остаются лишь единичные растения. В очень сухих ваши они уступают другим видам. За время похода вы пройдете несколько куполообразных изменений проективного покрытия, которые вспомните составляя шкалу:
Градиент изменения условий среды

Когда первая шкала готова, делим весь массив описаний на группы по влажности территорий и для каждой группы тем же методом строим шкалу «бедность-богатство-засоленность». Затем итеративно повторяем процесс для переменности увлаженения, аллювиальности почв, пастбищной дегрессии (вытоптанности) и чего душа пожелает.

Для работы необходимы десятки лет, миллиарды рублей и армия ботаников. Сегодня такие ресурсы получить невозможно, но по счастью кровавый сталинизм оставил в наследство не только сопливый дудевский фильм, но и результат работы института луговой и болотной культуры (сейчас НИИ кормов имени Вильямса), где под руковоством Л.Г. Раменского подготовлена прекрасная монография «Экологическая оценка кормовых угодий по растительному покрову». Книга содержит короткую пояснительную записку, методы анализа и таблицу на сотни страниц, где указано размещение видов растений на экологических шкалах в зависимости от проективного покрытия.
Книга Экологическая оценка кормовых угодий по растительному покрову

Свыше полувека работа с этой книгой выглядит так: геоботаник описывает проективные покрытия видов на площадке, возвращается домой, достает миллиметровку и рисует на ней шкалу влажности (сто двадцать единиц). Смотрит на значение проективного покрытия первого вида, находит этот вид где-нибудь на триста седьмой странице и откладывает на миллиметровке указанный в книге диапазон. Потом второй вид, потом третий и так до конца. Вид а: от сорока до пятидесяти, вид б: от сорока пяти до семидесяти, вид в: от двадцати до сорока восьми. На основе «больше меньшего, меньше большего» оцениваем увлажнение участка от сорока пяти до сорока восьми баллов. Потом переходим к вычислению богатства почвы, потом к остальным показателям. Спустя несколько часов беремся за другое описание.

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

Казалось бы, любой первокурсник-технарь напишет алгоритм за пару часов, любой школьник, отличающий инкремент от компиляции закодит его за вечер. Все просто как две копейки. Но все программные реализации (включая мою работу десятилетней давности) напоминали сплетенные из вареных макарон костыли для безруких. Потому что легче «Анну Каренину» на машинный язык перевести, чем автоматизировать работу с экологическими шкалами Раменского.

Проблема исключительно гуманитарная. Ботаники — от студентов до докторов наук до сих пор не отличают электронную информацию от цифровой. Наука о растительности — это пещера в котором обитает карго-культ технологического развития. Попросите любого выслать метаданные описаний — столкнетесь с непониманием. Договоритесь о данных в цифровом виде — получите на почту вордовский файл с таблицами. Гусиные перья сменила печатная машинка, печатную машинку компьютер, но сама технология изучения растительности осталась на уровне гусиных перьев.

Геоботаническое описание обычно содержит в себе метаданные (где, кем, когда и др.), описание древостоя (при наличии оного и отсутствии отдельных таксационных работ), подроста, подлеска и таблицы проективных покрытий травяно-кустарничкового и мохово-лишайникового ярусов. Камеральная обработка сводится к переносу данных в эксель, часто в том же виде, в каком они представлены на бланке. Форма бланков у всех разная, поэтому данные разных авторов не сравнимы без мучительной корректорской работы. Я опускаю разность методик, разность понимания видов, здесь разговор только о технической стороне вопроса.
Образец геоботанического описания

Без общепринятого формата, любой код автоматизации придется переписывать под каждого автора. Но это не спасет без решения проблемы субъективных оценок. Нельзя вместо оценки проективного покрытия скормить алгоритму понятия «единично», «изредка», «две куртины» и прочий бред (все из реальных описаний). Предположим, мы исключим такие данные из выборки. Если речь об экологическом шкалировании, то это допустимо. Но следом возникает проблема таксономии.

Линней, работая с номенклатурой не думал о том, что латынь уйдет в прошлое, а коробка размером с небольшой саквояж уместит в себе всю ботаническую литературу. Сегодня виды сохраняют латинское название (и это правильно), но саму латынь никто не помнит, герундий от герундива не отличает, рода путают между собой. В результате окончания видов обычно записаны с ошибками. Другое проблемное место — нечитаемые буквы. Попробуйте спустя месяц по памяти верно воспроизвести krascheninnikovii, krascheninnikoviana, или krascheninnikoviorum. Тут ботаники с лицом честного гаишника воскликнут, что они, дескать все выверяют по справочнику Черепанова. Клевер луговой у них трифолиум пратенсе, а клевер ползучий — амория репенс. Не верьте. При мне за несколько лет луговик извилистый из дешампсии стал лерхенфельдией, а из последней превратился в авенеллу. Все обсуждают подобные мелочные вопросы и никто не ничего хочет менять всерьез. А без изменений весь накопленный материал стоит дешевле макулатуры.

Я давно не работаю в государственном институте. Пол-месяца ввода, пол-месяца обработки и месяц дальнейшей психотерапии в мой прайс не включен, поэтому пришлось уйти от ботанических практик и минуя табличные редакторы, вводить данные сразу в виде js-объекта (в данные внесены искажения по условиям контракта, комментарии добавил для наглядности):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
var descript = [
{
time:20160602,
note:'GR-0602-1',
tags:'Сосняк, Мяглово-Карьер',
lat:59.82739,
lng:30.69896,
datum:'4326',
author:'S.N.Golubev',
feedback:'schwejk-rpnt@rambler.ru',
license:'CC-BY-NC-SA-3.0',
source:'fieldobserve',
aream:2411,
dendro:{   /*Характеристики древостоя*/
	allvolumemcb:329,   /*Запас, куб. м*/
	allfullmsq:34.4,    /*Абсолютная полнота, кв. м*/
	pins__sylrs:{       /*Данные по сосне - pinus sylvestris*/
		volumemcb:329,   /*Запас, куб. м*/
		fullmsq:34.4,    /*Абсолютная полнота, кв. м*/
		diasm:23,        /*Средний диаметр, cм*/
		heightm:24.7,    /*Высота, м*/
		age:70,          /*Возраст, лет*/
	},
},
grass:{   /*Данные по живому напочвенному покрову*/
	allcover:50,   /*Общее проективное покрытие яруса*/
	cover:{        /*Повидовое проективное покрытие*/
		vacnm_myrls/*Черника - Vaccinium_myrtillus_L*/:20,
		vacnm_vitd/*Брусника - Vaccinium_vitisidaea_L*/:30,
		conlr_majls/*Ландыш - Convallaria_majalis_L*/:5,
		trils_eurp_/*Седмичник - Trientalis_europaea_L*/:0.1,
		desps_flexs/*Луговик - Deschampsia_flexuosa_Trin*/:10,
		melrm_prans/*Марьянник - Melampyrum_pratense_L*/:0.1,
		luzl__pils_/*Ожика - Luzula_pilosa_L_Willd*/:0.1,
		calln_vulrs/*Вереск - Calluna_vulgaris_L_Hull*/:0.1,
		charn_anglm/*Кипрей - Chamerion_angustifolium_L_Holub*/:0.1,
		fragr_vesc_/*Земляника - Fragaria_vesca_L*/:0.1,
		soldg_virgr/*Золотарник - Solidago_virgaurea_L*/:0.1,
		maimm_biflm/*Майник - Maianthemum_bifolium_L_FW_Schmidt*/:0.1,
		desps_cests/*Щучка - Deschampsia_cespitosa_L_Beauv*/:0.1,
		},
	},
undergrass:{/*Данные по мохово-лишайниковому ярусу*/
	allcover:40/*Общее проективное покрытие яруса*/,
	cover:{
		polhm_specs:0.1/*Политрихум*/,
		plezm_schbr:40/*Плеуроциум*/,
		},
	},
},
]

Структура данных повторяет бланк описания (метаданные-древостой-живой напочвенный покров-мохово-лишайниковый ярус). Видам с незначительным обилием присвоено проективное покрытие 0.1%. Видовые названия записаны в виде одиннадцати символов: пять на род, пять на вид и символ нижнего подчеркивания между ними. Род и вид преобразуются в код вида по такому принципу:
— Первые три буквы таксона берутся без изменений (Convallaria — con);
— Последние две соответствуют двум последним согласным таксона (Convallaria — lr);
— Если букв в таксоне меньше пяти, пропуски заполняются нижним подчеркиванием (Poa pratense — poa___prans);
— Если после первых трех букв одна согласная или согласных нет — пустые места заполняются нижним подчеркиванием (Luzula_pilosa — luzl__pils_).

Это не самый удачный принцип, поскольку требует исключений. Например, одуванчики Taraxacum laticordatum и Taraxacum latisectum кодируются одинаково: tarcm_lattm. К более простому решению, которое обеспечивает автоматическую кодировку списка таксонов я пока не пришел. К счастью исключения редки даже для региональной флоры, для локальной совсем незначительны и легко отлавливаются простой проверкой по сортированному массиву.

После я перевел таблицу из книги Л. Г. Раменского в js-массив следующего вида:

1
2
3
4
5
6
7
8
9
10
11
12
var ramen = [
["КОД", "ВИД", "ШКАЛА", "ЗОНА", "ПОЧВА", "ПОКРЫТИЕ", "MIN", "MAX"],
["acalm_punns", "Acanthophyllum pungens (Bunge) Boiss.", "water", false, false, 0.3, 10, 15],
["acalm_punns", "Acanthophyllum pungens (Bunge) Boiss.", "water", false, false, 0.1, 8, 1000],
["acalm_punns", "Acanthophyllum pungens (Bunge) Boiss.", "rich", false, false, 0.3, 12, 15],
["acapr_schhr", "Acarospora schleicheri (Ach.). Mass.", "water", false, false, 2.5, 15, 19],
["acapr_schhr", "Acarospora schleicheri (Ach.). Mass.", "water", false, false, 0.3, 11, 22],
["acapr_schhr", "Acarospora schleicheri (Ach.). Mass.", "water", false, false, 0.1, 10, 35],
["acer__plads", "Acer platanoides L.", "water", false, false, 0.1, 65, 71],
["acer__plads", "Acer platanoides L.", "water", false, false, 0, 0, 91],
...
]

Массив состоит из 11 673 элементов, включая заголовок. Каждый элемент содержит информацию о видовом коде, таксоне, экологической шкале, минимальном и максимальном балле шкалы. Информация о типе почв и природно-климатической зоне отсутствует, но на случай развития проекта для этих данных оставлено место. В тех случаях, когда минимальный балл в книге не указан, в таблице стоит 0. Если не указан максимальный балл, в таблице стоит 1000.

Скрипт расчета Fleur.js содержит всего полторы сотни строк, но его следует сократить вдвое, поскольку вторая функция на 99% дублирует первую. На момент написания я вконец обленился и просто скопипастил свою же функцию, дополнив ее несколькими строками. Функция «ramenall(e)» подхватывает первое описание в серии, переводит абсолютные значения проективного покрытия из геоботанического описания в группы проективных покрытий шкал Л. Г. Раменского (единично-0.1, 0.1-0.3, 0.3-2.5, 2.5-8, 8 и более процентов). После сравнивает видовые списки из описания и таблицы экологических шкал на основе общего ключа кода видов. Найдя совпадение в коде, функция заполняет массив номером и таксонами описания с присвоением минимального и максимального балла для каждого вида. Если для вида информация отсутствует, скрипт выдает «-Infinity, Infinity;». После программа переходит к следующему описанию из серии. Когда описания заканчиваются, программа выводит собранный массив на html-страницу.

Функция «ramenbase(e)» выполняет те же самые операции, только для каждого описания в серии формирует массив с минимальными и максимальными значениями баллов. Из массива минимальных баллов отбирает наибольший, из массива максимальных — наименьший. Итогом выпадает таблица с номером описания, минимальным и максимальным значением на экологической шкале.
Больше меньшего, меньше большего

Обе функции потребляют на вход одинаковые аргументы: «rich» — богатство и засоленность почвы, «water» — влажность почвы, «waterwave» — переменность увлажнения, «alluvium» — аллювиальность почвы и «degrade» — пастбищная дегрессия.

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
// Полный расчет (значения для всех видов)
function ramenall(e){
 
  for(var a=0; a<descript.length; a++)
  {
	  var gbo = descript[a]; // Текущее описание в обработке
	  var spec=[];           // Вид
	  var pokr=[];           // Проективное покрытие в процентах
	  var pokrball=[];       // Балл покрытия по Раменскому
	  var spectable=[];      // Обертка для spec, pokr, pokrball
 
// Перевод % покрытия в % покрытия по Раменскому	  
	  for(var key in gbo.grass.cover)
	  {
		  spec.push(key);
		  pokr.push(gbo.grass.cover[key]);
		  if(gbo.grass.cover[key]>=8.0 &&
				gbo.grass.cover[key]<100){pokrball.push(8.0);}
		  if(gbo.grass.cover[key]>=2.5 &&
				gbo.grass.cover[key]<8.0){pokrball.push(2.5);}
		  if(gbo.grass.cover[key]>=0.3 &&
				gbo.grass.cover[key]<2.5){pokrball.push(0.3);}
		  if(gbo.grass.cover[key]>=0.1 &&
				gbo.grass.cover[key]<0.3){pokrball.push(0.1);}
		  if(gbo.grass.cover[key]>=0.0 &&
				gbo.grass.cover[key]<0.1){pokrball.push(0.0);}
		}
 
// Заполнение таблицы для сравнения со шкалами    
	  spectable.push(spec);
	  spectable.push(pokr);
	  spectable.push(pokrball);
 
// Сравнение со шкалами   
	  for(var i=0; i<spec.length; i++)
	  {
		  for(var k=0; k<ramen.length; k++)
		  {
			  if(spectable[0][i]==ramen[k][0] && //Код вида
				ramen[k][2]==e && // Шкала (указана в HTML)
				ramen[k][3]==false && // Природная зона (игнорируется)
				ramen[k][4]==false && // Тип почвы (игнорируется)
				ramen[k][5]==spectable[2][i] // Проективное покрытие
				)
				{
// Публикация отчета в HTML
				var str = document.getElementById('tableResult');
				var add = str.insertRow(-1);
				var addTr = document.createElement("tr");
				var addTd = document.createElement("td");
					addTd.innerHTML=descript[a].note+", ";
					addTr.appendChild(addTd); // Номер описания
				var addTd = document.createElement("td");
					addTd.innerHTML=ramen[k][1]+", ";
					addTr.appendChild(addTd); // Название вида
				var addTd = document.createElement("td");
					addTd.innerHTML=spectable[1][i]+"%,      ";
					addTr.appendChild(addTd); // Покрытие
				var addTd = document.createElement("td");
					addTd.innerHTML=ramen[k][6]+",      ";
					addTr.appendChild(addTd); // Максимум
				var addTd = document.createElement("td");
					addTd.innerHTML=ramen[k][7];
					addTr.appendChild(addTd); // Максимум
				str.appendChild(addTr);
				};
		};
	};
};
}
 
// Краткий расчет (классический, результаты для пробной площади в целом)
function ramenbase(e){
	for(var a=0; a<descript.length; a++)
	{
		var gbo = descript[a];
		var spec=[];
		var pokr=[];
		var pokrball=[];
		var spectable=[];
 
		for(var key in gbo.grass.cover)
		{
			spec.push(key);
			pokr.push(gbo.grass.cover[key]);
			if(gbo.grass.cover[key]>=8.0 &&
				gbo.grass.cover[key]<100){pokrball.push(8.0);}
			if(gbo.grass.cover[key]>=2.5 &&
				gbo.grass.cover[key]<8.0){pokrball.push(2.5);}
			if(gbo.grass.cover[key]>=0.3 &&
				gbo.grass.cover[key]<2.5){pokrball.push(0.3);}
			if(gbo.grass.cover[key]>=0.1 &&
				gbo.grass.cover[key]<0.3){pokrball.push(0.1);}
			if(gbo.grass.cover[key]>=0.0 &&
				gbo.grass.cover[key]<0.1){pokrball.push(0.0);}
		}
 
		spectable.push(spec);
		spectable.push(pokr);
		spectable.push(pokrball);
 
		var ecoscalemin=[];// Шкала минимумов
		var ecoscalemax=[];// Шкала максимумов
 
		for(var i=0; i<spec.length; i++)
		{
			for(var k=0; k<ramen.length; k++)
			{
				if(spectable[0][i]==ramen[k][0] &&
				ramen[k][2]==e &&
				ramen[k][3]==false &&
				ramen[k][4]==false &&
				ramen[k][5]==spectable[2][i]
				)
				{
					ecoscalemin.push(ramen[k][6]);
					ecoscalemax.push(ramen[k][7]);
				};
			};
		};
 
		var str = document.getElementById('tableResultKratk');
		var add = str.insertRow(-1);
		var addTr = document.createElement("tr");
		var addTd = document.createElement("td");
			addTd.innerHTML=descript[a].note+",  ";
			addTr.appendChild(addTd); // Номер описания
		var addTd = document.createElement("td");
 
			// Максимальное значение шкалы минимумов
			addTd.innerHTML=Math.max.apply(Math, ecoscalemin)+",  ";
			addTr.appendChild(addTd); // Минимум
		var addTd = document.createElement("td");
 
			// Минимальное значение шкалы максимумов
			addTd.innerHTML=Math.min.apply(Math, ecoscalemax)+";  ";
			addTr.appendChild(addTd); // Максимум
		str.appendChild(addTr);
	};
}

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

Финализировать эту эпопею нужно тремя вопросами: почему JavaScript?, что дальше? и как использовать полученные результаты анализа?. JavaScript — потому что эти расчеты иногда требуется выполнять на чужих компьютерах без установленного R, Wine или другого софта. Что дальше — не знаю. Есть пару идей, но я три года ничего не менял, могу еще три года ничего не менять. А как использовать результаты я не расскажу, поскольку строки этой статьи все-равно никто не увидит. Программисты бросят читать на втором слове, а ботаники на четвертом.


По адресу городшахты.рф/source/fleur/ лежит готовая к использованию программа. Можете указать ссылку на свой набор геоботанических описаний в указанном выше формате и рассчитать богатство, увлажнение, переменность водного режима, аллювиальность и пастбищную дегрессию почв.
Полноценное теоретическое обоснование, альтернативные методы и материалы для контроля доступны в книге: Л. Г. Раменский, И. А. Цаценкин, О. Н. Чижиков, Н. А. Антипин «Экологическая оценка кормовых угодий по растительному покрову» Всесоз. науч. -исслед. ин-т кормов им. В. Р. Вильямса. М. : Сельхозгиз , 1956 470, [2] с.: ил., 1 л. граф.

Новое время

Пусть гнойные либералы зайдутся в истерике. Я прямо скажу: Роскомнадзор — зело полезное министерство. Сейчас жарко, дня не проходит, что-бы в открытую дверь муха, бабочка, оса али другая полезная тварь не залетела. Жужжит, бьется о стекло — руками не возьмешь, помнешь животину. Тогда я стаканом для пива накрываю инсекту. А стакан закрываю досудебным уведомлением, которые мне Роскомнадзор с прошлого года шлет. Или извещением о повестке в суд. Вынесу из дому — лети на волю живое существо! Не буду я душу зазря губить.

Не бывало в истории лучшего времени для создания печатного журнала. Без всяких интернет-версий. Безумного, дикого, шокирующего. Как шанель номер пять — с ароматом пота забитых абиссинских котов. Напечатанного на обычном принтере, сжатого степлером и отправленного подписчикам «Почтой России».

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

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

Можем повторить

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

Все говорят, что везение — случайность, но убеждены в закономерности провала. А может просто не повезло? Повторная неудача — другое дело. Нет никакого смысла в третий раз повторять сценарий фиаско. Во всяком случае, если вы не Брюс Уиллис.

Презервативная пропаганда

Я бездоказательно уверен, что антиспидовая агитация — глобальный заговор презервативных компаний. Считайте это паранойей, но иного объяснения у меня нет: все стены в жутких плакатах с каплями крови и тоскливым женским лицом. «Берегись СПИДа!». «Помни о профилактике ВИЧ!» — ужас не покидает даже алкоголика с пуританскими взглядами.

Цель таких плакатов не в информировании людей, а в нагонке страха для увеличения прибыли «Дюрекса». Поэтому все боятся СПИДа и ВИЧ, но мало кто знает, чем первое отличается от второго. Хотя, казалось бы, что сложного? Если сравнить с гриппом, то СПИД — это температура и кашель, а ВИЧ — это ортомиксовирусы, которые привели к заболеванию. Бойтесь ВИЧ и СПИД — это тоже самое, что бойтесь гриппа и вирусов гриппа. Причина и следствие намешаны в кучу, поскольку два непонятных ужаса пугают сильнее одного понятного.

Вам обязательно расскажут, что в России каждый сотый человек носитель вируса, что Россия на третьем месте по числу новых случаев заражения (впереди только ЮАР и Нигерия), что антиретровирусная терапия бесплатна, но лекарств на всех не хватает.

Но ни на одном плакате не написано, что благодаря делеции в гене CCR5 среди скандинавов и русских примерно каждый седьмой не восприимчив к ряду штаммов ВИЧ. Вы этого знать не должны. Вы должны бояться и оптом скупать презервативы.

Две беды у нетерпеливых — СПИД и микрокредиты. Как при таком характере они умудрятся десятилетиями выносить унылую жизнь и скучную работу — полная загадка.

Ненецкая культура

Из всей ненецкой культуры русским знакома лишь малица и анекдот про ненецкий сортир. На мой взгляд — это наша большая трагедия. Ненцы — носители особой, не требующей перевода мудрости.

Для примера возьмем мандаладу. Мандалада — это вооруженное ополчение ненцев против советской власти. Происходило все примерно так: приехали красноармейцы и забрали оленей. Потом опять приехали красноармейцы, забрали еще оленей и арестовали шаманов. Потом приехали красноармейцы, забрали оставшихся оленей и арестовали тех, кого смогли поймать. Ненцы возмутились и пошли на русских тотальной всенародной войной (мандаладой). Приехали на стойбище и стали ждать красноармейцев. Через несколько дней приехали русские, около сотни человек. Отдавайте, говорят ненцы, наших оленей и людей!. Хрен вам! — отвечают им русские. Тут началась пурга и все попрятались, а когда пурга закончилась, оказалось, что на стойбище никого нет — все разъехались кто куда.

«Люди сказали: «Зачем мы сюда приехали, все равно сделать ничего не сможем»» (Эсико Лаптандера — участник мандалады)

Большая часть общественной активности в России, будь то выборы, митинги, слушания или мнения экспертов — это мандалада чистой воды. Лучшего слова, как ни старайся, все равно не подберешь.

Или взять ненецкий эпос. Несколько лет назад я жил в зимовье на Полярном Урале. Низкая добротная изба в дюжину венцов, печка, стол, скамья, нары. На столе пылится старый номер газеты «Лух Авт» — последняя полоса целиком отдана под фрагмент поэмы о жизни ненецкого охотника. Я не видел произведения целиком, но моментально стал сопереживать герою после нескольких строк (до сих пор помню наизусть):

«Хуйн рущ хуен ухал
шойтар пушна вултыя
Ёхан рущ хуен ухал
хоптан пушна вултыя
Иси кен

Вот ей-богу, это прям про всю мою жизнь. Без сарказма.

Спортивное картографирование

Если бы судьба занесла меня в хипстерскую картографическую компанию, первым делом я бы предложил устроить чемпионат по спортивному картографированию. Не механическое обклацивание снимков на скорость (хотя в этом есть элемент азарта), а именно состязательное решение сложной картографической проблемы. Например: подготовить карту лучших длительных веломаршрутов в Усть-Донецком районе Ростовской области. Или карту заселенности Подмосковья. Или перевизуализация карты ограниченным набором цветов: пусть будет желтый и фиолетовый. Или еще что-нибудь в этом духе.

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

Видимо по этой причине я не работаю в хипстерской картографической компании.

Вдудь и пятерочка

Не знаю, чего все так возбудились. Дважды посмотрел дудевский фильм про Колыму и нашел его безнадежно унылым. Если кто не смотрел, суть видоса такова: в ГУЛАГе было плохо, очень плохо, на Колыме сейчас плохо, но в ГУЛАГе было еще хуже, не ссыте, вы можете, хоть в ГУЛАГе и было плохо. С посылом я согласен, но нельзя же все сводить к одним соплям.

Из всего фильма самым адекватными оказались водители и мужик-архивист. Последний создал полное впечатление промытости мозгов («Мы будем под американцами»), но внимательный глаз всегда различит зерно разума. «Все говорят, что Сталин — зло, я согласен, но давайте обсудим его положительную роль».

Это прям моя жизненная позиция. Соотношение между «хорошо» и «плохо» во все времена одинаково. Поэтому я не верю в светлое будущее цифровых технологий и считаю вторую мировую войну лучшим, что произошло с человечеством (не путайте лучшее с приятным).

Возьмите магазины «Пятерочка». Они уродуют города, но строят велопарковки. Убивают мелкие магазины, но снижают цены. Продают безвкусную дрянь, но содержат все в чистоте.

— Как ты смеешь сравнивать ГУЛАГ, фашизм и Пятерочку?! — воскликнет тут фанатичный читатель. Что сказать? Все вокруг лишь случайная космическая пыль, которая на фоне дуальности эмергентного мира сливается в неразличимую точку.