2017-05-29

strlen

At work, we have an old codebase, originally written on Unix. While porting it to Windows someone's decided that Microsoft standard library is not good enough and replaced most of the functions with his own minimal implementations, mostly by copying relevant pieces from older projects he was working on. So we have a bare minimum of CRT, written in 90ths style. Which is good, in some way. It survived two decades and works fine, but recently we started thinking that maybe we should update some hot functions to improve performance. So, I've decided to research what benefit we can get from modern programming technics starting with the simplest one, with strlen.

Actually, strlen is usually an intrinsic, which means we can't find its implementation in the library's source code: compiler produces it instead. Which doesn't always mean its optimal. Anyway, we can still see what it performance look like and we can replace it if we need.

The traditional "strlen" K&R-style implementation used to be something like that:

int strlen(const char *s){
  uint l=0; while(*s++) l++; return l;
  }

Or, maybe this. It can be optimized into "repnz scanb" instruction. Which made a difference on older processors.

int strlen(const char *s){
  const char *s0=s; while(*s) s++; return s-s0;
  }

With modern processors, there are two choices. We can use special SSE instructions, coding them on assembler or using compiler extensions. If we want to stay in C/C++ world, we can process 8 bytes at once by using 64-bit arithmetic and logical instructions. We can fetch 8 bytes as 64-bit word, then somehow determine if the word contains a zero byte. If it does not, we can increment length by 8 and jump to the next 8 bytes. If it does, we need to find the zero byte inside that word. The processing of the last word is not that performance-critical, its happens just once per string.

I know there are implementations (like GCC GNU library), but I like to reinvent a bicycle, so I wrote it myself for a bit of fun, relying on compiler to optimize trivialities:

int strlen4(const char *s){
  const uint64 *p=(const uint64 *)s; uint c=0;
  for(;;){
    const uint64 m=0x8080808080808080ull;
    const uint64 x=(((*p&~m)+~m)|*p)&m^m;
    if(x){
      s=(const char *)p; while(*s) s++; return c+(s-(const char *)p);
      }
    c+=8; p++;
    }
  }

Explanation:
  1. ~m is 0x07f7f7f7f7f7f7f7full by the way, and 'full' is a coincidence
  2. *p&~m // zeroing 8th bit of every byte
  3. (*p&~m)+~m // arithmetic addition will overflow to 8th bit when an only when the value on step 1 is non-zero, and it never overflow to the next byte
  4. ((*p&~m)+~m)|*p) // or-ing with original word will set 8th bit to one when 8th bit of *p is non-zero, and it also never overflow
  5. ((*p&~m)+~m)|*p)&m // selecting only 8th bits of every byte, which would be 1 when byte of *p is non-zero and 0 when it zero
  6. ((*p&~m)+~m)|*p)&m^m // inverting that bits, so it will have 1 for zero byte and 0 for non-zero
  7. now if entire word is 0, that means we don't have zero bytes

Finding a non-zero bit in 64-bit word can also be a little of a fun play, and I'll show some examples below. Also, the Intel SSE2 has instructions to do all that by one single command. SSE4 is also can be used, but I saw posts, explaining that SSE2 implementation is faster, so I've decided to skip SSE4 for now.

Let's go to tests. I wrote 9 variants of strlen (sources at the end of this post):

  • 0: no strlen is called, but all other test code is running -- to determine the baseline.
  • 1: calling just regular built-in "strlen"
  • 2-3: simple byte-per-byte implementations
  • 4-7: algorithm described above with different code determining the length of the last word, where methods 6-7 don't use conditional ifs
  • 8: using SSE2 intrinsics

Each of methods computes length of strings from 0 to 64. That is repeated 100000 times and time is reported in milliseconds. Every test is repeated 8 times using 8 different alignments of original strings.

Note, that higher bar means worse performance. Groups are for different variants, and inside each group we can see results for different alignments.

First run was on my home mac-mini machine (2.3 GHz Intel Core i7, Maverick):


We can see, that per-byte methods 2,3 are the worst, methods 1, 4, 5, 8 has almost identical performance. Which is a surprise, I thought that SSE2 will be better, it runs 128bit at once, not 64. Also, alignment of strings doesn't seems to matter, which is another surprise.

And the second is on my travel macbook (Processor 1.1 GHz Intel Core M, Sierra):


Below is a result of running test on Windows, with our project compiler and library, by two machines: a newer one (Intel Xeon CPU E5-1650 v3 @ 3.50GHz; Windows Server 2016, 64 bit) and an older one (Intel Core i7 CPU 920 @ 2.67Ghz; Windows Server 2008R2, 64 bit). Also I didn't run SSE2 test on them.



So, the built-in and per-byte tests are the worst. The older machine, the less that difference.

Also, I run the test with 32-bit compiler and the results are similar.



So, the morale is that per-byte is bad and 64-bit C++ is as good as SSE2.

Here is the code:
int _strlen1(const char *s){
  return strlen(s);
  }

int _strlen2(const char *s){
  const char *s0=s; while(*s) s++; return s-s0;
  }

int _strlen3(const char *s){
  uint l=0; while(*s){ s++; l++; } return l;
  }

int _strlen4(const char *s){
  const uint64 *p=(const uint64 *)s; uint c=0;
  for(;;){
    const uint64 m=0x8080808080808080ull;
    const uint64 x=(((*p&~m)+~m)|*p)&m^m;
    if(x){
      s=(const char *)p; while(*s) s++; return c+(s-(const char *)p);
      }
    c+=8; p++;
    }
  }

int _strlen5(const char *s){
  const uint64 *p=(const uint64 *)s; uint c=0;
  for(;;){
    const uint64 m=0x8080808080808080ull;
    uint64 x=(((*p&~m)+~m)|*p)&m^m;
    if(x) return x&0x00000000ffffffffull ?
                (x&0x000000000000ffffull ? 
                (x&0x00000000000000ffull ? c : c+1) : 
                (x&0x0000000000ff0000ull ? c+2 : c+3)) :
                (x&0x0000ffff00000000ull ? 
                (x&0x000000ff00000000ull ? c+4 : c+5) : 
                (x&0x00ff000000000000ull ? c+6 : c+7));
    c+=8; p++;
    }
  }

int _strlen6(const char *s){
  const uint64 *p=(const uint64 *)s; uint c=0;
  for(;;){
    const uint64 m=0x8080808080808080ull;
    const uint64 x=(((*p&~m)+~m)|*p)&m^m;
    if(x){
      const uint64 y=(x|(x<<8)|(x<<16)|(x<<24)|(x<<32)|(x<<40)|(x<<48)|(x<<56))^m;
      const uint64 z=y+(y>>8), u=z+(z>>16), l=u+(u>>32);
      return c+((l>>7)&0xf);
      }
    c+=8; p++;
    }
  }

int _strlen7(const char *s){
  const uint64 *p=(const uint64 *)s; uint c=0;
  for(;;){
    const uint64 m=0x8080808080808080ull;
    const uint64 x=(((*p&~m)+~m)|*p)&m^m;
    if(x){
      const uint64 y=(x|(x<<8)|(x<<16)|(x<<24)|(x<<32)|(x<<40)|(x<<48)|(x<<56))^m;
      const uint64 l=y+(y>>8)+(y>>16)+(y>>24)+(y>>32)+(y>>40)+(y>>48)+(y>>56);
      return c+((l>>7)&0xf);
      }
    c+=8; p++;
    }
  }

int _strlen8(const char *s){
  const __m128i z = _mm_setzero_si128();
  const __m128i* p = (const __m128i*)s;
  for(;;){
    __m128i xmm = _mm_loadu_si128(p);
    const uint mask = _mm_movemask_epi8(_mm_cmpeq_epi8(xmm,z));
    if(mask!=0) return ((const char*)p)-s+(ffs(mask)-1);
    p++;
    }
  }

2017-04-04

Zion National Park




Как-то сама собой сложилась традиция ездить в весенние каникулы в разные каньоны. В это время в более северных национальных парках еще лежит снег и парки наполовину закрыты. А весной хочется, чтобы было не только красиво, но и тепло. В позапрошлогодние каникулы мы ездили на Grand Canyon, в прошлом году - в Arches, и в этом году - в Zion National Park и в Bryce Canyon National Park, который всего в двух часах езды от Zion.

Удобнее всего было взять самолет до Las Vegas, и поехать в Zion на машине. При этом за три часа пути проезжаешь из штата Nevada через Arizona в Utah.

Занятно, как рядом мирно сосуществуют штат Nevada, где официально разрешены казино и проституция, и Utah, где живут мормоны, которые даже кофе не пьют.

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

Нижняя часть образована красным песчаником и состоит из вертикальных отвестных скал. Верхняя - из красного или белого песчаника и вся изрезана слоистыми горизонталями. Полная визуальная противоположность.


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

2017-03-28

Bryce Canyon






Bryce Canyon - волшебное место, рай для фотографа. Или ад, если пытаться снять что-то никем не снятое. На панораме глюкнула матрица на артефактах, но каньон получился хорошо. Удивительно, как природа иногда вдруг генерирует сложность из ничего, посреди однообразной равнины. Так, наверное, образовалась наша вселенная, в уголочке, из ничего, посреди бескрайней пустоты.

2017-03-01

Цвет моря




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

На закатной фотке, кстати тоже виден переход, но он уже не дает изменения цвета.

2017-02-28

Inuksuk



An inuksuk (plural inuksuit) (from the Inuktitut: ᐃᓄᒃᓱᒃ, plural ᐃᓄᒃᓱᐃᑦ; alternatively inukhuk in Inuinnaqtun, iñuksuk in Iñupiaq, inussuk in Greenlandic or inukshuk in English) is a human-made stone landmark or cairn used by the Inuit, Inupiat, Kalaallit, Yupik, and other peoples of the Arctic region of North America. ... The word inuksuk means "that which acts in the capacity of a human." (Wiki)

"in the capacity of a human" is exactly what I've written two years ago.

The photo has been shot this Sunday in Vancouver BC.

2017-01-11

Какое небо голубое...

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

С технической точки зрения все выглядит правильно и хорошо, cloud storage, cloud computation - означают вполне конкретные и довольно передовые технологии. Однако будучи маркетинговым словом, cloud совершенно не всегда означает именно эти технологии, часто это просто способ продать пользователю воздух за дополнительные деньги.

Я просто перечислю, что получается, когда программа вдруг становится "облачной":
  • Ваши файлы/фотографии вдруг начинают копироваться куда-то на сервера, возможно даже удаляясь при этом локально.
  • По пользовательскому соглашению, ваши файлы могут уже не быть вашими, а вдруг становятся собственностью компании или могут быть переданы третьим лицам.
  • Если они даже декларируются как только ваши, это может поменяться в любой момент.
  • Неизвестные люди могут вдруг получить доступ к вашим файлам/письмам/фотографиям, причем даже к тем, которые вы удалили, либо работая в дата-центре, либо разбирая выкинутые дата-центром диски, либо просто подобрав пароль. Разнообразные органы тоже могут получить такой доступ.
  • Фотографии вдруг могут быть сжаты новым алгоритмом, уменьшены в размерах и очищены от внутренних тегов.
  • Вы не можете больше отказаться от установки новой версии программы, даже если она вам не нравится, без потери доступа к файлам.
  • Без доступа к интернету некоторые файлы вдруг становятся недоступны.
  • С доступом к интернету, они иногда становятся недоступны тем не менее.
  • Становится сложно сделать бакап всех файлов или скопировать их все обычным файловым копированием.
  • Быстрая когда-то программа вдруг становится медленной. Скорость программы может зависить от географического положения пользователя или качества соединения с интернетом.
  • Компания может захотеть перевести всех на web-интерфейс. Приложения для десктопов и телефонов могут быть переделаны, чтобы тоже работать через тот-же интерфейс, завернутый в окно приложения. Обычно при этом функциональность и удобство резко падают. Приложения становятся тормозными и неудобными, но более дешевыми в разработке.
  • Можно легко потерять доступ ко всем своим файлам, если вдруг компания откажет вам в сервисе. Это может быть вызвано, например сомнительными операциями по вашей кредитке, или подозрением на то, что в файлах содержится порнография. Компании всегда проще заблокировать ваш доступ и удалить все файлы, чем разбираться, подвергая себя риску.
  • Компания может решить закрыть проект или разориться. Скачать при этом все файлы может оказаться проблематично.
  • Забыв оплатить в течении некоторого времени (забыв обновить кредитку, например), можно потерять все файлы.
  • Компании любят брать помесячную подписку вместо однократной продажи. При этом стоимость программы часто возрастает на порядок (например, $10 в месяц, вместо $80 однократной, при этом в качестве оправдания дается доступ к другим ненужным вам сервисам той же компании).

Из положительных сторон облачности обычно всего несколько:

  • Вам обещают, хотя и без каких либо гарантий, что данные будут храниться более надежно.
  • Они будут доступны с нескольких компьютеров, с телефонов и через Web-интерфейс.
  • Иногда возможна sharing and collaboration.

Для себя я решил не опираться на облачные сервисы для файлов, которые считаю важными. Лучше делать собственные бакапы, включая обязательно off-site backup. Для доступа с разных компьютеров можно завести небольшой домашний сервер или держать шифрованную копию данных в public cloud.

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

2016-12-31

Итоги 2016 (личное).

Как обычно, по пунктам.

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

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

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

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

Августовская поездка в Центральный Орегон тоже понравилась, если не считать того, что по пути обратно разбили машину, служившую нам безотказно 16 лет. На нас ни царапины. Хорошая была машина. Жалко.

Машина.
Естественно, как вернулись из Орегона, сразу купили новую машину, куда без нее. В память об удачной предыдущей взяли снова Toyota. По городу мы ездим немного, поэтому хотелось машину для поездок за город и путешествий с велосипедами, лыжами и палатками. Я хотел что-нибудь полноприводное, но не слишком огромное. Взяли Rav4. Мне нравится, хотя она явно тяжелее предыдущей Camry и напиханы всякие ненужные и неудобные компьютерные навороты, которые, впрочем, можно игнорировать. Пришлось купить новое крепление для велосипедов. Перепробовал несколько, остановился на велосипедной платформе Küat.

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

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

Компьютерное.
Две вещи показались интересными в этом году. Во первых, стал активно пользоваться node.js для разных быстрых задачек. Хотелось бы такую же, но в native code.

И вторая вещь - язык Swift от Apple, который мне понравился по описанию значительно больше, чем C# или Java. Все собираюсь попробовать Swift практически, но пока так и не добрался.

А еще в планах вспомнить и поразбираться с нейронными сетями. Сейчас самое время, очень горячая тема и очень востребованная.

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

Завел себе iPhone в качестве карманного компьютера. Дорого, но оказалось очень удобно. Я долгое время пользовался iPad-mini вместо телефона, но телефон оказался значительно удобнее просто потому, что меньше и влезает в карман. Как ни странно, он хорошо стыкуется с сервисами на работе. Почта и митинги работают лучше, чем на рабочем компьютере. С беспроводными наушниками можно участвовать в skype-митинге гуляя по парку.

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

Полностью перешел на Git для домашних проектов.

Еще я несколько разочаровался в концепции cloud и html5 и стал постепенно переходить на домашнюю сетевую storage и больше пользоваться native-приложениями. Про это надо бы сделать отдельный пост.

С новым годом!
Желаю здоровья и положительных эмоций. Они нам в новом году будут особенно нужны.

2016-12-21

В поисках равновесия

В культурах, которые помнят голодные времена, остались особые отношения к еде. Обычай не доедать еду считается неприличным. Нежирная еда считается "пустой" и бедной. Детей надо кормить силком, иначе не переживут голодной зимы. Хотя в новые времена дешевой еды и всеобщего ожирения, надо наоборот, привыкать не есть лишнего, жирного и тяжелого, считать каллории и заботится о качестве, а не о количестве. А для этого укротить в себе крокодила и заменить "нажраться" на "отведать". Перевести животную потребность в область культурной.

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

То же самое и с вещами. Нельзя бесконечно набивать дом вещами, в какой-то момент их надо раздавать или выкидывать, иначе превращаешься в старьевщика.

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

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

2016-12-20

Maui



Trump

И теперь уже официально.

Параллель с российской ситуацией удивидельна. Для меня лучшие годы в России были 90е, Ельцинская оттепель, полная прогресса и надежды. Потом ненавистный совок начал наступать опять со всех сторон, и сверху и снизу. В штатах лучшее время для меня были Обамовские 8 лет, тоже время некоторого заметного прогресса. И опять, точно так же, ненависть к этому прогрессу начала изливаться в социальных сетях, как индикация, что население опять к нему не готово и хочет обратно в комфортный для него мир средневековья.

Республиканская партия сначала выдвинула каких-то совсем реакционных кандидатов, но праймариз выиграл максимальный популист. "Make America Great Again" - это то же самое движение назад, как и нынешний российский "СССР 2.0", как и Горбачевский "обновленный социализм" 90-х. Ключевое слово в лозунге "again", означающее, по мнению авторов, что штаты когда-то были более great чем сейчас. В какие времена предлагают вернуться, неясно, во времена рабовладения, полагаю.

Демократическая партия тоже виновата в приходе Трампа. Агрессивные дебаты с Сандерсом, когда Клинтон обвиняли в коррупции и прочих разных грехах явно откусили часть ее голосов. Сандерсу это не помогло, но уже тогда было понятно, что есть проблема с ее избранием. Единственно, я надеялся, что у населения хватит здравого смысла не голосовать за Трампа и выбрать Клинтон, как меньшее из зол. Не хватило. Население оказалось в массе такое же безответственное и жаждущее разрушения, как везде. И российская диаспора особенно, что впрочем не удивительно. Отношение Трампа к гендерным ролям, меньшинствам, науке и экологии точно такое же, как и у большинства россиян.

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

2016-10-10

Pumpkins

I've made this photo on a fruit stand. Its that colorful time of the year.

2016-10-02

Rainier panoramas



The panoramas were shot the last time we've been at Rainier, but I've processed them just recently.

2016-09-21

New tolkov.com

The tolkov.com web-site is completely redesigned. Previously it was my personal experimental web-site, but almost everyone in the family has their own site now, so I've decided to convert tolkov.com to a dispatch point from where you can go to individual sites. I hesitated a little to add that background photo, but finally decided to leave it. I like the picture, where we all together.

My personal page is moved to valery.tolkov.com, which is currently an archive copy of my blog merged together with old photo collections. I haven't finished with software page, which currently is just a selected set of blog pages.

The code is completely new, all of it, HTML+javascript, site management code. The site is generated using m4 preprocessor and uses node.js scripts to synchronize with external blog. In fact, I've made a blog backup tool, which can backup blogspot and tumblr blogs. Finally I can completely retire my Windows scripts and Windows virtual machine. Also, I've found that "webkit2png" is a great tool to capture screenshots of web-sites. And also, I keep everything in a Git repository and use its metadata to synchronize local copy with web-server.

I removed a huge old pile of obsolete and unreferenced files, which potentially could break some links from old or external pages. If you find some, write me, I'll fix what I can.

Update: As I said, I retire vtolkov.livejournal.com.

2016-09-15

Sunrise


Традиционная наша поездка на Sunrise,
Rainier National Park.

СССР

Давайте разберемся

Меня возмущают те, кто возмущается.
Меня удивляют те, кто удивляется.
Ибо все претензии к нашей жизни отпадают, если с трудом понять и без труда сформулировать.

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

А начальство наше генералы.
И дома у них генеральские.
И шутки у них генеральские.
И шапки у них генеральские.
И жены, и дети у них генеральские.
И лечение, и похороны после него...

А мода у нас солдатская.
И манера у нас одна на всех.
И вкус у нас один.
И тоскуем мы по Родине, как и положено солдату.

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

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

Вот так же и естественное свободное общество - сложно. В нем много иерархий, отношений, стилей жизни, экономических ниш, стимулов существования.

Советский союз был очень неестественен в этом смысле. Монокультура, как картофельное поле. В нем были убраны почти все иерархии, кроме одной. Убраны все стили жизни, кроме одного. Ровные ряды одинаково одетых граждан, читающих те же книги, смотрящие те же фильмы по единственной программе телевидения. Для многих единственный стиль жизни - пойти на завод после школы и проработать на нем до пенсии.

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

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

Эта минимальность структурной сложности общества и культуры воспитала поколения людей, не переносящих сложности вообще. "Зато не надо думать", было одним из существенных доводов в выборе работы или стиля жизни. "Не е** мне мозг" - стандарный ответ не все мало-мальски нетривиальное.

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

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

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

Как всегда, Жванецкий про все это уже писал. Я только могу добавить, что все это не свойство исключительно СССР. Если пойти назад в историю, почти все вышеперечисленное будет справедливо. Так российская империя была испокон веков устроена. И поэтому после развала СССР и краткого периода свободы все довольно быстро отыгрывается назад в то же самое минималистичное армейское состояние, на этот раз с религией. Вопрос - каким теперь будет враг, абстрактным или конкретным, внутренним или внешним?

2016-09-05

Colchuck Lake



Colchuck Lake - одно из красивейших горных озер в наших краях. Вода изумительно синяя, как в Crater Lake. На языке местного племени Chinook название озера означает "холодная вода".