tag:blogger.com,1999:blog-61387702994735118182024-02-07T23:28:09.116+02:00Dim on EverythingAnonymoushttp://www.blogger.com/profile/17152157727140681943noreply@blogger.comBlogger27125tag:blogger.com,1999:blog-6138770299473511818.post-35124793997453677412016-04-25T09:49:00.002+03:002016-04-25T11:07:43.548+03:00Утиные истории 2<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhq5C_fOSUbenUM7c-m9sMG07plSZAAOGeNFtWZhJISjWh8E2GF5gRWflgTyjTU5pMggwTLZHj_LryhW2vPNEA78MEWwD-ucvsotsZRIiYrPbM4DHhGkB0GYJVxzKTOmxdeJvrhrcbHqKY/s1600/1280px-4320_-_Thun_-_Waterfowl.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="480" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhq5C_fOSUbenUM7c-m9sMG07plSZAAOGeNFtWZhJISjWh8E2GF5gRWflgTyjTU5pMggwTLZHj_LryhW2vPNEA78MEWwD-ucvsotsZRIiYrPbM4DHhGkB0GYJVxzKTOmxdeJvrhrcbHqKY/s640/1280px-4320_-_Thun_-_Waterfowl.JPG" width="640" /></a></div>
<br />
<br />
Короткая заметка, особо интересно может и не быть.<br />
<br />
Это продолжение <a href="http://dimoneverything.blogspot.com.by/2016/04/blog-post.html">увлекательной истории об утках</a>.<br />
<br />
На следующий день я позвонил опять на пост охраны (это было воскресенье, глупо было ожидать, что я дозвонюсь куда-то ещё) и уже новому человеку сказал, что и где произошло, назвал вид утки и где и когда мы её видели последний раз. Девушка заверила меня, что всё передаст администрации.<br />
<br />
Во второй половине дня мы сходили в Швейцарскую долину и внимательно обошли всё озерцо и входящий и выходящий потоки метров на пятьдесят. Утки и утят не было.<br />
<br />
Наиболее вероятной мне представляется версия, в которой утка с выводком поплыла по Городничанке дальше. Там дальше опасных мест, наподобие того подземного протока, нет, и речка благополучно впадает в Нёман, где этому выводку самое место. Кряквы-то прекрасно живут на подачках хлеба и прочей растительной пище, но у крохалей вместо плоских роговых пластин в клюве зубцы и им подавай только рыбу. А какая в Городничанке рыба?<br />
<br />
Да и спокойней в Нёмане. Можно найти место без людей.<br />
<br />
Соответственно, директору зоопарка я уже не звонил. О чём звонить? Что я не знаю, где утка?<br />
<br />
Вот такая вот история.</div>
Anonymoushttp://www.blogger.com/profile/17152157727140681943noreply@blogger.com0tag:blogger.com,1999:blog-6138770299473511818.post-88684762497480598362016-04-23T20:18:00.001+03:002016-04-26T10:33:43.037+03:00Утиные истории<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: right;">
<i>Жизнь летит как ураган</i></div>
<div style="text-align: right;">
<i>В утиных сказках!</i></div>
<div style="text-align: right;">
<i>Лазеры, аэропланы,</i></div>
<div style="text-align: right;">
<i>Песни! Пляски!</i></div>
<div style="text-align: right;">
<br /></div>
<br />
Есть распространённый штамп в американских фильмах: про пожарных, снимающих с дерева котика. Американцы этим резонно гордятся: госслужащие, тем более, силовики – с народом. Сегодня мы с супругой и ребёнком имели возможность убедиться, что и в Беларуси с этим всё отлично.<br />
<br />
В Гродно, где мы живём, в центре есть прогулочный парк, который называется парк Жилибера. Через него протекает небольшой ручеёк, глубиной не больше, чем по пояс в самых глубоких своих частях.<br />
<br />
И в этом ручейке водятся утки.<br />
<br />
Уток подкармливают, в общем, всё как обычно. Однако, сегодня, когда мы подходили к парку, мы заметили нечто необычное.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZe7oMx3caKWoWcyVS66zsoXli_UtGVTN11OKbqPVyTrZim17wDmVA3MzmaTG13EukdNfjBN7jI9vl0m9HeGkhaJDuqatSSK-6qD-mKVaXG4YFR3ir6RgzLBG3I8HAit0V831Xvzo8fQw/s1600/2016-04-23+16.58.46.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="472" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZe7oMx3caKWoWcyVS66zsoXli_UtGVTN11OKbqPVyTrZim17wDmVA3MzmaTG13EukdNfjBN7jI9vl0m9HeGkhaJDuqatSSK-6qD-mKVaXG4YFR3ir6RgzLBG3I8HAit0V831Xvzo8fQw/s640/2016-04-23+16.58.46.jpg" width="640" /></a></div>
<br />
Да, возле речки была довольно необычная утка с целым утиным выводком – восемь утят! У нас, как и везде, водятся обычные кряквы (<i style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px; line-height: 22.4px;"><span lang="la"><a href="https://ru.wikipedia.org/wiki/%D0%9A%D1%80%D1%8F%D0%BA%D0%B2%D0%B0">Anas platyrhynchos</a></span></i>), а это была утка породы средний крохаль (<i style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px; line-height: 22.4px;"><span lang="la" xml:lang="la"><a href="http://redbook.minpriroda.gov.by/animalsinfo.html?id=30">Mergus serrator linnaeus</a></span></i>). Вид считается редким, в большинстве районов – очень редким, и внесён в том числе в Красную книгу Республики Беларусь.<br />
<br />
Мы на неё посмотрели и пошли дальше кормить крякв – понятно же, что мама утка нас не подпустит.<br />
<br />
Тут надо рассказать, что вот прямо дальше ручей упирается в небольшую плотинку, которая образует перепад в метр, а потом дальше утекает в решётку под мост. С другой стороны моста ручья уже нет, то есть, он уходит под землю, в специально сделанный для него канализационный проток.<br />
<br />
И вот с этого перепада падает один утёнок.<br />
<br />
Мы этого не видели, рассказ со слов непосредственных свидетелей. Утка прыгает за ним, и, естественно, все остальные утята немедленно следуют за ней. Утка пытается посадить их на спину (получается, естественно, посадить максимум пятерых) и выпрыгнуть с ними наружу, но стратегия заранее обречена на провал – надо возвращаться за остальными, а утята прыгают за ней. Она стала носиться туда-назад, спрыгивать-запрыгивать, тревожно крякать...<br />
<br />
Я эти странные утиные телодвижения наблюдал издалека. То, что утята упали вниз, я понял сразу, но что туда надо бежать и спасать утят, как-то не сообразил.<br />
<br />
Короче, когда я пришёл, утят утянуло сквозь решётку под мост, и даже утка последовала за ними. Утка была видна и активно призывно крякала, а вот утята – не видны. Через какой-то время, утка пролезла сквозь решётку назад и улетела, но временами возвращалась – очевидно, искала утят по окрестностям.<br />
<br />
Присутствующие люди, оказывается, на тот момент уже вызвали МЧС. Приехали ребята, спустились в воду, с фонарём светили за решётку, но срывать решётку или замок на калитке не решились. Звонили кому-то, но толку – чуть. Через время посветили за решётку ещё раз, и сказали, что на этой стороне их нет, и уехали.<br />
<br />
Утка, надо сказать, тоже куда-то пропала. Мы подумали и отправились в так называемую "Швейцарскую долину", где из канализации снова на поверхность вырывается этот самый ручеёк, образуя широкую, и, похоже, даже глубокую, заводь.<br />
<br />
А там эта утка и один спасшийся утёнок!<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFWZJkcJbxEyQsmR3F2THrghs_a3urDq-MAlDaXRYMBu9JMjQGOJ4a0zgh0w4Lr2GL_R-Opdko0tdrpj0glmocchLBRSm7C7VlprTxI3X3MUskY2MdJvZau13EwdMHfLh8nUq7TR3c8h0/s1600/2016-04-23+17.56.19.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="466" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFWZJkcJbxEyQsmR3F2THrghs_a3urDq-MAlDaXRYMBu9JMjQGOJ4a0zgh0w4Lr2GL_R-Opdko0tdrpj0glmocchLBRSm7C7VlprTxI3X3MUskY2MdJvZau13EwdMHfLh8nUq7TR3c8h0/s640/2016-04-23+17.56.19.jpg" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgePTFC_INnZvp5QcxTMf43XDAqmVcXaN7GY9ZlGO8_L9grj15ApuHLoSpmd5XYjYiAZSNgzcVArKUL9UB1XQjtl3Z1JOtup4YErPPvEbkm76j0JaoQb3rbutG-cT7oqmBLxQguhEWcI9c/s1600/2016-04-23+17.57.09.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="466" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgePTFC_INnZvp5QcxTMf43XDAqmVcXaN7GY9ZlGO8_L9grj15ApuHLoSpmd5XYjYiAZSNgzcVArKUL9UB1XQjtl3Z1JOtup4YErPPvEbkm76j0JaoQb3rbutG-cT7oqmBLxQguhEWcI9c/s640/2016-04-23+17.57.09.jpg" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0WiTZRIoV0Dt-AWV6QzykBW1C-E5SmLDSO7sMG2m63zLjfKoc0H-bTuO3pHCgJJ31d30kmRtEfR0mAKGahhahLFREUwkUuNNBtR5ocx704lOwDCzG-zqX_BDpYwkrtFXoYRBBQTN-mHc/s1600/2016-04-23+17.57.56.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="466" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0WiTZRIoV0Dt-AWV6QzykBW1C-E5SmLDSO7sMG2m63zLjfKoc0H-bTuO3pHCgJJ31d30kmRtEfR0mAKGahhahLFREUwkUuNNBtR5ocx704lOwDCzG-zqX_BDpYwkrtFXoYRBBQTN-mHc/s640/2016-04-23+17.57.56.jpg" width="640" /></a></div>
<br />
Однако же, оказалось, что МЧСники тоже уехали не домой, а на эту сторону. Мы сказали им про утку, и двое отважных героев отправились в канализацию. Спустя, опять же, какое-то время, они вернулись и один из них нёс в каске трёх утят.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmQbuD9MnifAuujsAah0CY9FPqWn0Hzi5jZT0vcnK7Kr94uZZskwdE_q6c2JGMASQ_9wMe_AjA69YZgFzvKC2TcICoozU50NcVojawPna2EvSnBO7ISRgtZwo3dzZvjcQfyuzlf_vTEpw/s1600/2016-04-23+18.01.30.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="472" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmQbuD9MnifAuujsAah0CY9FPqWn0Hzi5jZT0vcnK7Kr94uZZskwdE_q6c2JGMASQ_9wMe_AjA69YZgFzvKC2TcICoozU50NcVojawPna2EvSnBO7ISRgtZwo3dzZvjcQfyuzlf_vTEpw/s640/2016-04-23+18.01.30.jpg" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAz1kZzHJGINnOZsjMfmULUJguBrdnQQDN_FiWmRvJCkCGxME2pJmO3Xs7_joKXiXiHVRWla4mkT4Kuzojk5foeD9Vhyphenhyphen1uBooySEEdcYke6xpW7I94nLlsH4vueBnTCn9CFyKZ3JxD2YU/s1600/2016-04-23+18.01.33.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="472" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAz1kZzHJGINnOZsjMfmULUJguBrdnQQDN_FiWmRvJCkCGxME2pJmO3Xs7_joKXiXiHVRWla4mkT4Kuzojk5foeD9Vhyphenhyphen1uBooySEEdcYke6xpW7I94nLlsH4vueBnTCn9CFyKZ3JxD2YU/s640/2016-04-23+18.01.33.jpg" width="640" /></a></div>
<br />
Поверьте мне на слово, их там трое.<br />
<br />
Ребята сказали, что везде дальше решётки, и, самое главное, никто не пищит больше. Такие дела. И вот, сотрудник МЧС отправился выпускать утят, и счастливые малыши рванули к маме. Кстати, я никогда не подозревал, насколько быстро плавают утята.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWxjr3U6HjkD-3rb9KHGzE73mRI8FWDo6-cjP9eAFarnRDAkzv3h5c7DjtLbW_DgjH8vHGPW5PJXid0Q_Y-ZdSccneG7grSFB_90PENWBQq0JO8V6rHXOiJ-nWGXaa2fB7cB0CumUBy5E/s1600/2016-04-23+18.02.59.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="466" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWxjr3U6HjkD-3rb9KHGzE73mRI8FWDo6-cjP9eAFarnRDAkzv3h5c7DjtLbW_DgjH8vHGPW5PJXid0Q_Y-ZdSccneG7grSFB_90PENWBQq0JO8V6rHXOiJ-nWGXaa2fB7cB0CumUBy5E/s640/2016-04-23+18.02.59.jpg" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsqFpzBE90HBpqUJZFvWBYu5WCmXQDtUOFWH4aqwjCBxjf3fz_7giJjsCmBCLnNy-HSCkzid6Dw6xrG6aNbffqnsPlPsCELO3SZxMNntgCibzqxctGNSdVOyuUIVsQ2BwFMFspdn99DRU/s1600/2016-04-23+18.03.05.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="466" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsqFpzBE90HBpqUJZFvWBYu5WCmXQDtUOFWH4aqwjCBxjf3fz_7giJjsCmBCLnNy-HSCkzid6Dw6xrG6aNbffqnsPlPsCELO3SZxMNntgCibzqxctGNSdVOyuUIVsQ2BwFMFspdn99DRU/s640/2016-04-23+18.03.05.jpg" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSY83QDHw9E3X2hmvwkHTljRGaWs-EzxJ4ytZ2_4zbQVc2rbowlpm-6Y1Wdq4NLGsXzXSmZHYK3DBxinVq836vO69nfiOaHxALplUuMZFkIzCEj1ptKOF5vyWLXUGFhfJ0hs4vMB9QKsQ/s1600/2016-04-23+18.03.14.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="466" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSY83QDHw9E3X2hmvwkHTljRGaWs-EzxJ4ytZ2_4zbQVc2rbowlpm-6Y1Wdq4NLGsXzXSmZHYK3DBxinVq836vO69nfiOaHxALplUuMZFkIzCEj1ptKOF5vyWLXUGFhfJ0hs4vMB9QKsQ/s640/2016-04-23+18.03.14.jpg" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0M4eX2aGLusVe5q0AiVT_gUNw0VNWVwa55PZgwm0j2Q-7Lh6DaJQQyXfhx7CRxsg5o2tEMqhW1wimrnmhswVzpKEbc8VG-9xRTqcG6XYmSSUqldZB_qXxjHlbRSOKiZC1CAYl79EMOPM/s1600/2016-04-23+18.03.29.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="466" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0M4eX2aGLusVe5q0AiVT_gUNw0VNWVwa55PZgwm0j2Q-7Lh6DaJQQyXfhx7CRxsg5o2tEMqhW1wimrnmhswVzpKEbc8VG-9xRTqcG6XYmSSUqldZB_qXxjHlbRSOKiZC1CAYl79EMOPM/s640/2016-04-23+18.03.29.jpg" width="640" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcrTrNJhngirJka-XkyzTUAYnUDhy4XWdySFHwUjbFr3X-FIxxW7sVXdDrQ37dGDvR-v3Mp3uv4cOIOkBXCk62aIXZNE1nGc-LWSs2gH8HcObu-VexBs97klRw6FpNDoW9FEVHEHV9FIs/s1600/2016-04-23+18.03.31.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="466" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcrTrNJhngirJka-XkyzTUAYnUDhy4XWdySFHwUjbFr3X-FIxxW7sVXdDrQ37dGDvR-v3Mp3uv4cOIOkBXCk62aIXZNE1nGc-LWSs2gH8HcObu-VexBs97klRw6FpNDoW9FEVHEHV9FIs/s640/2016-04-23+18.03.31.jpg" width="640" /></a></div>
<br />
МЧСники уехали, но чудеса не закончились. Мы стояли, обсуждая произошеднее, и тут я заметил, что к группе "мама-утята" стремительно плывёт ещё один утёнок. Я подумал, что это один из четверых, но нет. Это был пятый.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlz2DQCtGTaTcZefK0Txszu2xIkPICUKbPobE_79xB5LJnwMLgzrQPAFRI0hhewImqCrUm4kkGSwuKMfp1okSRQcTequT3-JzIzfU62GfLrax5oMqyD-LLbHv9gCopmEg8aLqPS0MgZ24/s1600/2016-04-23+18.15.09.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="466" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlz2DQCtGTaTcZefK0Txszu2xIkPICUKbPobE_79xB5LJnwMLgzrQPAFRI0hhewImqCrUm4kkGSwuKMfp1okSRQcTequT3-JzIzfU62GfLrax5oMqyD-LLbHv9gCopmEg8aLqPS0MgZ24/s640/2016-04-23+18.15.09.jpg" width="640" /></a></div>
<br />
Вот такая вот история. Когда я отошёл от этого озерца метров на десять, я увидел кое-что, что навело меня на мысли о дальнейшей судьбе утят.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1J2rPdyWxDQGASE5RlEi9VqY_2qFrz7N-cSemxYA7hFNKf40eNKw4VVgu86R0becF2WRZGtAphj5BRKZQftGwNoGQm4y9Cpanh8tTtXWe6nZwyjq-GMb1FKKxzQOx3Kq7QbMkQ4XezCA/s1600/2016-04-23+18.24.25.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="466" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1J2rPdyWxDQGASE5RlEi9VqY_2qFrz7N-cSemxYA7hFNKf40eNKw4VVgu86R0becF2WRZGtAphj5BRKZQftGwNoGQm4y9Cpanh8tTtXWe6nZwyjq-GMb1FKKxzQOx3Kq7QbMkQ4XezCA/s640/2016-04-23+18.24.25.jpg" width="640" /></a></div>
<br />
Но я надеюсь, мама утка будет внимательна и уследит.<br />
<br />
Да, нашлись люди, которые по этому ручейку проследили путь этого утиного семейства от железнодорожного вокзала. А надо сказать, что возле железнодорожного вокзала у нас в городе находится зоопарк.<br />
<br />
В зоопарк я звонил, но не дозвонился директору. Получилось дозвониться только на пост охраны. Там меня заверили, что "нам очень важен ваш звонок ©", но "это не наша утка" и "с хохолком это дикие перелётные, они у нас иногда бывают". Породу-то на тот момент я ещё не идентифицировал.<br />
<br />
<div class="p1">
Вид включён в Приложение II Директивы ЕС по охране редких птиц, Приложение III Бернской конвенции, Приложение II Боннской конвенции. Внесён в Красную книгу Латвии, Красную книгу Республики Беларусь. Так что, буду теперь директору звонить, может, он окажется способным взять на себя ответственность. Надеюсь, их оттуда заберут.<br />
<br />
Обновление про вид утки. Знающие люди говорят, что в период гнездования, то есть, с выводком, у нас среднего крохаля просто не могло быть. Может быть, наверно, это большой крохаль, тоже редкая утка, но не настолько. Мы решили, что это средний крохаль на том основании, что клюв у утки вроде бы был на конце прямой, а у большого крохаля клюв на конце загнут. Но мы, конечно же, можем ошибаться.<br />
<br />
Продолжение: <a href="http://dimoneverything.blogspot.com.by/2016/04/2.html">http://dimoneverything.blogspot.com.by/2016/04/2.html</a></div>
</div>
Anonymoushttp://www.blogger.com/profile/17152157727140681943noreply@blogger.com1tag:blogger.com,1999:blog-6138770299473511818.post-15196012328531113202015-12-08T16:34:00.002+02:002015-12-08T16:36:31.813+02:00Почему стоит заглядывать на кладбище или Систематическая ошибка выжившего<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEispcSkR2RC_rmgCH-VLM0UnzH1fzPvWassUEqWatzV69jujX4dtIKmAoeUG_C6xfdFtvUzdFQHYHMud-PfCIK1sPeZXZM_q9nh2cb4zHcnqqooI2TYwMbCDqpE4gC1rr8OcOe_9pr1iag/s1600/image01___.jpg" imageanchor="1"><img border="0" height="213" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEispcSkR2RC_rmgCH-VLM0UnzH1fzPvWassUEqWatzV69jujX4dtIKmAoeUG_C6xfdFtvUzdFQHYHMud-PfCIK1sPeZXZM_q9nh2cb4zHcnqqooI2TYwMbCDqpE4gC1rr8OcOe_9pr1iag/s320/image01___.jpg" width="320" /></a></div>
<br />
Начал читать "Искусство ясно мыслить" Рольфа Добелли. Это книга о самых распространённых когнитивных искажениях, или системных и предсказуемых ошибках нашей психики, знание которых помогает реже ошибаться. Прочитав первую же главу понял, что хочу этим поделиться. Соответственно, решил делать любительский перевод этой книги по главам, благо, главы очень короткие. Итак, "Почему стоит заглядывать на кладбище или Систематическая ошибка выжившего".<br />
<br />
Куда бы Рик не взглянул, он видит рок-звёзд. Они в телевизоре, на обложках журналов, выступают на концертах и тусуются на фан-сайтах. Их песни он слышит везде: в супермаркете, в своём плейлисте, в тренажёрном зале. Рок-звёзды повсюду. Их тьмы. И все они успешны. Пребывая в восхищении от бесчисленных историй успеха героев гитары, Рик создаёт свою группу. Станет ли она известной? Вероятность этого лишь на очень малое значение отличается от нуля. Как и многие до него, Рик, скорее всего, закончит свой музыкальный путь на кладбище неудавшихся музыкантов. Надгробий на этом кладбище в десятки тысяч раз больше, чем на сцене, но прессу не интересуют провалы – за исключением провалов звёзд. Это делает кладбище невидимым для окружающих.<br />
<br />
Поскольку триумфы намного заметнее провалов, в повседневной жизни вы систематически переоцениваете свои шансы на успех. Глядя со стороны, вы (как и Рик) подвержены иллюзии, и вы не видите, сколь миниатюрен ваш шанс на успех. Рик, как и многие другие, подвержен систематической ошибке выжившего.<br />
<br />
За каждым популярным автором стоят сотни других людей, чьи книги не продаются. За каждым из них, в свою очередь, стоят сотни тех, кто не смог найти издателя. За каждым из этих – сотни тех, чьи книги пылятся в столе. За каждым из этих – сотни тех, кто не дописал свою первую книгу до конца. И за каждым из таких уже стоят сотни людей, которые мечтают когда-нибудь написать книгу. А вы слышите только об успешных авторах, многие из которых на сегодняшний день издают книги на свои собственные деньги, и не в состоянии определить, насколько маловероятен литературный успех. То же самое у фотографов, предпринимателей, художников, спортсменов, архитекторов, лауреатов Нобелевской премии, телеведущих и победительниц конкурсов красоты. СМИ не интересуют раскопки кладбищ в поисках неудачников. Чтобы устранить систематическую ошибку выжившего, копать придётся вам.<br />
<br />
Ошибка выжившего ждёт вас в денежных вопросах: вот, ваш друг начинает предпринимательскую деятельность. Вы его потенциальный инвестор или партнёр и чувствуете: это может быть новый Гугл. Может, удача на вашей стороне. Но реальность в том, что наиболее ожидаемый результат – это то, что компания даже не стартует. Второй наиболее вероятный исход – банкротство в ближайшие 3 года. Из тех компаний, которые переживают первые три года, большинство никогда не вырастают более, чем до десяти сотрудников. Что, получается нужно никогда не рисковать тяжело заработанными деньгами и никогда не рисковать увольняться с основной работы? Да нет, не обязательно. Но вы всегда должны распознавать ошибку выжившего, искажающую вероятность успеха, как приближающая линза.<br />
<br />
Возьмём американский индекс Доу Джонса. Он состоит из тех самых выживших. Малый бизнес и тем более обанкротившиеся на старте вообще никогда там не появляются, и всё же таковых большинство. Индекс фондового рынка не является индикатором экономики в стране. Точно так же газеты не пишут обо всех музыкантах. Огромное количество книг об успехе тоже должно внушать скепсис: провалившиеся не пишут книг о своих провалах.<br />
<br />
Ошибка выжившего особенно ярко проявляется, когда вам удаётся попасть в команду "победителя". Даже если ваш успех – чистая случайность, вы всё ещё найдёте общее с другими победителями и вам захочется считать это "факторами успеха". Однако, если вы таки навестите кладбище провалившихся, вы осознаете, что его обитатели делали то же самое и имели те же черты, которые, как вам кажется, привели вас к успеху.<br />
<br />
Если достаточно много учёных займутся исследованием чего угодно, некоторые из исследований предоставят статистически значимую корреляцию между действиями и результатами, хотя причинно-следственной связи там нет вообще – чистое совпадение. Например, связь между употреблением красного вина и ожидаемой продолжительностью жизни. Такие ложные исследования немедленно привлекают всеобщее внимание и становятся популярными. В результате вы не прочитаете об исследованиях с правильными, но "скучными" результатами.<br />
<br />
Систематическая ошибка выжившего означает следующее – люди систематически переоценивают свои шансы на успех. Защищайтесь от этого, посещая могилы многообещающих людей и проектов. Это будут печальные прогулки, но они прочитят ваш разум.<br />
<br />
От переводчика: не совсем согласен с трактовкой систематической ошибки выжившего, но правильная трактовка в тексте тоже звучит. А именно, из-за того, что мы видим только победителей, мы неверно определяем факторы, которые привели их к успеху. На кладбище полно провалившихся, которые делали то же самое.</div>
Anonymoushttp://www.blogger.com/profile/17152157727140681943noreply@blogger.com0tag:blogger.com,1999:blog-6138770299473511818.post-21641160692010794222015-08-28T15:15:00.003+03:002015-11-10T16:33:33.439+02:00Гибкая методология разработки и правдоподобное отрицание<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEio0ps0GYq1l1smFCueFnqsuRLhbkRcOAQOdyx2grO2XHx6h0jB0HTKqCezr8LtZaIMG4a9AsQwcErmw6zWsk9S80OvzPPtGij1u8hsg9lFS5w3SUKqufsg7Fx1SHxjawR_jPmtzvDXk6M/s1600/services_efficiency.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="288" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEio0ps0GYq1l1smFCueFnqsuRLhbkRcOAQOdyx2grO2XHx6h0jB0HTKqCezr8LtZaIMG4a9AsQwcErmw6zWsk9S80OvzPPtGij1u8hsg9lFS5w3SUKqufsg7Fx1SHxjawR_jPmtzvDXk6M/s320/services_efficiency.jpg" width="320" /></a></div>
<pre style="white-space: pre-wrap; word-wrap: break-word;"><div style="text-align: right;">
<i>– За последний месяц он побеседовал с каждым из своих учеников. Своего рода передача последней крупицы мудрости.</i></div>
<i>
</i><div style="text-align: right;">
<i>– И какой же последней крупицей мудрости он поделился с тобой? – спросил я. – Ну, то есть если это не секрет… или не что-то такое, слишком личное.</i></div>
<i>
Энея улыбнулась:
</i><div style="text-align: right;">
<i>– Напомнил, что заказчик непременно заплатит вдвое больше, если сообщать о дополнительных расходах постепенно и только после того, как будет заложен фундамент и конструкция начнет обретать форму. Он сказал, что тогда отступать уже некуда, и клиент не сорвется с крючка.</i></div>
<div style="text-align: right;">
<i>Дэн Симмонс, Восход Эндимиона.</i></div>
</pre>
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px; line-height: 22.3999996185303px;"><br /></span>
<br />
<div style="text-align: justify;">
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px; line-height: 22.3999996185303px;">Правдоподобное отрицание (plausible deniability) – поведение, при котором лицо, совершившее действие или отдавшее распоряжение, сохраняет возможность в дальнейшем отрицать свою вовлечённость без большого риска быть уличённым во лжи.</span></div>
<div style="text-align: justify;">
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px; line-height: 22.3999996185303px;"><br /></span></div>
<div style="text-align: justify;">
<span style="color: #252525; font-family: sans-serif;"><span style="background-color: white; font-size: 14px; line-height: 22.3999996185303px;">Тут подумалось, что вся реализация гибкого процесса разработки, которую я встречал в жизни – об этом.</span></span></div>
<div style="text-align: justify;">
<span style="color: #252525; font-family: sans-serif;"><span style="background-color: white; font-size: 14px; line-height: 22.3999996185303px;"><br /></span></span></div>
<div style="text-align: justify;">
<span style="color: #252525; font-family: sans-serif;"><span style="background-color: white; font-size: 14px; line-height: 22.3999996185303px;">Например, приходит человек и говорит, что ему нужен проект, который будет делать то и это, и будет стоить шестьдесят тысяч долларов. А мы рассказываем ему, что мы работаем по гибкой методологии. Это когда мы придумываем список задач, так, что после выполнения их всех получится проект. Потом оцениваем, сколько времени займёт каждая из них. Потом выбираем задач на первую итерацию (допустим, неделю) и делаем. Заказчик проверяет нашу работу, оценивая результат выполнения каждой из задач. Если что-то недоделано / сделано не так, просит переделать. В итоге, как мы это называем, "принимает" задачу, говоря, что тем. что мы сделали в рамках этой задачи, он доволен. Потом выбираем задач на вторую итерацию. Смыть, повторить.</span></span></div>
<div style="text-align: justify;">
<span style="color: #252525; font-family: sans-serif;"><span style="background-color: white; font-size: 14px; line-height: 22.3999996185303px;"><br /></span></span></div>
<div style="text-align: justify;">
<span style="color: #252525; font-family: sans-serif;"><span style="background-color: white; font-size: 14px; line-height: 22.3999996185303px;">Самое главное – список задач на итерацию тоже составляет заказчик. И они не обязаны быть из изначального набора – заказчик может добавлять по ходу дела, может удалять старые, не пошедшие в ход задачи и так далее. Это даёт возможность корректировать направление движения в связи с вновь открытыми обстоятельствами – заказчик видит, что у него получается по ходу дела, и может поменять планы.</span></span></div>
<div style="text-align: justify;">
<span style="color: #252525; font-family: sans-serif;"><span style="background-color: white; font-size: 14px; line-height: 22.3999996185303px;"><br /></span></span></div>
<div style="text-align: justify;">
<span style="color: #252525; font-family: sans-serif;"><span style="background-color: white; font-size: 14px; line-height: 22.3999996185303px;">Как вы думаете, есть ли у клиента таким образом шанс получить то, что он хотел тогда, когда он хотел?</span></span></div>
<div style="text-align: justify;">
<span style="color: #252525; font-family: sans-serif;"><span style="background-color: white; font-size: 14px; line-height: 22.3999996185303px;"><br /></span></span></div>
<div style="text-align: justify;">
<span style="color: #252525; font-family: sans-serif;"><span style="background-color: white; font-size: 14px; line-height: 22.3999996185303px;">При этом, виноват клиент. Он вносил дополнительные правки. Он затягивал процесс сдачи каждой отдельной задачи, придираясь к мелочам. Он менял направление движения столько раз, что уже через месяц-два любые его претензии о несоответствии сроков (то есть, бюджета) изначально заявленным, абсолютно беспочвенны – мы делаем не тот проект, который обещали сделать за шестьдесят тысяч. А за всё, что мы сделали, он уже расписался, что мы сделали хорошо и правильно – приняв сделанные задачи. Клиент действительно не может выдвинуть никаких честных и справедливых претензий по поводу того, что мы обещали сделать его проект за указанный срок, срок прошёл, а проекта нет. Понимаете, это он виноват!</span></span></div>
<div style="text-align: justify;">
<span style="color: #252525; font-family: sans-serif;"><span style="background-color: white; font-size: 14px; line-height: 22.3999996185303px;"><br /></span></span></div>
<div style="text-align: justify;">
<span style="color: #252525; font-family: sans-serif;"><span style="background-color: white; font-size: 14px; line-height: 22.3999996185303px;">А для того, чтобы в срок получить то, что хочешь, по такой системе, нужно быть адски дисциплинированным заказчиком. Битым, опытным, с развитым самоконтролем и хладнокровным – то есть, таким, которые крайне редко оказываются создателями стартапов, с просьбами создать которые к нам, разработчикам и обращаются обычно.</span></span></div>
<div style="text-align: justify;">
<span style="color: #252525; font-family: sans-serif;"><span style="background-color: white; font-size: 14px; line-height: 22.3999996185303px;"><br /></span></span></div>
<div style="text-align: justify;">
<span style="color: #252525; font-family: sans-serif;"><span style="background-color: white; font-size: 14px; line-height: 22.3999996185303px;">Большая часть проектов заканчивается по исчерпанию бюджета заказчика. А точнее, по исчерпанию 3-10 изначально заявленных бюджетов, то есть, когда у заказчика действительно заканчиваются деньги. И виноват в этом заказчик.</span></span></div>
<div style="text-align: justify;">
<span style="color: #252525; font-family: sans-serif;"><span style="background-color: white; font-size: 14px; line-height: 22.3999996185303px;"><br /></span></span></div>
<div style="text-align: justify;">
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px; line-height: 22.3999996185303px;">Кент Бек – в</span><span style="color: #252525; font-family: sans-serif;"><span style="background-color: white; font-size: 14px; line-height: 22.3999996185303px;">еликий человек. Продал заказчикам мысль о том, что экстремальное программирование, из которого и выросла гибкая методология разработки – это что-то, что нужно и полезно именно им.</span></span></div>
<div style="text-align: justify;">
<span style="color: #252525; font-family: sans-serif;"><span style="background-color: white; font-size: 14px; line-height: 22.3999996185303px;"><br /></span></span></div>
<div style="text-align: justify;">
<span style="color: #252525; font-family: sans-serif;"><span style="background-color: white; font-size: 14px; line-height: 22.3999996185303px;">Компания всячески пытается улучшить ключевые показатели такого процесса ведения проектов, требуя этого от разработчиков и применяя материальное стимулирование. Ключевыми же являются показатели, которые улучшают нашу способность правдоподобно отрицать. Это закрытые истории – всемерное уменьшение количества незакрытых историй. Это постоянное уведомление заказчика о пересмотре оценок – мол, ты же понял, что после твоих изменений мы теперь будет это делать на два дня дольше? Это обязательные ежедневные отчёты – сегодня я делал то-то и то-то. И потом если что – ну он же получал ежедневные отчёты о работе и принимал выполненную работу и соглашался с оценками.</span></span></div>
<div style="text-align: justify;">
<span style="color: #252525; font-family: sans-serif;"><span style="background-color: white; font-size: 14px; line-height: 22.3999996185303px;"><br /></span></span></div>
<div style="text-align: justify;">
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px; line-height: 22.3999996185303px;">Как разработчик я всячески приветствую гибкую методологию в аутсорсе. Она позволяет </span><span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px; line-height: 22.3999996185303px;">продавать свою работу по максимуму и поддерживать стабильный денежный поток.</span></div>
<div style="text-align: justify;">
<span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px; line-height: 22.3999996185303px;"><br /></span></div>
<div style="text-align: justify;">
<span style="background-color: white; font-size: 14px; line-height: 22.3999996185303px;"><span style="color: #252525; font-family: sans-serif;">Дисклеймеры:</span></span></div>
<div style="text-align: justify;">
<span style="background-color: white; font-size: 14px; line-height: 22.3999996185303px;"><span style="color: #252525; font-family: sans-serif;"><br /></span></span></div>
<div style="text-align: justify;">
</div>
<ol>
<li><span style="color: #252525; font-family: sans-serif;"><span style="background-color: white; font-size: 14px; line-height: 22.3999996185303px;">Может показаться, что я говорю это так, как будто это что-то плохое. Это не совсем так. Я понимаю, что разработчику гораздо комфортнее при такой системе, и что я разработчик я тоже понимаю. Но чем-то от этого попахивает. Наверно тем, что сначала заказчику вообще оценивают проект целиком, а не говорят сразу, что он получит неизвестно что неизвестно когда.<br />Хорошее резюме из комментариев: "</span><span style="font-size: 14px; line-height: 22.3999996185303px;">Фактически, используя аджайл и оценив матерость заказчика на этапе собеседования, можно сказать проект провалится или нет. Получается, что исполнитель заранее подписывается на проект, который в итоге окажется провальным и в этом несомненно будет виноват заказчик, потому что исполнитель матерый, а заказчик -- нет."</span></span></li>
<li><span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px; line-height: 22.3999996185303px;">Нет, я не знаю, как лучше. Фиксированная цена звучит честнее, но там возникают проблемы с определением понятия "сделано".</span></li>
<li><span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px; line-height: 22.3999996185303px;">Да, я знаю, что при классическом "водопаде" тоже проваливаются проекты. Но там я могу увидеть шанс, что проект состоится, если команда сделает всё правильно. А здесь посредством дисперсии ответственности любая команда не может обеспечить успешную сдачу проекта в срок – только дисциплина заказчика может дать шанс на это. С другой стороны в провале "водопадного" проекта всегда виновата команда, а в провале "гибкого" – заказчик.</span></li>
</ol>
<div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg06iOOIaeXB1PDtcvHMcFf1PSrwUiKZn31zJ_yu14Ptf2Z5hPkv6YpTTTtFl_h5REuw4T20Q-fmVPhcgiKgBzU54LCdFAHZp9mFLRMlYFtQr9O7lBEYkAU5-1YvgwSD7gttVBMT-iUkDE/s1600/CNRsMteVEAAqy9j.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="377" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg06iOOIaeXB1PDtcvHMcFf1PSrwUiKZn31zJ_yu14Ptf2Z5hPkv6YpTTTtFl_h5REuw4T20Q-fmVPhcgiKgBzU54LCdFAHZp9mFLRMlYFtQr9O7lBEYkAU5-1YvgwSD7gttVBMT-iUkDE/s640/CNRsMteVEAAqy9j.png" width="640" /></a></div>
<span style="background-color: white; font-size: 14px; line-height: 22.3999996185303px;"><span style="color: #252525; font-family: sans-serif;"><br /></span></span>
<span style="background-color: white; font-size: 14px; line-height: 22.3999996185303px;"><span style="color: #252525; font-family: sans-serif;"><br /></span></span></div>
<div style="text-align: justify;">
<span style="background-color: white; font-size: 14px; line-height: 22.3999996185303px;"><span style="color: #252525; font-family: sans-serif;">Ссылки:</span></span></div>
<div style="text-align: justify;">
<span style="background-color: white; font-size: 14px; line-height: 22.3999996185303px;"><span style="color: #252525; font-family: sans-serif;"><br /></span></span></div>
<div style="text-align: justify;">
</div>
<ol>
<li><a href="https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B0%D0%B2%D0%B4%D0%BE%D0%BF%D0%BE%D0%B4%D0%BE%D0%B1%D0%BD%D0%BE%D0%B5_%D0%BE%D1%82%D1%80%D0%B8%D1%86%D0%B0%D0%BD%D0%B8%D0%B5" style="font-family: sans-serif; font-size: 14px; line-height: 22.3999996185303px;">Правдоподобное отрицание</a><span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px; line-height: 22.3999996185303px;">.</span></li>
<li><a href="https://ru.wikipedia.org/wiki/%D0%93%D0%B8%D0%B1%D0%BA%D0%B0%D1%8F_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%8F_%D1%80%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B8" style="font-family: sans-serif; font-size: 14px; line-height: 22.3999996185303px;">Гибкая методология разработки</a><span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px; line-height: 22.3999996185303px;">.</span></li>
<li><a href="https://ru.wikipedia.org/wiki/%D0%AD%D0%BA%D1%81%D1%82%D1%80%D0%B5%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5" style="font-family: sans-serif; font-size: 14px; line-height: 22.3999996185303px;">Экстремальное программирование</a><span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px; line-height: 22.3999996185303px;">.</span></li>
<li><span style="background-color: white; color: #252525; font-family: sans-serif; font-size: 14px; line-height: 22.3999996185303px;"><a href="https://ru.wikipedia.org/wiki/%D0%9A%D0%B0%D1%81%D0%BA%D0%B0%D0%B4%D0%BD%D0%B0%D1%8F_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C">Каскадная модель</a>.</span></li>
<li><span style="color: #252525; font-family: sans-serif;"><span style="background-color: white; font-size: 14px; line-height: 22.3999996185303px;"><a href="https://ru.wikipedia.org/wiki/%D0%9F%D0%B5%D1%81%D0%BD%D0%B8_%D0%93%D0%B8%D0%BF%D0%B5%D1%80%D0%B8%D0%BE%D0%BD%D0%B0">Песни Гипериона (эпиграф)</a>.</span></span></li>
</ol>
</div>
Anonymoushttp://www.blogger.com/profile/17152157727140681943noreply@blogger.com6tag:blogger.com,1999:blog-6138770299473511818.post-13984993073892618882015-04-27T20:09:00.002+03:002015-04-28T08:21:26.996+03:00Rails authentication routing constraints considered harmful<div dir="ltr" style="text-align: left;" trbidi="on">
Давно не писал в блог, а надо. Попробую писать почаще.<br />
<br />
Этот пост из серии <a href="http://en.wikipedia.org/wiki/Considered_harmful">Considered harmful</a>, в которой я буду рассказывать о том, как не надо делать. То есть, о вещах, которые нам предлагают делать, которые, на первый взгляд, приносят какие-то плюшки, но которые в итоге приходится убирать или с которыми приходится мучиться.<br />
<br />
Сегодня мы поговорим о реализации аутентификационных запретов посредством ограничений в маршрутном файле. Уф. В общем, о authentication routing constraints.<br />
<br />
<h3 style="text-align: left;">
Проблема</h3>
Реализация аутентификации в приложении требует способ задания запретов. Способ сказать в приложении "а вот сюда можно только залогиненным пользователям".<br />
<br />
<h3 style="text-align: left;">
Решение</h3>
<br />
Каждая библиотечка аутентификации в мире Рельсов, работающая на уровне контроллеров, считает своим долгом предложить своему пользователю routing constraint. Примеры:<br />
<br />
<br />
<ul style="text-align: left;">
<li><a href="https://github.com/plataformatec/devise">Devise</a><br /><pre style="background-color: #f7f7f7; border-radius: 3px; box-sizing: border-box; color: #333333; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 11.8999996185303px; font-stretch: normal; line-height: 1.45; overflow: auto; padding: 16px; word-break: normal; word-wrap: normal;">authenticated <span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">:user</span> <span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">do</span>
resources <span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">:posts</span>
<span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">end</span></pre>
</li>
<li><a href="https://github.com/thoughtbot/clearance">Clearance</a><br /><pre style="background-color: #f7f7f7; border-radius: 3px; box-sizing: border-box; color: #333333; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 11.8999996185303px; font-stretch: normal; line-height: 1.45; overflow: auto; padding: 16px; word-break: normal; word-wrap: normal;">constraints <span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">Clearance</span>::<span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">Constraints</span>::<span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">SignedIn</span>.<span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">new</span> <span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">do</span>
resources <span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">:posts</span>
<span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">end</span></pre>
</li>
<li><a href="https://github.com/halogenandtoast/monban">Monban</a><br /><pre style="background-color: #f7f7f7; border-radius: 3px; box-sizing: border-box; color: #333333; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 11.8999996185303px; font-stretch: normal; line-height: 1.45; overflow: auto; padding: 16px; word-break: normal; word-wrap: normal;">constraints <span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">Monban</span>::<span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">Constraints</span>::<span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">SignedIn</span>.<span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">new</span> <span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">do</span>
resources <span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">:posts</span>
<span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">end</span></pre>
</li>
</ul>
<div>
Ну, вы поняли. </div>
<div>
<br /></div>
<div>
Работает это следующим образом – роутинговая система Рельсов позволяет на маршрут задавать условие, при невыполнении которого маршрут просто не сработает. Пример из Рельсов: </div>
<div>
<br /></div>
<div>
<pre style="background-color: #f7f7f7; border-radius: 3px; box-sizing: border-box; color: #333333; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 11.8999996185303px; font-stretch: normal; line-height: 1.45; overflow: auto; padding: 16px; word-break: normal; word-wrap: normal;"><span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">class</span> <span class="pl-en" style="box-sizing: border-box; color: #795da3;">BlacklistConstraint</span>
<span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">def</span> <span class="pl-en" style="box-sizing: border-box; color: #795da3;">initialize</span>
<span class="pl-smi" style="box-sizing: border-box;">@ips</span> <span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">=</span> <span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">Blacklist</span>.retrieve_ips
<span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">end</span>
<span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">def</span> <span class="pl-en" style="box-sizing: border-box; color: #795da3;">matches?</span>(<span class="pl-smi" style="box-sizing: border-box;">request</span>)
<span class="pl-smi" style="box-sizing: border-box;">@ips</span>.include?(request.remote_ip)
<span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">end</span>
<span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">end</span>
<span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">Rails</span>.application.routes.draw <span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">do</span>
get <span class="pl-s" style="box-sizing: border-box; color: #183691;"><span class="pl-pds" style="box-sizing: border-box;">'</span>*path<span class="pl-pds" style="box-sizing: border-box;">'</span></span>, <span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">to:</span> <span class="pl-s" style="box-sizing: border-box; color: #183691;"><span class="pl-pds" style="box-sizing: border-box;">'</span>blacklist#index<span class="pl-pds" style="box-sizing: border-box;">'</span></span>,
<span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">constraints:</span> <span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">BlacklistConstraint</span>.<span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">new</span>
<span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">end</span></pre>
</div>
<div>
<br /></div>
<div>
Если ограничение отвергает запрос, роутинговая система не учитывает этот маршрут и переходит к следующему, а по достижении конца файла – бросает <span style="font-family: Courier New, Courier, monospace;">RoutingError</span>, который приводит к ответу 404: страница не найдена.</div>
<div>
<br /></div>
<div>
Подробнее об этом можно прочитать в <a href="http://guides.rubyonrails.org/routing.html#advanced-constraints">гайдах по рельсам</a>. Можно даже <a href="http://www.rusrails.ru/rails-routing#prodvinutye-ogranicheniya">на русском языке</a>.</div>
<div>
<br /></div>
<h3 style="text-align: left;">
Почему плохо</h3>
<div>
<br /></div>
<div>
Этот подход поначалу кажется прекрасной альтернативой написанию в контроллере чего-то вроде <span style="font-family: Courier New, Courier, monospace;">before_action :authenticate_user!</span>. Вот всё то же самое, но не нужно разбивать это по отдельным файлам контроллеров или выбирать подходящий базовый контроллер. Всё красиво записано именно там, где это нужно – в файле маршрутов. И вы именно так к этому и относитесь: как к замене <span style="font-family: Courier New, Courier, monospace;">authenticate_user!</span>.</div>
<div>
<br /></div>
<div>
Однако, это не так. Дело в том, что <span style="font-family: Courier New, Courier, monospace;">authenticate_user!</span> и ему подобные в случае, если пользователь незалогинен, не отдают пользователю 404. Они перенаправляют пользователя на страницу ввода логина-пароля с сообщением "вы не вошли в систему", а после успешного входа ещё чаще всего возвращают назад.</div>
<div>
<br /></div>
<div>
А вот routing constraints именно что возвращают 404. И это очень неудобно для пользователя. Потёр он сессию в браузере, зашёл на привычную страницу и увидел "Страница не найдена". Вдобавок, "Страница не найдена" в Рельсах по умолчанию не содержит навигации, поэтому, нужно опять что-то набирать в адресной строке и пользователь совершенно не понимает, что происходит и куда он попал.</div>
<div>
<br /></div>
<div>
Заказчик просит это исправить, вы разбираетесь в проблеме, убираете routing constraints и раскидываете по контроллерам <span style="font-family: Courier New, Courier, monospace;">authenticate_user!</span>.</div>
<div>
<br /></div>
<h3 style="text-align: left;">
Что делать?</h3>
<div>
<br /></div>
<div>
На это есть два ответа: простой и правильный. Прежде всего, не используйте routing constraints и пишите <span style="font-family: Courier New, Courier, monospace;">authenticate_user!</span>. Это как минимум не идёт в разрез со стандартным способом делать вещи, и не доставляет проблем пользователю. Но есть и более правильный путь.</div>
<div>
<br /></div>
<h3 style="text-align: left;">
<span style="font-family: inherit;">Правильный ответ</span></h3>
<div>
<br /></div>
<div>
Дело в том, что проверка полномочий "гость или залогиненный пользователь" – всего лишь частный случай проверки полномочий в приложении вообще, то есть, авторизации. </div>
<div>
<br /></div>
<div>
Используйте библиотеку авторизации, такую, как <a href="https://github.com/CanCanCommunity/cancancan">CanCan</a> или <a href="https://github.com/elabs/pundit">Pundit</a>. Везде, всегда не глядя делайте <span style="font-family: Courier New, Courier, monospace;">authorize!</span> из этой библиотеки. Большинство из них позволяют потребовать, чтобы authorize выполнялся и бросить исключение, если этого не произошло.</div>
<div>
<br /></div>
<div>
При этом, нужно будет ещё отличить ситуацию "человеку сюда нельзя, потому что у него нет определённой роли" от ситуации "человеку сюда нельзя, потому что он не залогинился".</div>
<div>
<br /></div>
<div>
Тогда с одной стороны у вас будет нормально работающая аутентификационная система, а с другой – кому что можно будет описано в одном файле.</div>
<div>
<br /></div>
<div>
Пример для CanCan:</div>
<div>
<br /></div>
<div>
<ul style="text-align: left;">
<li>В контроллере (любом)<br /><pre style="background-color: #f7f7f7; border-radius: 3px; box-sizing: border-box; color: #333333; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 11.8999996185303px; font-stretch: normal; line-height: 1.45; overflow: auto; padding: 16px; word-break: normal; word-wrap: normal;"><span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">class</span> <span class="pl-en" style="box-sizing: border-box; color: #795da3;">ArticlesController<span class="pl-e" style="box-sizing: border-box;"> < ApplicationController</span></span>
load_and_authorize_resource
<span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">def</span> <span class="pl-en" style="box-sizing: border-box; color: #795da3;">show</span>
<span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">end</span>
<span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">end</span></pre>
</li>
<li>Вы можете указать ресурс и не обязаны его загружать:<br /><pre style="background-color: #f7f7f7; border-radius: 3px; box-sizing: border-box; color: #333333; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 11.8999996185303px; font-stretch: normal; line-height: 1.45; overflow: auto; padding: 16px; word-break: normal; word-wrap: normal;"><span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">class</span> <span class="pl-en" style="box-sizing: border-box; color: #795da3;">ArticlesController<span class="pl-e" style="box-sizing: border-box;"> < ApplicationController</span></span>
authorize_resource <span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">:articles</span>
<span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">def</span> <span class="pl-en" style="box-sizing: border-box; color: #795da3;">show</span>
<span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">end</span>
<span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">end</span></pre>
</li>
<li>Собственно, в том самом одном файле прав доступа:<br /><pre style="background-color: #f7f7f7; border-radius: 3px; box-sizing: border-box; color: #333333; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 11.8999996185303px; font-stretch: normal; line-height: 1.45; overflow: auto; padding: 16px; word-break: normal; word-wrap: normal;"><span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">class</span> <span class="pl-en" style="box-sizing: border-box; color: #795da3;">Ability</span>
<span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">include</span> <span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">CanCan</span>::<span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">Ability</span>
<span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">def</span> <span class="pl-en" style="box-sizing: border-box; color: #795da3;">initialize</span>(<span class="pl-smi" style="box-sizing: border-box;">user</span>)
<span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">if</span> user <span class="pl-c" style="box-sizing: border-box; color: #969896;"># права залогиненного пользователя</span>
can <span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">:manage</span>, <span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">:articles</span>
<span class="pl-c" style="box-sizing: border-box; color: #969896;"># ...</span>
<span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">else</span> <span class="pl-c" style="box-sizing: border-box; color: #969896;"># права незалогиненного пользователя (гостя)</span>
can <span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">:read</span>, <span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">:home</span>
<span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">end</span>
<span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">end</span>
<span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">end</span></pre>
<br />Понятно, что вы можете пользоваться CanCan'ом и по назначению, проверяя у уже залогиненного пользователя наличие определённых ролей.</li>
<li>Соль: чтобы при несоответствии полномочий незалогиненных пользователей перенаправлять на страницу логина, а если полномочия не соответствуют уже для залогиненного пользователя, показывать "доступ запрещён" (пример для Devise):<br /><pre style="background-color: #f7f7f7; border-radius: 3px; box-sizing: border-box; color: #333333; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 11.8999996185303px; font-stretch: normal; line-height: 1.45; overflow: auto; padding: 16px; word-break: normal; word-wrap: normal;"><span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">class</span> <span class="pl-en" style="box-sizing: border-box; color: #795da3;">ApplicationController<span class="pl-e" style="box-sizing: border-box;"> < ActionController::Base</span></span>
rescue_from <span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">CanCan</span>::<span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">AccessDenied</span> <span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">do </span>|<span class="pl-smi" style="box-sizing: border-box;">exception</span>|
<span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">if</span> user_signed_in?
redirect_to root_url, <span class="pl-c1" style="box-sizing: border-box; color: #0086b3;">:alert</span> => exception.message <span class="pl-c" style="box-sizing: border-box; color: #969896;"># доступ запрещён</span>
<span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">else</span>
authenticate_user! <span class="pl-c" style="box-sizing: border-box; color: #969896;"># перенаправление на страницу логина</span>
<span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">end</span>
<span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">end</span>
<span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">end</span></pre>
</li>
<li>Чтобы обязать себя всегда вызывать <span style="font-family: Courier New, Courier, monospace;">authorize</span>:<br /><pre style="background-color: #f7f7f7; border-radius: 3px; box-sizing: border-box; color: #333333; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 11.8999996185303px; font-stretch: normal; line-height: 1.45; overflow: auto; padding: 16px; word-break: normal; word-wrap: normal;"><span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">class</span> <span class="pl-en" style="box-sizing: border-box; color: #795da3;">ApplicationController<span class="pl-e" style="box-sizing: border-box;"> < ActionController::Base</span></span>
check_authorization
<span class="pl-k" style="box-sizing: border-box; color: #a71d5d;">end</span></pre>
</li>
</ul>
<h3 style="text-align: left;">
</h3>
<h3 style="text-align: left;">
Вывод</h3>
<div>
<br />
Для аутентификации не нужно использовать routing constraints. Если же всё же хочется отделить проверку полномочий от конкретных контроллеров и вытащить её в отдельный файл, всё встаёт на свои месте, если пользоваться библиотекой для авторизации. Что неудивительно, поскольку это – авторизация.</div>
<div>
<br /></div>
<h3 style="text-align: left;">
Дополнительно</h3>
</div>
<div>
<ul style="text-align: left;">
<li>Routing constraints – штука сама по себе хорошая. Пользуйтесь. Но не для аутентификации.</li>
<li>Библиотеки аутентификации, которые предлагают routing constraints – сами по себе хорошие. У них просят, они и предлагают. Вы не пользуйтесь. Они же не только это предлагают.</li>
</ul>
</div>
</div>
Anonymoushttp://www.blogger.com/profile/17152157727140681943noreply@blogger.com1tag:blogger.com,1999:blog-6138770299473511818.post-25070918619849264702015-03-24T15:37:00.002+02:002015-03-24T16:43:36.659+02:00Первая RubyConfBY – впечатления<div dir="ltr" style="text-align: left;" trbidi="on">
<h2 style="text-align: justify;">
<span style="font-size: large;">
Дорога</span></h2>
<div style="text-align: justify;">
Однажды я с тремя моими коллегами – Сашей, Вовой и Серёжей – собрались на на RubyConfBY в Минске. Поднялись мы рано утром в воскресенье, попрыгали в машину и поехали за триста километров послушать умных людей.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Тут надо сказать, что это первая подобная конференция в Беларуси. Мой опыт посещения таких мероприятий сводится к двум поездкам на Rubyshift в Киев и это довольно положительный опыт. Докладчики чаще всего интересные, больше половины тем занимательны, вопросы из зала тоже добавляют интереса. Опять же, видишь одномоментно больше программистов, чем за предыдущий год, и понимаешь, что ты такой не один – есть целая толпа подобных тебе задротов.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Итак, мы приехали в Минск. Навигатор в Яндекс.Картах привел нас на другой берег речки и предложил перебраться вплавь. Мы не сразу это поняли, а когда начали что-то подозревать, уверенно идущие впереди люди нас успокоили. "Наверно, они что-то знают", – подумали мы и спокойно пошли дальше.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Дальнейшие события показали, что люди впереди тоже шли по навигатору.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
К счастью, Саша вовремя заметил маячащий вдали пешеходный мост и мы пробежались в ту сторону. Дальше нам уже везло – идущая в ту же сторону, в которую показывал навигатор, толпа фриков с рюкзаками и неуловимой печатью на лице, говорящей "свои!" не могла оказаться никем иным, кроме таких же посетителей конференции по программированию. А ведь если бы не они, я бы мог и не решиться позвонить в эту дверь.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJgqL_OvFfug_cIxztwqU8nxLEnznssfX4Un1OyZX-JhnS90fO2Tgt7uABs0iQEB2broHmKiffG_moG-wX5ZQZpY4ChHh5l34mkj9Lv5d6rL75j0OHOnCgeQW9ztJRKyedqC2R5ccJAuA/s1600/2015-03-22+15.17.27.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJgqL_OvFfug_cIxztwqU8nxLEnznssfX4Un1OyZX-JhnS90fO2Tgt7uABs0iQEB2broHmKiffG_moG-wX5ZQZpY4ChHh5l34mkj9Lv5d6rL75j0OHOnCgeQW9ztJRKyedqC2R5ccJAuA/s1600/2015-03-22+15.17.27.jpg" height="480" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Немало подивившись столь экзотическому входу, мы прошли внутрь и были вознаграждены:</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVxrAtwqq1BK9yhNJT0GBg62I2qNPnD5ImQPvcZsdmC94fmxyxFUlu0TmmExHsPyiP5vvzF4VfckQGRvUCiFhqH4rpVdpPslDSL1fqGMwXlwKp6Vn0RfurSJbKVUBODsJptSh9dyytrkM/s1600/2015-03-22+10.56.18.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVxrAtwqq1BK9yhNJT0GBg62I2qNPnD5ImQPvcZsdmC94fmxyxFUlu0TmmExHsPyiP5vvzF4VfckQGRvUCiFhqH4rpVdpPslDSL1fqGMwXlwKp6Vn0RfurSJbKVUBODsJptSh9dyytrkM/s1600/2015-03-22+10.56.18.jpg" height="480" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<h2 style="clear: both; text-align: justify;">
<span style="font-size: large;">
Конференция</span></h2>
<div class="separator" style="clear: both; text-align: justify;">
Мы заранее знали, что мы опаздываем на первое выступление, но в итоге оказалось, что мы пришли аж на середину второго. Выступление было про статический анализ кода в Руби, средствами специальных гемов для метрик, делали это ребята из JetBrains, соответственно, с позиций разработчиков RubyMine и PyCharm. Что запомнилось, это отвага молодого человека, выходящего на конфереции рубистов, и заявляющего "Я работаю на Питоне, и хотел бы обрисовать разницу между этими языками и подходами". Однако же обошлось без крови.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
За ними вышел представитель главного спонсора этой конференции – компании Toptal – и в краткой приветственной речи стал зазывать к себе работать. Ну что делать, кто девушку ужинает, тот её и танцует.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Следующим был небезызвестный в Руби сообществе Божидар Батсов, активно продвигающий свой стандарт форматирования кода в Руби. Тут стоит сказать, что я уже давно хочу, чтобы в Руби сообществе появилось что-то похожее на PEP8 и столь же авторитетное, но думаю, что это безнадёжно. Одна из ценностей Руби, в отличие от Питона, гласит "должно быть много способов сделать это" – и по определению, любые подобные стандарты обречены быть уделом отдельных команд и проектов. А жаль.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
На выступление "Rails in production" мы возлагали массу надежд. Однако, оно оказалось некоей версией урока "Как оно в продакшене устроено" для чайников. Вот прямо капитан очевидность у кафедры. Как же я был удивлён, когда вопросы из зала вскрыли в выступающем профессионального и эрудированного девопса и администратора, работавшего с кучей интересных и сложных проблем и инструментов. Жалко, что он решил сделать выступление "Rails in production 101", а не сделать выступление из ответа на любой из этих вопросов.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Выступление "Почему мы увольняемся с работы" порадовало прикольным разбором ценностей agile manifesto.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHovJulQQGaFXE1GSKHZIuV8Xf8sEiBuSVzGMg1lJFcbAepDenrfFFgpXj_ZM9AjMMDAUfFiGLL0KpRUV1KLsUa6_enmW2w9uR2sVqjyDBYC-EjOLjbqVaijtzPsyOwfwz03USS1IeLyI/s1600/Screenshot+2015-03-24+16.01.04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHovJulQQGaFXE1GSKHZIuV8Xf8sEiBuSVzGMg1lJFcbAepDenrfFFgpXj_ZM9AjMMDAUfFiGLL0KpRUV1KLsUa6_enmW2w9uR2sVqjyDBYC-EjOLjbqVaijtzPsyOwfwz03USS1IeLyI/s1600/Screenshot+2015-03-24+16.01.04.png" height="378" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
В этом месте могла бы быть ваша реклама, но был всего лишь перерыв на обед. Саша каким-то верхним чутьём просто по названию выбрал нам отличное заведение общественного питания, в которое кроме нас, кстати, никто не пошёл – все прельстились раздаваемыми на стойке регистрации скидками в какое-то близлежащее кафе.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<h2 style="clear: both; text-align: justify;">
<span style="font-size: large;">
Вторая половина конференции</span></h2>
<div class="separator" style="clear: both; text-align: justify;">
Потяжелев, мы вернулись в конференцзал. Следующий выступающий не запомнился мне совершенно. Ну вот что-то он рассказывал о том, как время от времени он устраивал хакатоны и это порождало в дальшейшем классные штуки, которыми долго пользовался он или ещё кто-то. Воспринималось это как чистой воды автобиография. Однако, он за скобками заметил полезный для меня инструмент, который я как-то пропустил: <a href="https://github.com/cbetta/dokkufy">dokkufy</a>. Так что, время не прошло совсем уж даром.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Майкла Паписа, автора RVM и давнего завсегдатая конференций по Руби, я уже знал в лицо. И его появлению не обрадовался. На Рубишифте он плакался о том, что почему-то все пользуются rbenv, а ведь rvm лучше, он такой хороший, такой красивый. На этой он рассказывал, что Бандлер не нужен, потому что всё есть в новом Rubygems. Нет, кое-что из того, что он сказал, весьма дельно и я сделал несколько заметок на будущее, но, чёрт побери, скучными у него получились даже дельные вещи.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Сытный обед и два увлекательных выступления сыграли с нашим другом Сергеем плохую шутку – его стало настолько неудержимо клонить в сон, что он покинул нас и отправился спать в машину. Отряд хоть и заметил потерю бойца, но мы мужественно остались ждать Ника Саттерера.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Но до него пришлось послушать социальное выступление "ребята, давайте жить дружно". Оно было обо всём и ни о чём, и должно было убедить нас участвовать в жизни сообщества – делиться кодом, временем, ходить на конференции и выступать на конференциях. Нашлось место и RailsGirls и SummerOfCode, и многим другим подобным явлениям. В целом было позитивно, бодро и приятно. Запомнилась просьба встать и обнять камеру (Friday hug в воскресенье) ну и самым чистым английским на всей конференции.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwqIT12iq84tSEZW6e_PVtO5M3wmOPalx3nt5ADHHWohusStPiiQI9g_pqRmpmersi3Koxt6_NXUSc2dG03ndPvnsBJdBBswmIQ6zr0fMTeTzdUA8n3Ur20cEEu7ccwV3GymGKKqblS5A/s1600/2015-03-22+17.11.50.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgwqIT12iq84tSEZW6e_PVtO5M3wmOPalx3nt5ADHHWohusStPiiQI9g_pqRmpmersi3Koxt6_NXUSc2dG03ndPvnsBJdBBswmIQ6zr0fMTeTzdUA8n3Ur20cEEu7ccwV3GymGKKqblS5A/s1600/2015-03-22+17.11.50.jpg" height="480" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<h2 style="clear: both; text-align: justify;">
<span style="font-size: large;">
Апотоник!</span></h2>
<div class="separator" style="clear: both; text-align: justify;">
Наконец-то мы дождались звезду конфереции – Ника Саттерера. Для меня было самое полезное выступление на всей конференции, потому что я думал примерно о том же последние две недели.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Ник продвигал свой фреймворк поверх Рельсов – <a href="https://github.com/apotonick/trailblazer">trailblazer</a>. И надо сказать, что совокупность идей однозначно прекрасна. Вернуть ООП в Рельсы, правильно разделить ответственность между слоями, и даже изничтожить эту рельсовскую гадость, при которой наверху файловой структуры приложения ты не видишь приложения, а видишь рельсы. Мои мысли по поводу trailblazer заслуживают отдельного текста, скажу лишь, что многие вещи я бы сделал слегка по-другому (для большей целостности), но то, что это движение куда надо – я уверен.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Нотку грусти вносит то, что большая часть проектов Апотоника так и осталась незавершённой. Возможно, trailblazer так и не придёт к поставленным целям. Но я прошу вас – посмотрите, это интересно.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<h2 style="clear: both; text-align: justify;">
<span style="font-size: large;">
Домой</span></h2>
<div class="separator" style="clear: both; text-align: justify;">
Тут мы позорно сбежали, не слушая следующих двух выступлений. По нашим расчётам получалось, что если послушать и их, мы возвращались домой к часу ночи, а если не слушать – к одиннадцати. А как уже упоминалось, завтра был понедельник.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Расчёт времени возвращения оказался верным.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<h2 style="clear: both; text-align: justify;">
<span style="font-size: large;">
Мысли и выводы</span></h2>
<div class="separator" style="clear: both; text-align: justify;">
Спорно для меня решение выступать русскоязычным выступающим на русском языке. Да, это странно, когда два русскоязычных собеседника общаются на английском и обоим тяжело – но зато на Рубишифте не скучают приглашённые гости.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
А вот бесспорно для меня то, что структура Рубишифта, когда между каждым выступлением есть десяти-пятнадцятиминутный перерыв – это однозначно правильно. Здесь это было не так и некоторые выступления шли подряд. Это плохо и вот почему: когда есть перерыв, этап вопросов из зала плавно переходит в этап зажимания докладчика в угол наиболее заинтересовавшимися и уже интерактивного обсуждения с ним, пока незаинтересовавшиеся пьют кофе, а следующий докладчик готовится к выступлению. Здесь этого недоставало.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Ну а вообще посещать подобные мероприятия приятно и полезно.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<h2 style="clear: both; text-align: justify;">
<b><span style="font-size: large;">Благодарности</span></b></h2>
<div class="separator" style="clear: both; text-align: justify;">
Вове, купившему билеты, Саше, решившему проблему голода на обеденном перерыве и, конечно же, человеку, без которого поездка бы не состоялась – нашему чудесному пилоту, Сергею.</div>
</div>
Anonymoushttp://www.blogger.com/profile/17152157727140681943noreply@blogger.com0tag:blogger.com,1999:blog-6138770299473511818.post-19115962596041652112013-12-31T09:07:00.001+02:002013-12-31T09:07:44.408+02:00Одно, совсем особое словцо о славянах, которое мне давно хотелось сказать<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="tr_bq">
Немного Достоевского.</div>
<br />
<blockquote>
... не будет у России, и никогда еще не было, таких ненавистников, завистников, клеветников и даже явных врагов, как все эти славянские племена, чуть только их Россия освободит, а Европа согласится признать их освобожденными!</blockquote>
<br />
<blockquote>
И пусть не возражают мне, не оспаривают, не кричат на меня, что я преувеличиваю и что я ненавистник славян! Я, напротив, очень люблю славян, но я и защищаться не буду, потому что знаю, что все точно так именно сбудется, как я говорю, и не по низкому, неблагодарному будто бы, характеру славян, совсем нет, — у них характер этом смысле как у всех, — а именно потому, что такие вещи на свете иначе и происходить не могут. Распространяться не буду, но знаю, что нам отнюдь не надо требовать с славян благодарности, к этому нам надо приготовиться вперед.</blockquote>
<br />
<blockquote>
Начнут же они, по освобождении, свою новую жизнь, повторяю, именно с того, что выпросят себе у Европы, у Англии и Германии, например, ручательство и покровительство их свободе, и хоть в концерте европейских держав будет и Россия, они именно в защиту от России это и сделают.Начнут они непременно с того, что внутри себя, если не прямо вслух, объявят себе и убедят себя в том, что России они не обязаны ни малейшею благодарностью, напротив, что от властолюбия России они едва спаслись... при заключении мира вмешательством европейского концерта, а не вмешайся Европа, так Россия, отняв их у турок, проглотила бы их тотчас же, "имея в виду расширение границ и основание великой Всеславянской империи на порабощении славян жадному, хитрому и варварскому великорусскому племени". Долго, о, долго ещё они не в состоянии будут признать бескорыстия России и великого, святого, неслыханного в мире поднятия ею знамени величайшей идеи, из тех идей, которыми жив человек и без которых человечество, если эти идеи перестанут жить в нем, — коченеет, калечится и умирает в язвах и в бессилии. Нынешнюю, например, всенародную русскую войну, всего русского народа, с царем во главе, поднятую против извергов за освобождение несчастных народностей, — эту войну поняли, наконец, славяне теперь, как вы думаете?</blockquote>
<br />
<blockquote>
Но о теперешнем моменте я говорить не стану, к тому же мы еще нужны славянам, мы их освобождаем, но потом, когда освободим и они кое-как устроятся, — признают они эту войну за великий подвиг, предпринятый для освобождения их, решите-ка это?</blockquote>
<br />
<blockquote>
Да ни за что на свете не признают!</blockquote>
<br />
<blockquote>
Напротив, выставят как политическую, а потом и научную истину, что не будь во все эти сто лет освободительницы России, так они бы давным-давно сами сумели освободиться от турок, своею доблестью или помощию Европы, которая, опять-таки, не будь на свете России, не только бы не имела ничего против их освобождения, но и сама освободила бы их. Это хитрое учение, наверно, существует у них уже и теперь, а впоследствии оно неминуемо разовьется у них в научную и политическую аксиому. Мало того, даже о турках станут говорить с большим уважением, чем об России.</blockquote>
<br />
<blockquote>
Может быть, целое столетие, или еще более, они будут беспрерывно трепетать за свою свободу и бояться властолюбия России; они будут заискивать перед европейскими государствами, будут клеветать на Россию, сплетничать на нее и интриговать против нее.</blockquote>
<br />
<blockquote>
О, я не говорю про отдельные лица: будут такие, которые поймут, что значила, значит и будет значить Россия для них всегда. Они поймут все величие и всю святость дела России и великой идеи, знамя которой поставит она в человечестве. Но люди эти, особенно вначале, явятся в таком жалком меньшинстве, что будут подвергаться насмешкам, ненависти и даже политическому гонению.</blockquote>
<br />
<blockquote>
Особенно приятно будет для освобожденных славян высказывать и трубить на весь свет, что они племена образованные, способные к самой высшей европейской культуре, тогда как Россия — страна варварская, мрачный северный колосс, даже не чистой славянской крови, гонитель и ненавистник европейской цивилизации. У них, конечно явятся, с самого начала, конституционное управление, парламенты, ответственные министры, ораторы, речи. Их будет это чрезвычайно утешать и восхищать.</blockquote>
<br />
<blockquote>
Они будут в упоении, читая о себе в парижских и в лондонских газетах телеграммы, извещающие весь мир, что после долгой парламентской бури пало, наконец, министерство в Болгарии и составилось новое из либерального большинства и что какой-нибудь ихний Иван Чифтлик согласился, наконец, принять портфель президента совета министров. России надо серьезно приготовиться к тому, что все эти освобожденные славяне с упоением ринутся в Европу до потери личности своей заразятся европейскими формами, политическими и социальными, и таким образом должны будут пережить целый и длинный период европеизма прежде, чем постигнуть хоть что-нибудь в своем славянском значении и в своем особом славянском призвании в среде человечества. Между собой эти землицы будут вечно ссориться, вечно друг другу завидовать и друг против друга интриговать.</blockquote>
<br />
<blockquote>
Разумеется, в минуту какой-нибудь серьезной беды они все непременно обратятся к России за помощью. Как ни будут они ненавистничать, сплетничать и клеветать на нас Европе, заигрывая с нею и уверяя ее в любви, но чувствовать-то они всегда будут инстинктивно (конечно, в минуту беды, а не раньше), что Европа естественный враг их единству, была им и всегда останется, а что если они существуют на свете, то, конечно, потому, что стоит огромный магнит — Россия, которая, неодолимо притягивая их всех к себе, тем сдерживает их целость и единство. Будут даже и такие минуты, когда они будут в состоянии почти уже сознательно согласиться, что не будь России, великого восточного центра и великой влекущей силы, то единство их мигом бы развалилось, рассеялось в клочки и даже так, что самая национальность их исчезла бы в европейском океане, как исчезают несколько отдельных капель воды в море.</blockquote>
<br />
<blockquote>
России надолго достанется тоска и забота мирить их, вразумлять их и даже, может быть, обнажать за них меч при случае. Разумеется, сейчас же представляется вопрос: в чем же тут выгода России, из-за чего Россия билась за них сто лет, жертвовала кровью своею; силами, деньгами? Неужто из-за того, чтоб пожать только маленькой смешной ненависти и неблагодарности?</blockquote>
<a href="http://www.magister.msk.ru/library/dostoevs/dostdn21.htm">Достоевский, "Дневник писателя", глава вторая, часть третья "Одно, совсем особое словцо о славянах, которое мне давно хотелось сказать".</a> Ничего не напоминает?<br />
<br />
Здесь выдержка, по ссылке целиком, рекомендую. </div>
Anonymoushttp://www.blogger.com/profile/17152157727140681943noreply@blogger.com0tag:blogger.com,1999:blog-6138770299473511818.post-60925104841341008922013-11-28T19:54:00.001+02:002013-12-02T17:48:23.500+02:00Немножко политоты<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixz0uUKpkhr0U4mSP2cQqX1SascO1sHiRmC7FU05OCTDkXpV0V1h5TP9bK8mRvJuypX6nsQqvieGza3lieGXIjIKospr-O91R6FO3PfS9KdO8TcZw4YicOnxyLn2AhZVw4QbazGR0hhlw/s1600/46212_900.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEixz0uUKpkhr0U4mSP2cQqX1SascO1sHiRmC7FU05OCTDkXpV0V1h5TP9bK8mRvJuypX6nsQqvieGza3lieGXIjIKospr-O91R6FO3PfS9KdO8TcZw4YicOnxyLn2AhZVw4QbazGR0hhlw/s400/46212_900.jpg" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="background-color: white; font-family: sans-serif; line-height: 19.046875px; text-align: left;">tl;dr: Все пишут, а я чем хуже? Евросоюз - плохо, Таможенный союз - хорошо. </span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="background-color: white; font-family: sans-serif; line-height: 19.046875px; text-align: left;"><br /></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="background-color: white; font-family: sans-serif; line-height: 19.046875px; text-align: left;">Короче, смысл этой заметки в том, что я сильно крепился, но не выдержал и решил высказаться по теме. </span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="background-color: white; font-family: sans-serif; line-height: 19.046875px; text-align: left;"><br /></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="background-color: white; font-family: sans-serif; line-height: 19.046875px; text-align: left;">Итак, для начала, никто не примет Украину в Евросоюз — об этом даже речи нет. Украина станет "ассоциированным членом" ЕС, как Израиль или Албания. Подробнее об этом можно прочитать в "соглашении об ассоциации Украины и Европейского союза". <a href="http://comeuroint.rada.gov.ua/komevroint/doccatalog/document?id=56219">Это открытый документ на понятном языке на 236 страницах</a>. <a href="http://glavcom.ua/pub/2012_11_19_EU_Ukraine_Association_Agreement_English.pdf">Есть ещё и в оригинале — на 906 страницах</a>. К майданщикам у меня вопрос - его кто-нибудь осилил не в пересказе? Врать не буду, я тоже не осилил, но всё же по диагонали полистал. </span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="background-color: white; font-family: sans-serif; line-height: 19.046875px; text-align: left;"><br /></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="background-color: white; font-family: sans-serif; line-height: 19.046875px; text-align: left;">Раздел IV, глава 1, часть 2 "Отмена пошлин" сыграет на руку не Украине, а Евросоюзу. Потому как Украина не сможет защищать свой рынок от импортных товаров. Да, я знаю, что вы хотите сказать: "это рынок, значит, туда нашим товарам и дорога, а их товары лучше, вот и будем пользоваться". Есть с этим одна проблема - закрытие производств, безработица и прочие радости прогрессирующего капитализма. Взамен будут открываться торгово-развлекательные центры в которых всё больше и больше людей будет продавать. Продавать европейские товары, отдавая прибыль на сторону. При этом, со стороны таможенного союза пошлины поднимут - и нам торговать будет не только нечем, но и не с кем.</span></div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="background-color: white; font-family: sans-serif; line-height: 19.046875px; text-align: left;">Нельзя также переоценить вклад статьи 19 части первой "Перемещение персон" в общий развал экономики. Я, вообще, подозреваю, что как раз-таки за визы большая часть майданщиков и борются. Фиг с ним, что там будет на Украине, они за это время свалить успеют. Так вот, прогнозирую серьёзнейший отток трудоспособного населения, подстёгиваемый закрытием производств. Люди повалят пачками — уже в очереди стоят.</span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="background-color: white; font-family: sans-serif; line-height: 19.046875px; text-align: left;"><br /></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="background-color: white; font-family: sans-serif; line-height: 19.046875px; text-align: left;">Статья 93 "доступ на рынок" в пункте 2 особенно хороша. Ограничение количества поставщиков услуг, как в форме количественных квот, монополий, эксклюзивных поставщиков услуг, так и требований проверки экономических потребностей. Именно этим способом будет рушиться экономика Украины.</span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="background-color: white; font-family: sans-serif; line-height: 19.046875px; text-align: left;"><br /></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;">Кого не задавят квотами, закроют стандартами. Раздел 4, глава 3 "Технические барьеры в торговле" говорит об обязательном переводе всех предприятий Украины, включая сельское хозяйство. Сроки жёсткие, а денег на это никто выделять не будет. И возникнет ситуация, когда на нашу территорию будут беспошлинно ввозить массу продукции, часть предприятий закроют квотами, а часть не сможет продавать товар на Украине же из-за несоответствия стандартам, а ненужные более квалифицированные и не очень кадры потекут на Запад.</span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="background-color: white; font-family: sans-serif; line-height: 19.046875px; text-align: left;"><br /></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="background-color: white; font-family: sans-serif; line-height: 19.046875px; text-align: left;">А, и у нас на территории начнет согласно главе 9 "Стандарты, касающиеся интеллектуальной собственности" действовать европейский закон об авторском праве. А там за торренты или ex.ua вообще неиллюзорно сажают. И за ваш палёный фотошоп и украденный Microsoft Office - тоже.</span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="background-color: white; font-family: sans-serif; line-height: 19.046875px; text-align: left;"><br /></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="background-color: white; font-family: sans-serif; line-height: 19.046875px; text-align: left;">Вообще со стороны Украины в документе, в основном обязательства. А со стороны Евросоюза - в основном требования.</span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="background-color: white; font-family: sans-serif; font-size: 13px; line-height: 19.046875px; text-align: left;"><br /></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;">Ладно. Когда осилю документ полностью, тогда и буду полемизировать. Давайте сделаем по-другому. Посмотрим на опыт последних стран, присоединившихся к Евросоюзу.</span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><br /></span></span></div>
<div class="separator" style="clear: both; text-align: left;">
<b style="font-family: sans-serif; line-height: 19.046875px;">Литва.</b></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><b><br /></b></span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;">Возьмём, например, Литву, член ЕС с 2004 года. Литва сейчас - председатель Совета Евросоюза, получает премии, числится участником антикризисного движения, приводится в пример другим союзникам.</span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><br /></span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;">Страна превратилась в "купи – продай", поскольку развитая в советские годы промышленность загублена напрочь, сельское хозяйство, стянутое путами квот и ограничений, до сих пор не может оправиться. Кто-нибудь помнит вильнюсское объединение "Сигма"? Десятки тысяч ее работников выпускали добротную промышленную и военную электронику. <a href="http://wikimapia.org/#lang=en&lat=54.711334&lon=25.289326&z=15&m=b&permpoly=11917521&show=/11917521/AB-Vilniaus-Sigma">Сейчас в ее просторных корпусах - торговые лавки и выставочные павильоны</a>. В Клайпеде ушли в небытие ткацкая и чулочная фабрики, консервный завод, одно из крупнейших в Союзе рыбопромысловых объединений, в составе которого находилось более 400 судов. Стремительно сокращается поголовье крупного рогатого скота, а чтобы держать экспортную планку на взятой высоте, молокопереработчики прибегают к реэкспорту или гонят суррогат из порошка. Десятки тысяч грамотных, толковых работников выброшены на улицу, сидят на нищенском пособии или побираются и бомжуют. Более 20% семей прозябают за чертой бедности (<a href="http://ru.delfi.lt/news/live/v-litve-za-chertoj-bednosti-prozhivaet-bolshe-lyudej-chem-v-latvii-i-estonii.d?id=59488173">вот хотя бы здесь</a>). Такого не случалось ни в суровые годины войн или вселенских эпидемий: села и города, особенно малые, обезлюдели: страна официально потеряла более полумиллиона жителей. Вообще с вступлением в Евросоюз <a href="http://www.regnum.ru/news/1731885.html">страны Прибалтики не в силах остановить массовую миграцию населения</a>. Демография ужасающая — страны рискуют исчезнуть с карты мира.</span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><br /></span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;">Среди мигрирующих большинство — люди в возрасте от 20 до 30 лет. Е</span></span><span style="line-height: 19.046875px; text-align: left;"><span style="font-family: sans-serif;">сли эмиграция будет продолжаться такими же темпами, то через 20-30 лет может сложиться ситуация, когда некому будет платить налоги в объеме позволяющем выплачивать пенсии.</span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="line-height: 19.046875px; text-align: left;"><span style="font-family: sans-serif;"><br /></span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;">Литва увеличила дефицит государственного бюджета с 2007 по 2009 г. в 8 раз и довела его до 12,1 % от размера ВВП. По итогам 2010 года дефицит бюджета составил уже 7,1% от ВВП. Государственный долг Литвы за этот же период вырос с 16,9 до 29,5%, это при том, что темпы экономического роста в этом государстве в 2012 году еще более замедлились. </span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;">Патриоты Украины, вы именно этого хотите?</span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><br /></span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><b>Латвия</b>.</span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><br /></span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;">Уничтожено производство сахара. Полностью. Латвия не то, что не импортировала сахар, в этой маленькой Латвии было пять сахарных заводов. Это было национальное производство, часть их "самости". Закрыли и теперь Латвия импортирует сахар. Последний сахарный завод в Риге получил от ЕС 13.5 миллионов евро компенсации за закрытие. </span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><br /></span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif; line-height: 19.046875px;">Квоты на сельское хозяйство и рыбную ловлю заставляют латышей наниматься на </span><a href="http://www.freecity.lv/bestseller/55/" style="font-family: sans-serif; line-height: 19.046875px;">рабский труд на британские рыбные заводы</a><span style="font-family: sans-serif; line-height: 19.046875px;">. И это в стране, которую, я уверен, многие читатели помнят за шпроты. "Рижское золото" до сих пор ставят на качественных шпротах. </span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif; line-height: 19.046875px;"><br /></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;">Это я тем, кто говорит, что зато Евросоюз сохранит национальную культуру, язык и прочую "самость". Да пожалуйста! Пока это бизнесу не мешает, сохраняйте! А если мешает - извините.</span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><br /></span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif; line-height: 19.046875px;">В Латвии дефицит государственного бюджета вырос с 2007 по 2009 годы в 28 раз и достиг величины 10,2% от ВВП. По итогам 2010 года дефицит бюджета составил 7,7%. Государственный долг увеличился за это же время с 9,0 до 36,7%. В 2011 году размер дефицита бюджета страны сократился с 8 % до 5,5% от ВВП. Существует опасность того, что к 2014 году государственный долг этого государства возрастет до 52%.</span></div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;">И, естественно, за счёт уничтожения латвийского производства, Евросоюз решает свои проблемы перепроизводства и распределения.</span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><br /></span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><b>Прибалтика в целом.</b></span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><br /></span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif; line-height: 19.046875px;">Уже через два три года после вступления стран региона в ЕС было зафиксировано увеличение инфляции. В 2007 году среднегодовая инфляция в Латвии – 10,1 процента, в Эстонии составила 6,6 процента, в Литве – 5,7 процента.</span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif; line-height: 19.046875px;"><br /></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;">Сильно выросли цены на продукты питания, предметы повседневного спроса и лекарственные средства. В декабре 2007 года по сравнению с тем же периодом 2006 годом рост потребительских цен в Эстонии составил 9,6%, в Латвии – 14,1%, в Литве – 8,1%. В Латвии данный уровень является самым высоким за последние десять лет.</span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><br /></span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;">В Эстонии безработица выросла за период с 2007 по 2010 годы с 4,7% до 14,6%, в Литве – с 4,3% до 17,3%, а в Латвии – с 6,0% до 17,1%. Согласно статистике Eurostat, в первом полугодии 2011 года уровень безработицы в Латвии составил 16,2%, В Литве – 15,6%, в Эстонии – 12,8%, при среднем показателе по ЕС в 9,5%. Можно говорить о том, что в 2011-2012 годах ситуация с занятостью населения не улучшилась.</span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><br /></span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;">Много ещё чего, посмотрите вот эту аналитику - <a href="http://nbnews.com.ua/ru/blogs/96647/">налогов стало больше, при этом, налоговые поступления упали, теневой сектор экономики вырос...</a></span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><br /></span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<b style="font-family: sans-serif; line-height: 19.046875px;">Венгрия.</b></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><b><br /></b></span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;">Кто-нибудь помнит, что такое "Икарус"? Увы, их больше не делают. Квоты не позволяют серийное производство. </span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><br /></span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;">А ведь фирма делала современные высокотехнологичные автобусы, давая рабочие места тысячам высококвалифицированных специалистов. Вот здесь можно <a href="http://www.ikarusbus.cz/historie/historie_ikarus_bus_3.html">посмотреть модельный ряд</a>.</span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><br /></span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;">Да и в целом там картина стандартная для новых членов Евросоюза - <a href="http://ru.golos.ua/politika/13_11_05_istoriya_o_tom_kak_evrosoyuz_vengriyu_razdavil">вот, почитайте</a>.</span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><b>Греция.</b></span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><br /></span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;">Закрыли судостроительные заводы. Решили, что лучше корабли строить в Германии. Уже после вступления в Евросоюз, греческие предприниматели заказывали у Германии более 700 кораблей для собственных нужд. Кораблей, которые раньше строили в Греции.</span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><br /></span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;">И как обычно из-за квот сократили фермы по выращиванию маслин и... вырубили виноградники. Это вообще трагедия, я считаю. Ну, о том, что сейчас в Греции добровольно заражаются СПИДом, чтобы получать пособие, не писал только ленивый.</span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><br /></span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><b>Польша.</b></span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><b><br /></b></span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;">В свое время угольная промышленность Польши составляла основу экономики.</span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><br /></span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;">Хотя в последние годы перед членством в Евросоюзе отрасль нуждалась в государственной поддержке. В Польше после 2004 года закрыли 90% своих угольных предприятий, на которых работали 300 тысяч человек. </span></span><span style="font-family: sans-serif; line-height: 19.046875px;">Остальные 10% - были приватизированы и реорганизованы. В целом, большинству польских шахтеров пришлось искать другую работу.</span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif; line-height: 19.046875px;"><br /></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif; line-height: 19.046875px;">Если кто-то думает, что в современной энергетике уголь не нужен, вам к школьному учителю или к врачу. Европа покупает уголь у США в огромных масштабах - например, в 2012 году он составил 66 миллионов тонн.</span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><br /></span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="line-height: 19.046875px;"><span style="font-family: sans-serif;"></span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;">Еще жертвы - Гдыньская и Гданьская верфи. Гдыньская закрыта вообще. Гданьская сейчас разделена на два частных предприятия и почти не работает.</span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><br /></span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;">Много их ещё стран. <a href="http://crisis.in.ua/7990.htm">Почитайте про Болгарию, например.</a></span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><br /></span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><b>Прогноз.</b></span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><b><br /></b></span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;">Мы вступаем в ЕС в качестве ассоциированного члена. Закрываются производства, растёт потребление импортных товаров, особенно в той сфере, где мы никогда в них не нуждались - например, уголь или продукты. Огромное количество трудоспособного населения уедет работать на поля Испании, заводы Англии и стройки Ирландии. Взамен, если повезёт, нам сделают укол обезболивающего кредита, деньги быстро вернутся в качестве оплаты за импорт, а Украина останется должна ещё больше.</span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><br /></span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><b>Россия.</b></span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><b><br /></b></span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;">Это заслуживает отдельной статьи, но если вкратце, Россия готова открыть свой рынок для нас и сохранять наше производство - стратегия Таможенного Союза другая. У нас со времён Союза даже остались общие технологические цепочки, которые и сейчас нетрудно восстановить. </span></span><span style="line-height: 19.046875px; text-align: left;"><span style="font-family: sans-serif;">взяв курс на Россию, Украина вполне могла бы стать через какое-то время одним из самых развитых регионов будущей объединённой страны. </span></span><span style="line-height: 19.046875px; text-align: left;"><span style="font-family: sans-serif;">Но, увы, украинские политики и украинские СМИ куплены Западом. Поэтому Украина будет сопротивляться всеми копытами курсу на сближение с Россией: это сближение категорически невыгодно Штатам и Евросоюзу. Таким образом, Россия будет вынуждена сейчас занять сугубо прагматичную позицию по отношению к Украине. А именно: вести себя с ней так, как она ведёт себя по отношению, скажем, к Турции. То есть, не пускать украинские товары на свой рынок, не давать скидок на газ. Строить на своей территории заводы, которые позволят в некоторой перспективе отказаться от высокотехнологичного импорта из Украины. <a href="http://www.warandpeace.ru/ru/news/view/70299/">Например, самолётных двигателей</a>.</span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="line-height: 19.046875px; text-align: left;"><span style="font-family: sans-serif;"><br /></span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="line-height: 19.046875px; text-align: left;"><span style="font-family: sans-serif;">А ведь всё могло бы быть по-другому...</span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="line-height: 19.046875px; text-align: left;"><span style="font-family: sans-serif;"><br /></span></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><b>F.A.Q.</b></span></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><b><br /></b></span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;">Этот раздел будет постоянно обновляться по мере поступления возражений. Я обещаю по мере свободного времени рассмотреть их все.</span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><br /></span></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><b>Невидимая рука рынка.</b></span></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><br /></span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;">Ну и шайтан с ними, с заводами, их закрыли, потому что они экономически неэффективны и нужно было их закрыть, чтобы покупать товар у тех, кто производит его экономически эффективно и правильно. </span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><br /></span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;">По этому поводу высказывались специалисты и аналитики, гораздо умнее меня. Однако же, я постараюсь.</span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><br /></span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;">Невидимая рука рынка не работает. Рынком нужно управлять, и этим занимаются буквально все государства. Антимонопольные комитеты, госпошлины, собственно, евростандарты производства, о которых говорилось выше. Зачем это нужно? Чтобы бизнес, целью которого является максимизация прибыли, не начал максимизируя её вредить интересам общества. Конкурентная борьба — это ведь не только производство более востребованного товара экономически более эффективным способом. Это ещё и уничтожение конкурентов, демпинг, промышленный шпионаж, патентные войны...</span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><br /></span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;">Американская автомобильная промышленность в своё время выстояла только благодаря грубейшим нарушениям законов свободного рынка. Пошлины на ввоз японских автомобилей уже были равны по стоимости самим автомобилям, и только тогда американцы начали иногда покупать американские автомобили. А если бы тогда была какая-нибудь интеграция и свободным рынком, в США автомобильной промышленности сейчас бы не было. А это огромные деньги, оставшиеся внутри страны, это рабочие места, это налоги, которые не уходят на сторону, это инженерные и научные кадры...</span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><br /></span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;">И вот тут такое дело, что для страны почти всегда лучше производить, чем импортировать. Это очевидно. И я не хочу импортировать в Украину продукты питания — иначе и цены на них выростут, как в Прибалтике, и денег у крестьян станет значительно меньше. А уж высокотехнологичное производство, даже, если оно и отстаёт, что не факт, от мирового, нужно сохранять - иначе из страны уедут специалисты и перспективы стать банановой республикой будут уже не за горами.</span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><br /></span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;">Да и, в конце концов, по законам рынка, неэффективные предприятия должны закрыться сами. Что это за "евростандарты производства", чтобы помочь этим жертвам рынка сдохнуть побыстрее.</span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><br /></span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<b style="font-family: sans-serif; line-height: 19.046875px; text-align: left;">В России только трубы.</b></div>
<div class="separator" style="clear: both; text-align: justify;">
<b style="font-family: sans-serif; line-height: 19.046875px; text-align: left;"><br /></b></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;">Я процитирую. "Россия (и ее кореша лузеры из ТС) - болото, и там будет только хуже, все эти иллюзии про совковые производственные схемы, космические двигатели для марсианских ракет и тд, оно никому не надо - Россия живет на газе и нефти, кроме труб там ничего не надо никому.</span></span><span style="font-family: sans-serif; line-height: 19.046875px;">"</span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif; line-height: 19.046875px;"><br /></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif; line-height: 19.046875px;">Короткий ответ: </span><span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><a href="http://www.sdelanounas.ru/">http://www.sdelanounas.ru/</a>. Полистайте подольше, если захотите придраться к одному-двум пунктам. Я отдам их вам, согласившись, что да, это никому не интересная чушь. Вряд ли вам удастся сделать это хотя бы с четвертью списка.</span></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><br /></span></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><b>ВВП на душу населения.</b></span></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><b><br /></b></span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;">В упомянутых странах растёт экономика. Это видно <a href="http://www.google.com/publicdata/explore?ds=d5bncppjof8f9_&met_y=ny_gdp_pcap_cd&hl=en&dl=en&idim=country%3ASVK%3APOL%3AHUN#!ctype=l&strail=false&bcs=d&nselm=h&met_y=ny_gdp_pcap_cd&scale_y=lin&ind_y=false&rdim=region&idim=country:POL:HUN:UKR:RUS:BLR:LTU:LVA:EST:GRC&ifdim=region&tstart=1101679200000&tend=1354140000000&hl=en_US&dl=en&ind=false">по росту подушевого ВВП</a>. Доля частного сектора в экономике тоже сильно выросла, то есть, реально всё стало лучше. Естественно, ("нет нужды лишний раз пояснять"), выросла покупательская способность.</span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><br /></span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;">ВВП — рыночная стоимость всех конечных товаров и услуг (то есть предназначенных для непосредственного употребления), произведённых за год во всех отраслях экономики на территории государства для потребления, экспорта и накопления, вне зависимости от национальной принадлежности использованных факторов производства.</span></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><br /></span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;">Ключевая штука здесь в конце: вне зависимости от национальной принадлежности. Аналогия тут такая: я вступаю с вами в соглашение и выращиваю на вашем поле силами ваших работников морковку, принадлежащую мне. Потом продаю. Потом, так и быть, что-то плачу вашим работникам. Ну и в конце прихожу вам рассказывать, какой замечательный урожай этим летом созрел на вашем поле. Вот это и есть ВВП. С покупательской способностью он связан слабо. Потому что много платить наёмным рабочим вы не обязаны.</span></span></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><br /></span></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: sans-serif;"><span style="line-height: 19.046875px;"><br /></span></span></div>
</div>
Anonymoushttp://www.blogger.com/profile/17152157727140681943noreply@blogger.com12tag:blogger.com,1999:blog-6138770299473511818.post-28713231408954205122013-11-22T12:00:00.002+02:002013-11-22T12:01:12.298+02:00Функциональное реактивное программирование<div dir="ltr" style="text-align: left;" trbidi="on">
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: left;">
<span style="font-family: Arial;"><span style="font-size: 15px; line-height: 17px; white-space: pre-wrap;">Это примерный текст выступления "Функциональное реактивное программирование", которое Алексей Осипенко и я проводили на ноябрьской встрече Донецкого Лямбда-клуба.</span></span></div>
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: right;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: right;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: italic; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Мир основан на изменяющемся состоянии. Мы живём во времени и думаем во времени, и разнообразнейшие события прилетают откуда ни возьмись, и тоже во времени. Как организовать приложение, для которого эти события являются вводом - то есть, любое интерактивное приложение? А если хочется не иметь изменяемого состояния, иметь чистые функции и работать как можно более декларативно? На эти вопросы отвечает функционально-реактивное программирование (functional reactive programming). Мы постараемся рассказать о таком подходе.</span></div>
<b id="docs-internal-guid-38a66e66-7f2e-ad3d-2b86-e304949685fe" style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Нам очень нравится определение функционального программирования из выступления Дэниэла Спивака “Жизнь в пост-функциональном мире”. Это “функция как основная единица абстракции”. Основа основ функцинального программирования - это композируемые примитивы для решения широкого класса задач. За счёт этого о программах, написанных полностью в функциональной парадигме, легко рассуждать в терминах математики - они предсказуемы и даже доказуемы.</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">“Функциональное программирование объединяет гибкость и мощь абстрактной математики с интуитивной понятностью абстрактной математики”.</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Реактивное программирование - это программирование приложений, управляемых событиями. Очень, надо сказать, востребованная штука, потому что это почти все приложения, которыми мы пользуемся - то, что называется, интерактивные приложения. В качестве примера исключения я бы привёл утилиты командной строки. Почти всё остальное - интерактивно и управляется событиями.</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">События имеют свойство происходить в произвольное время и совершенно не предсказуемы заранее. Чаще всего их обрабатывают как-то так:</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12.727272033691406px; line-height: 19px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><span class="kd" style="font-weight: bold;">function</span> <span class="nx">Counter</span><span class="p">(</span><span class="nx">element</span><span class="p">)</span> <span class="p">{</span>
<span class="kd" style="font-weight: bold;">var</span> <span class="nx">that</span> <span class="o" style="font-weight: bold;">=</span> <span class="k" style="font-weight: bold;">this</span><span class="p">;</span>
<span class="k" style="font-weight: bold;">this</span><span class="p">.</span><span class="nx">count</span> <span class="o" style="font-weight: bold;">=</span> <span class="mi" style="color: #009999;">0</span><span class="p">;</span>
<span class="k" style="font-weight: bold;">this</span><span class="p">.</span><span class="nx">clicked</span> <span class="o" style="font-weight: bold;">=</span> <span class="kd" style="font-weight: bold;">function</span> <span class="p">()</span> <span class="p">{</span>
<span class="k" style="font-weight: bold;">this</span><span class="p">.</span><span class="nx">count</span> <span class="o" style="font-weight: bold;">+=</span> <span class="mi" style="color: #009999;">1</span><span class="p">;</span>
<span class="p">}</span>
<span class="nx">$</span><span class="p">(</span><span class="nx">element</span><span class="p">).</span><span class="nx">click</span><span class="p">(</span><span class="kd" style="font-weight: bold;">function</span><span class="p">()</span> <span class="p">{</span>
<span class="k" style="font-weight: bold;">return</span> <span class="nx">that</span><span class="p">.</span><span class="nx">clicked</span><span class="p">();</span>
<span class="p">});</span>
<span class="p">};</span></pre>
<b style="font-weight: normal;"><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b><br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Код простой и в нём можно очень быстро разобраться, но у него есть несколько проблем. Во-первых, ненавистное нашему сердцу изменяемое состояние, а во-вторых - очень плохая композируемость. Плохая композируемость означает, что код будет очень сложно использовать повторно в других частях приложения и объединять с другими подобными элементами.</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Это рушит наш уютный мирок, лишая его доказуемости и предопределённости, запрещая весомую часть привычных техник построения программ и взамен порождая массу неприятных эффектов.</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Однако же мы не зря сюда пришли. Реактивное программирование, о котором мы хотим рассказать, основывается по большому счёту на концепциях из функционального программирования и его способах заводить примитивы.</span></div>
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Лирическое отступление: почему мы про UI и где ещё это применимо. Это применимо везде, где есть входящие события. Ну вот просто везде. Однако UI ставит наиболее интересные и сложные задачи по комбинации потоков: хоть сколь-нибудь развесистый пользовательский интерфейс начинает требовать всё более и более новых и интересных комбинаторов.</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Идея примитивов ФРП вкратце. Естественный код:</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12.727272033691406px; line-height: 19px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><span class="nx">$</span><span class="p">(</span><span class="s2" style="color: #dd1144;">"#login"</span><span class="p">).</span><span class="nx">on</span><span class="p">(</span><span class="s2" style="color: #dd1144;">"click"</span><span class="p">,</span> <span class="kd" style="font-weight: bold;">function</span> <span class="p">(</span><span class="nx">event</span><span class="p">)</span> <span class="p">{</span>
<span class="kd" style="font-weight: bold;">var</span> <span class="nx">value</span> <span class="o" style="font-weight: bold;">=</span> <span class="nx">$</span><span class="p">(</span><span class="nx">event</span><span class="p">.</span><span class="nx">target</span><span class="p">).</span><span class="nx">val</span><span class="p">();</span>
<span class="k" style="font-weight: bold;">if</span> <span class="p">(</span><span class="nx">value</span><span class="p">.</span><span class="nx">length</span> <span class="o" style="font-weight: bold;">></span> <span class="mi" style="color: #009999;">0</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">$</span><span class="p">(</span><span class="s2" style="color: #dd1144;">"#notice"</span><span class="p">).</span><span class="nx">text</span><span class="p">(</span><span class="nx">value</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">});</span></pre>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Вводим один уровень абстракции:</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12.727272033691406px; line-height: 19px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><span class="kd" style="font-weight: bold;">var</span> <span class="nx">clickE</span> <span class="o" style="font-weight: bold;">=</span> <span class="nx">$</span><span class="p">(</span><span class="s2" style="color: #dd1144;">"#login"</span><span class="p">).</span><span class="nx">events</span><span class="p">(</span><span class="s2" style="color: #dd1144;">"click"</span><span class="p">);</span>
<span class="nx">clickE</span><span class="p">.</span><span class="nx">onValue</span><span class="p">(</span><span class="kd" style="font-weight: bold;">function</span> <span class="p">(</span><span class="nx">event</span><span class="p">)</span> <span class="p">{</span>
<span class="kd" style="font-weight: bold;">var</span> <span class="nx">value</span> <span class="o" style="font-weight: bold;">=</span> <span class="nx">$</span><span class="p">(</span><span class="nx">event</span><span class="p">.</span><span class="nx">target</span><span class="p">).</span><span class="nx">val</span><span class="p">();</span>
<span class="k" style="font-weight: bold;">if</span> <span class="p">(</span><span class="nx">value</span><span class="p">.</span><span class="nx">length</span> <span class="o" style="font-weight: bold;">></span> <span class="mi" style="color: #009999;">0</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">$</span><span class="p">(</span><span class="s2" style="color: #dd1144;">"#notice"</span><span class="p">).</span><span class="nx">text</span><span class="p">(</span><span class="nx">value</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">});</span></pre>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">На первый взгляд кажется, что мы ничего не добились. Однако же, теперь с этим примитивом мы можем кое-что делать.</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12.727272033691406px; line-height: 19px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><span class="kd" style="font-weight: bold;">var</span> <span class="nx">clickE</span> <span class="o" style="font-weight: bold;">=</span> <span class="nx">$</span><span class="p">(</span><span class="s2" style="color: #dd1144;">"#login"</span><span class="p">).</span><span class="nx">events</span><span class="p">(</span><span class="s2" style="color: #dd1144;">"click"</span><span class="p">);</span>
<span class="kd" style="font-weight: bold;">var</span> <span class="nx">values</span> <span class="o" style="font-weight: bold;">=</span> <span class="nx">clickE</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="kd" style="font-weight: bold;">function</span> <span class="p">(</span><span class="nx">event</span><span class="p">)</span> <span class="p">{</span>
<span class="k" style="font-weight: bold;">return</span> <span class="nx">$</span><span class="p">(</span><span class="nx">event</span><span class="p">.</span><span class="nx">target</span><span class="p">).</span><span class="nx">val</span><span class="p">();</span>
<span class="p">});</span>
<span class="kd" style="font-weight: bold;">var</span> <span class="nx">nonEmptyValues</span> <span class="o" style="font-weight: bold;">=</span> <span class="nx">values</span><span class="p">.</span><span class="nx">filter</span><span class="p">(</span><span class="kd" style="font-weight: bold;">function</span> <span class="p">(</span><span class="nx">value</span><span class="p">)</span> <span class="p">{</span>
<span class="k" style="font-weight: bold;">return</span> <span class="nx">value</span><span class="p">.</span><span class="nx">length</span> <span class="o" style="font-weight: bold;">></span> <span class="mi" style="color: #009999;">0</span><span class="p">;</span>
<span class="p">});</span>
<span class="nx">nonEmptyValues</span><span class="p">.</span><span class="nx">onValue</span><span class="p">(</span><span class="kd" style="font-weight: bold;">function</span> <span class="p">(</span><span class="nx">value</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">$</span><span class="p">(</span><span class="s2" style="color: #dd1144;">"#notice"</span><span class="p">).</span><span class="nx">text</span><span class="p">(</span><span class="nx">value</span><span class="p">);</span>
<span class="p">});</span></pre>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Ну и инлайним лишние переменные:</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12.727272033691406px; line-height: 19px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><span class="kd" style="font-weight: bold;">var</span> <span class="nx">values</span> <span class="o" style="font-weight: bold;">=</span> <span class="nx">$</span><span class="p">(</span><span class="s2" style="color: #dd1144;">"#login"</span><span class="p">).</span><span class="nx">events</span><span class="p">(</span><span class="s2" style="color: #dd1144;">"click"</span><span class="p">).</span><span class="nx">map</span><span class="p">(</span><span class="kd" style="font-weight: bold;">function</span> <span class="p">(</span><span class="nx">event</span><span class="p">)</span> <span class="p">{</span>
<span class="k" style="font-weight: bold;">return</span> <span class="nx">$</span><span class="p">(</span><span class="nx">event</span><span class="p">.</span><span class="nx">target</span><span class="p">).</span><span class="nx">val</span><span class="p">();</span>
<span class="p">}).</span><span class="nx">filter</span><span class="p">(</span><span class="kd" style="font-weight: bold;">function</span> <span class="p">(</span><span class="nx">value</span><span class="p">)</span> <span class="p">{</span>
<span class="k" style="font-weight: bold;">return</span> <span class="nx">value</span><span class="p">.</span><span class="nx">length</span> <span class="o" style="font-weight: bold;">></span> <span class="mi" style="color: #009999;">0</span><span class="p">;</span>
<span class="p">});</span>
<span class="nx">values</span><span class="p">.</span><span class="nx">onValue</span><span class="p">(</span><span class="kd" style="font-weight: bold;">function</span> <span class="p">(</span><span class="nx">value</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">$</span><span class="p">(</span><span class="s2" style="color: #dd1144;">"#notice"</span><span class="p">).</span><span class="nx">text</span><span class="p">(</span><span class="nx">value</span><span class="p">);</span>
<span class="p">});</span></pre>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Лирическое отступление: point-free style или tacit programming. Если функция - гражданин первого класса, то имея богатую библиотеку хелперных функций, можно писать, избегая термов. Получается элегантно.</span></div>
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></div>
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12.727272033691406px; line-height: 19px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><span class="kd" style="font-weight: bold;">var</span> <span class="nx">values</span> <span class="o" style="font-weight: bold;">=</span> <span class="nx">$</span><span class="p">(</span><span class="s2" style="color: #dd1144;">"#login"</span><span class="p">).</span><span class="nx">events</span><span class="p">(</span><span class="s2" style="color: #dd1144;">"click"</span><span class="p">).</span><span class="nx">map</span><span class="p">(</span>
<span class="nx">chain</span><span class="p">(</span><span class="nx">pluck</span><span class="p">(</span><span class="s1" style="color: #dd1144;">'target'</span><span class="p">),</span> <span class="nx">$</span><span class="p">,</span> <span class="nx">method</span><span class="p">(</span><span class="s1" style="color: #dd1144;">'val'</span><span class="p">)</span>
<span class="p">).</span><span class="nx">filter</span><span class="p">(</span><span class="nx">nonEmpty</span><span class="p">);</span>
<span class="nx">values</span><span class="p">.</span><span class="nx">onValue</span><span class="p">(</span><span class="kd" style="font-weight: bold;">function</span> <span class="p">(</span><span class="nx">value</span><span class="p">)</span> <span class="p">{</span> <span class="nx">$</span><span class="p">(</span><span class="s2" style="color: #dd1144;">"#notice"</span><span class="p">).</span><span class="nx">text</span><span class="p">(</span><span class="nx">value</span><span class="p">);</span> <span class="p">});</span></pre>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Теперь немного разберёмся с денотационной семантикой. Функциональных примитивов для ФРП - два. Традиционно их называют Event и Behaviour, мы же по своих соображениям возьмём другие - Stream и Box.</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Stream представляет собой дискретный поток событий и семантически эквивалентен списку кортежей “время-значение” при неубывающем времени:</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12.727272033691406px; line-height: 19px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><span class="kr" style="font-weight: bold;">type</span> <span class="kt" style="color: #445588; font-weight: bold;">Stream</span><span class="p">[</span><span class="n">a</span><span class="p">]</span> <span class="ow" style="font-weight: bold;">=</span> <span class="p">[(</span><span class="kt" style="color: #445588; font-weight: bold;">T</span><span class="p">,</span> <span class="n">a</span><span class="p">)]</span></pre>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Box представляет собой непрерывное значение, изменяющееся во времени и семантически эквивалентен просто функции времени.</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12.727272033691406px; line-height: 19px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><span class="kr" style="font-weight: bold;">type</span> <span class="kt" style="color: #445588; font-weight: bold;">Box</span><span class="p">[</span><span class="n">a</span><span class="p">]</span> <span class="ow" style="font-weight: bold;">=</span> <span class="kt" style="color: #445588; font-weight: bold;">T</span> <span class="ow" style="font-weight: bold;">-></span> <span class="n">a</span></pre>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">На этих двух китах стоит функциональное реактивное программирование. Отличаются они тем, что при подписке на поток вы не получаете значения последнего произошедшего события - только следующее. Подписавшись же на коробку, вы сразу получаете значение последнего произошедшего события, и начинаете ждать следующего.</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Лирическое отступление: push против pull. Семантика, которую я дал для события и поведения приводит нас к pull-driven реализации, которая, хоть её очень легко понять, чисто и красиво написать и замечательно о ней рассуждать и доказывать, по эффективности сильно проигрывает push-driven реализации. Однако же, push-driven реализация в целом более некрасива и сложна. Мы будем говорить в основном о push-driven реализации, потому что только ей можно нормально пользоваться в реальном мире.</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Писать будем только интерфейс библиотеки, и если захотим поделиться чем-то интересным - тогда и реализацию.</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Что у нас в потоке может быть? Всё. Простейшие конструкторы:</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12.727272033691406px; line-height: 19px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><span class="nx">Box</span><span class="p">.</span><span class="nx">nothing</span><span class="p">();</span> <span class="c1" style="color: #999988; font-style: italic;">// empty box</span>
<span class="nx">Box</span><span class="p">.</span><span class="nx">unit</span><span class="p">(</span><span class="mi" style="color: #009999;">10</span><span class="p">);</span> <span class="c1" style="color: #999988; font-style: italic;">// box with constant value of 10</span>
<span class="nx">Stream</span><span class="p">.</span><span class="nx">never</span><span class="p">();</span> <span class="c1" style="color: #999988; font-style: italic;">// empty stream</span>
<span class="nx">Stream</span><span class="p">.</span><span class="nx">unit</span><span class="p">(</span><span class="mi" style="color: #009999;">10</span><span class="p">);</span> <span class="c1" style="color: #999988; font-style: italic;">// stream with immediate value of 10</span></pre>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Самоочевидно. </span></div>
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">В дополнение - конструктор ошибки. Тема обработки исключительных ситуаций в функциональном программировании сама по себе интересна, но если вкратце - это просто возвращение некоего особого значения, которое при дальнейшей обработке, если с ним пытаются работать, как с нормальным возвратом, игнорируется и не изменяясь плывёт по цепочке вычислений в ту точку, где кто-то поинтересуется-таки, а не лежит ли там ошибка - и что-то с этим сделает.</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Введём и мы у себя понятие Error события, которое раз появившись будет нетронутым проходить все нормальные ошибки и комбинаторы до тех пор, пока кто-то специально не поинтересуется. Естественно, нужен элементарный способ сконструировать ошибку.</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12.727272033691406px; line-height: 19px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><span class="nx">Stream</span><span class="p">.</span><span class="nx">error</span><span class="p">(</span><span class="mi" style="color: #009999;">10</span><span class="p">);</span> <span class="c1" style="color: #999988; font-style: italic;">// stream with immediate error of 10</span>
<span class="nx">Box</span><span class="p">.</span><span class="nx">error</span><span class="p">(</span><span class="mi" style="color: #009999;">10</span><span class="p">);</span> <span class="c1" style="color: #999988; font-style: italic;">// box with constant error of 10</span></pre>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Это UI, поэтому, здесь будет полезна работа с временем. Базовый конструктор для этого:</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12.727272033691406px; line-height: 19px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><span class="nx">Stream</span><span class="p">.</span><span class="nx">later</span><span class="p">(</span><span class="mi" style="color: #009999;">1000</span><span class="p">,</span> <span class="mi" style="color: #009999;">10</span><span class="p">);</span> <span class="c1" style="color: #999988; font-style: italic;">// in a second pops out 10</span></pre>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Более интересно - из DOM-события. Это логично добавить в jQuery.fn:</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12.727272033691406px; line-height: 19px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><span class="nx">$</span><span class="p">(</span><span class="s1" style="color: #dd1144;">'input'</span><span class="p">).</span><span class="nx">stream</span><span class="p">(</span><span class="s1" style="color: #dd1144;">'keyup'</span><span class="p">);</span> <span class="c1" style="color: #999988; font-style: italic;">// stream with keyup events</span></pre>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Ещё хочется привязать стрим к какому-то событию в будущем. Можно создавать стрим из функции обратного вызова (callback), а можно воспользоваться другой абстракцией из функционального мира: promise. </span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Вот это способ обработать конец асинхронного действия с функцией обратного вызова: </span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12.727272033691406px; line-height: 19px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><span class="nx">asyncCall</span><span class="p">(</span><span class="nx">data</span><span class="p">,</span><span class="kd" style="font-weight: bold;">function</span><span class="p">(</span><span class="nx">response</span><span class="p">){</span>
<span class="c1" style="color: #999988; font-style: italic;">// You have response from your asynchronous call here.</span>
<span class="p">},</span> <span class="kd" style="font-weight: bold;">function</span><span class="p">(</span><span class="nx">err</span><span class="p">){</span>
<span class="c1" style="color: #999988; font-style: italic;">// if the async call fails, the error callback is invoked</span>
<span class="p">});</span></pre>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">А вот так это делается с помощью promise:</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12.727272033691406px; line-height: 19px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><span class="kd" style="font-weight: bold;">var</span> <span class="nx">promise</span> <span class="o" style="font-weight: bold;">=</span> <span class="nx">asyncCall</span><span class="p">(</span><span class="nx">data</span><span class="p">);</span>
<span class="nx">promise</span><span class="p">.</span><span class="nx">done</span><span class="p">(</span><span class="kd" style="font-weight: bold;">function</span><span class="p">(</span><span class="nx">response</span><span class="p">){</span>
<span class="c1" style="color: #999988; font-style: italic;">// You have response from your asynchronous call here.</span>
<span class="p">}).</span><span class="nx">fail</span><span class="p">(</span><span class="kd" style="font-weight: bold;">function</span><span class="p">(</span><span class="nx">err</span><span class="p">){</span>
<span class="c1" style="color: #999988; font-style: italic;">// if the async call fails, you have the error response here.</span>
<span class="p">});</span></pre>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">То есть, всё как обычно в функциональном программировании - возвращаем специальное значение и можем с ним что-то такое делать. В новом jQuery обещания используются очень активно - все вызовы ajax и все анимации возвращают такой promise, который успешно завершается при хорошем ответе от сервера или конце анимации, а неуспешно - при плохом ответе от сервера (мне трудно придумать fail для анимации).</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Интерфейс очень удобный и очень нужный, поэтому мы им и возпользуемся:</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12.727272033691406px; line-height: 19px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><span class="nx">Stream</span><span class="p">.</span><span class="nx">fromPromise</span><span class="p">(</span><span class="nx">$</span><span class="p">.</span><span class="nx">ajax</span><span class="p">(</span><span class="nx">params</span><span class="p">));</span>
<span class="c1" style="color: #999988; font-style: italic;">// pops a success event on successful response</span>
<span class="c1" style="color: #999988; font-style: italic;">// or the error event on error response</span></pre>
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Итак, что мы можем сделать с нашими потоками?</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Самое простое - отобразить, или пропустить через функцию. Для коллекций, наверно, это всем знакомо.</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12.727272033691406px; line-height: 19px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><span class="nx">_</span><span class="p">.</span><span class="nx">map</span><span class="p">([</span><span class="mi" style="color: #009999;">1</span><span class="p">,</span> <span class="mi" style="color: #009999;">2</span><span class="p">,</span> <span class="mi" style="color: #009999;">3</span><span class="p">],</span> <span class="kd" style="font-weight: bold;">function</span> <span class="p">(</span><span class="nx">x</span><span class="p">)</span> <span class="p">{</span> <span class="k" style="font-weight: bold;">return</span> <span class="nx">x</span><span class="o" style="font-weight: bold;">*</span><span class="nx">x</span><span class="p">;</span> <span class="p">});</span> <span class="c1" style="color: #999988; font-style: italic;">// returns [1, 4, 9]</span></pre>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">На потоке и коробке map работает совершенно очевидным способом - получается новый поток или коробка, значения на которой соответствуют исходным, пропущенным через функцию.</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12.727272033691406px; line-height: 19px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><span class="nx">priceValue</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="kd" style="font-weight: bold;">function</span><span class="p">(</span><span class="nx">x</span><span class="p">)</span> <span class="p">{</span>
<span class="k" style="font-weight: bold;">return</span> <span class="nx">x</span> <span class="o" style="font-weight: bold;">></span> <span class="mi" style="color: #009999;">1000</span><span class="p">;</span>
<span class="p">});</span></pre>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">В примере мы получим булевое значение, характеризующее, достаточно ли денег предлагает пользователь.</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Лирическое отступление. Вы только что познакомились с функтором. В функциональном программировании, функтор - это контейнер, позволяющий выполнить некоторую функцию над своим содержимым и завернуть результат в такой же контейнер. Эта операция обычно называется fmap. В этом смысле, список и наша коробочка со значением (или поток событий) - одно и то же. Потому что их можно обработать единообразно - пропустить значения через функцию, сохранив форму контейнера. fmap там ещё должен удовлетворять двум простеньким законам, и если будет интересно, мы про них расскажем. А пока продолжим.</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Рядом со словом map часто звучит что? filter. Rails программисты знают его под словом “select”.</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12.727272033691406px; line-height: 19px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><span class="nx">priceValue</span><span class="p">.</span><span class="nx">filter</span><span class="p">(</span><span class="kd" style="font-weight: bold;">function</span><span class="p">(</span><span class="nx">x</span><span class="p">)</span> <span class="p">{</span>
<span class="k" style="font-weight: bold;">return</span> <span class="nx">x</span> <span class="o" style="font-weight: bold;">>=</span> <span class="mi" style="color: #009999;">1000</span><span class="p">;</span>
<span class="p">});</span></pre>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Мы получим значение цены, если оно превышает 1000. Опять-таки, хорошая аналогия с коллекциями.</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Ладно. Перейдём к по-настоящему интересной функции. flatMap. Это тоже преобразование значений в контейнере, но существенно более общим образом. Функция, которая передаётся в flatMap должна возвращать не значение, а значение, завёрнутое в новый контейнер. Сам же flatMap каким-то образом связывает результаты этой функции и возвращает опять-таки обёрнутое значение. Что-то на словах сложно получается.</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Ну вот, например, есть список пользователей, а у каждого из них есть список комментариев. Нужно получить список всех комментариев.</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12.727272033691406px; line-height: 19px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><span class="nx">_</span><span class="p">.</span><span class="nx">flatMap</span><span class="p">(</span><span class="nx">users</span><span class="p">,</span> <span class="kd" style="font-weight: bold;">function</span> <span class="p">(</span><span class="nx">user</span><span class="p">)</span> <span class="p">{</span> <span class="k" style="font-weight: bold;">return</span> <span class="nx">user</span><span class="p">.</span><span class="nx">comments</span><span class="p">();</span> <span class="p">});</span>
<span class="c1" style="color: #999988; font-style: italic;">// returns flat list of all the comments the users have</span></pre>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Обратите внимание, что comments() может вернуть и пустой список - что, в свою очередь, никак не вложится в результат.</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">В нашем случае функция внутри flatMap должная возвращать не список, а поток или коробку. А вот связывать результат можно по-разному. Можно в результирующий поток замешать события всех дочерних потоков. Это наиболее логичная стратегия для потока. А можно подписаться на первый дочерний поток, а при появлении второго, переключиться на него и отписаться от первого. Это наиболее логичная стратегия для коробки.</span></div>
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Заканчивать же результирующий поток будем тогда, когда все дети и родительский поток закончились.</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Зачем нам такое преобразование? Хм. Сейчас покажу. Это невероятно мощная штука. Для начала, её можно использовать для прозрачного связывания локальных потоков с асинхронными действиями.</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.425; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: #f8f8f8; color: #333333; font-family: Consolas; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></div>
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12.727272033691406px; line-height: 19px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><span class="kd" style="font-weight: bold;">var</span> <span class="nx">requests</span> <span class="o" style="font-weight: bold;">=</span> <span class="nx">usernames</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="kd" style="font-weight: bold;">function</span><span class="p">(</span><span class="nx">u</span><span class="p">)</span> <span class="p">{</span>
<span class="k" style="font-weight: bold;">return</span> <span class="p">{</span> <span class="nx">url</span><span class="o" style="font-weight: bold;">:</span> <span class="s2" style="color: #dd1144;">"/check-username/"</span> <span class="o" style="font-weight: bold;">+</span> <span class="nx">u</span><span class="p">;</span> <span class="p">}</span>
<span class="p">});</span>
<span class="nx">requests</span><span class="p">.</span><span class="nx">flatMap</span><span class="p">(</span><span class="kd" style="font-weight: bold;">function</span> <span class="p">(</span><span class="nx">params</span><span class="p">)</span> <span class="p">{</span>
<span class="k" style="font-weight: bold;">return</span> <span class="nx">Stream</span><span class="p">.</span><span class="nx">fromPromise</span><span class="p">(</span><span class="nx">$</span><span class="p">.</span><span class="nx">ajax</span><span class="p">(</span><span class="nx">params</span><span class="p">));</span>
<span class="p">});</span>
<span class="c1" style="color: #999988; font-style: italic;">// usernames => "John", "Peter"</span>
<span class="c1" style="color: #999988; font-style: italic;">// requests => {"url": "/check-username/John"}, ...</span>
<span class="c1" style="color: #999988; font-style: italic;">// flatMap => {correct: true}, {correct: false}</span></pre>
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Во-вторых, с её помощью можно написать map и filter.</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12.727272033691406px; line-height: 19px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><span class="nx">Stream</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">map</span> <span class="o" style="font-weight: bold;">=</span> <span class="kd" style="font-weight: bold;">function</span> <span class="p">(</span><span class="nx">f</span><span class="p">)</span> <span class="p">{</span>
<span class="k" style="font-weight: bold;">return</span> <span class="k" style="font-weight: bold;">this</span><span class="p">.</span><span class="nx">flatMap</span><span class="p">(</span><span class="kd" style="font-weight: bold;">function</span> <span class="p">(</span><span class="nx">x</span><span class="p">)</span> <span class="p">{</span>
<span class="k" style="font-weight: bold;">return</span> <span class="nx">Stream</span><span class="p">.</span><span class="nx">unit</span><span class="p">(</span><span class="nx">f</span><span class="p">(</span><span class="nx">x</span><span class="p">));</span>
<span class="p">});</span>
<span class="p">}</span>
<span class="nx">Stream</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">filter</span> <span class="o" style="font-weight: bold;">=</span> <span class="kd" style="font-weight: bold;">function</span> <span class="p">(</span><span class="nx">f</span><span class="p">)</span> <span class="p">{</span>
<span class="k" style="font-weight: bold;">return</span> <span class="k" style="font-weight: bold;">this</span><span class="p">.</span><span class="nx">flatMap</span><span class="p">(</span><span class="kd" style="font-weight: bold;">function</span> <span class="p">(</span><span class="nx">x</span><span class="p">)</span> <span class="p">{</span>
<span class="k" style="font-weight: bold;">if</span> <span class="nx">f</span><span class="p">(</span><span class="nx">x</span><span class="p">)</span> <span class="p">{</span>
<span class="k" style="font-weight: bold;">return</span> <span class="nx">Stream</span><span class="p">.</span><span class="nx">unit</span><span class="p">(</span><span class="nx">x</span><span class="p">);</span>
<span class="p">}</span> <span class="k" style="font-weight: bold;">else</span> <span class="p">{</span>
<span class="k" style="font-weight: bold;">return</span> <span class="nx">Stream</span><span class="p">.</span><span class="nx">nothing</span><span class="p">();</span>
<span class="p">}</span>
<span class="p">});</span>
<span class="p">}</span></pre>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Но наибольшие возможности flatMap открывает для написания комбинаторов. Давайте предположим, что нам нужно скомбинировать две коробки в одну. Например для получения значения “пароль и подтверждение” заполнен корректно.</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12.727272033691406px; line-height: 19px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><span class="nx">password</span><span class="p">.</span><span class="nx">map2</span><span class="p">(</span><span class="nx">passwordConfirmation</span><span class="p">,</span>
<span class="kd" style="font-weight: bold;">function</span><span class="p">(</span><span class="nx">l</span><span class="p">,</span> <span class="nx">r</span><span class="p">)</span> <span class="p">{</span> <span class="k" style="font-weight: bold;">return</span> <span class="nx">l</span> <span class="o" style="font-weight: bold;">==</span> <span class="nx">r</span><span class="p">;</span> <span class="p">});</span></pre>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Давайте попробуем написать map2:</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12.727272033691406px; line-height: 19px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><span class="nx">Box</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">map2</span> <span class="o" style="font-weight: bold;">=</span> <span class="kd" style="font-weight: bold;">function</span> <span class="p">(</span><span class="nx">other</span><span class="p">,</span> <span class="nx">f</span><span class="p">)</span> <span class="p">{</span>
<span class="k" style="font-weight: bold;">return</span> <span class="k" style="font-weight: bold;">this</span><span class="p">.</span><span class="nx">flatMap</span><span class="p">(</span><span class="kd" style="font-weight: bold;">function</span> <span class="p">(</span><span class="nx">x</span><span class="p">)</span> <span class="p">{</span>
<span class="k" style="font-weight: bold;">return</span> <span class="nx">other</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="kd" style="font-weight: bold;">function</span> <span class="p">(</span><span class="nx">y</span><span class="p">)</span> <span class="p">{</span> <span class="k" style="font-weight: bold;">return</span> <span class="nx">f</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">);</span> <span class="p">});</span>
<span class="p">});</span>
<span class="p">}</span></pre>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b><br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Поскольку операция map2 имеет смысл только на Box, мы используем версию flatMap, которая берёт только последний поток.</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Те, кто сейчас сказал “о, я всё понял!” - поздравляю, вы познакомились с монадами.</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Да, монада - это способ положить простое значение в контейнер и способ его достать и сделать новый контейнер. Ну плюс три простых как азимовские закона, о которых мы тоже можем рассказать. Положить простое значение в контейнер принято называть unit (мы его назвали так же), а сделать новый контейнер принято называть bind (мы его назвали flatMap и это имя реально имеет шанс победить, потому что на Scala тупо больше человек пишет код за деньги).</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Поскольку мы получили монаду, мы получили аппликативный функтор, и это подтверждается наличием map2 (который позволяет нам тривиально определить apply).</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12.727272033691406px; line-height: 19px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><span class="nx">Box</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">apply</span> <span class="o" style="font-weight: bold;">=</span> <span class="kd" style="font-weight: bold;">function</span> <span class="p">(</span><span class="nx">other</span><span class="p">)</span> <span class="p">{</span>
<span class="k" style="font-weight: bold;">return</span> <span class="k" style="font-weight: bold;">this</span><span class="p">.</span><span class="nx">map2</span><span class="p">(</span><span class="kd" style="font-weight: bold;">function</span> <span class="p">(</span><span class="nx">f</span><span class="p">,</span> <span class="nx">x</span><span class="p">)</span> <span class="p">{</span> <span class="k" style="font-weight: bold;">return</span> <span class="nx">f</span><span class="p">(</span><span class="nx">x</span><span class="p">);</span> <span class="p">}</span> <span class="p">);</span>
<span class="p">}</span></pre>
<div dir="ltr" style="line-height: 1.425; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: #f8f8f8; color: #333333; font-family: Consolas; font-size: 13px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Собственно, аппликативный функтор позволяет скомбинировать функтор, содержащий функцию с функтором, содержащим значение, и получить функтор, содержащий преобразованное значение. Ну и 4 мудрёных закона, о которых можно поговорить отдельно.</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Для потоков же, вместо map2, мы сделаем не менее полезную функцию - merge, позволяющую просто объединить потоки в один. Используя flatMap для потоков, который слушает все дочерние потоки, сделать это очень просто.</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12.727272033691406px; line-height: 19px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><span class="kd" style="font-weight: bold;">var</span> <span class="nx">id</span> <span class="o" style="font-weight: bold;">=</span> <span class="kd" style="font-weight: bold;">function</span> <span class="p">(</span><span class="nx">x</span><span class="p">)</span> <span class="p">{</span> <span class="k" style="font-weight: bold;">return</span> <span class="nx">x</span><span class="p">;</span> <span class="p">}</span>
<span class="nx">Stream</span><span class="p">.</span><span class="nx">merge</span> <span class="o" style="font-weight: bold;">=</span> <span class="kd" style="font-weight: bold;">function</span> <span class="p">(</span><span class="nx">streams</span><span class="p">)</span> <span class="p">{</span>
<span class="k" style="font-weight: bold;">return</span> <span class="nx">Stream</span><span class="p">.</span><span class="nx">fromList</span><span class="p">(</span><span class="nx">streams</span><span class="p">).</span><span class="nx">flatMap</span><span class="p">(</span><span class="nx">id</span><span class="p">);</span>
<span class="p">}</span></pre>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">merge - полезная штука.</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12.727272033691406px; line-height: 19px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><span class="kd" style="font-weight: bold;">var</span> <span class="nx">inc</span> <span class="o" style="font-weight: bold;">=</span> <span class="nx">plusClicks</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="kd" style="font-weight: bold;">function</span><span class="p">()</span> <span class="p">{</span> <span class="k" style="font-weight: bold;">return</span> <span class="mi" style="color: #009999;">1</span><span class="p">;</span> <span class="p">});</span>
<span class="kd" style="font-weight: bold;">var</span> <span class="nx">dec</span> <span class="o" style="font-weight: bold;">=</span> <span class="nx">minusClicks</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="kd" style="font-weight: bold;">function</span><span class="p">()</span> <span class="p">{</span> <span class="k" style="font-weight: bold;">return</span> <span class="o" style="font-weight: bold;">-</span><span class="mi" style="color: #009999;">1</span><span class="p">;</span> <span class="p">});</span>
<span class="kd" style="font-weight: bold;">var</span> <span class="nx">change</span> <span class="o" style="font-weight: bold;">=</span> <span class="nx">plus</span><span class="p">.</span><span class="nx">merge</span><span class="p">(</span><span class="nx">minus</span><span class="p">);</span></pre>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Ещё пара примеров фокусов с flatMap:</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12.727272033691406px; line-height: 19px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><span class="nx">Stream</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">debounce</span> <span class="o" style="font-weight: bold;">=</span> <span class="kd" style="font-weight: bold;">function</span> <span class="p">(</span><span class="nx">delay</span><span class="p">)</span> <span class="p">{</span>
<span class="k" style="font-weight: bold;">return</span> <span class="k" style="font-weight: bold;">this</span><span class="p">.</span><span class="nx">flatMapLast</span><span class="p">(</span><span class="kd" style="font-weight: bold;">function</span> <span class="p">(</span><span class="nx">value</span><span class="p">)</span> <span class="p">{</span>
<span class="k" style="font-weight: bold;">return</span> <span class="nx">Stream</span><span class="p">.</span><span class="nx">later</span><span class="p">(</span><span class="nx">delay</span><span class="p">,</span> <span class="nx">value</span><span class="p">);</span>
<span class="p">});</span>
<span class="p">}</span></pre>
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">debounce сглаживает слишком частые события. То есть, если на исходном потоке события будут возникать чаще, чем delay, то отправится только последнее из них. Здесь мы используем неродной flatMap, на что и указываем.</span></div>
<b style="font-weight: normal;"><br /></b><span style="font-family: Arial; font-size: 15px; line-height: 1.15; text-align: justify; white-space: pre-wrap;">Или вот - очень полезный комбинатор sampledBy:</span><br />
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12.727272033691406px; line-height: 19px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><span class="nx">Box</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">sampledBy</span> <span class="o" style="font-weight: bold;">=</span> <span class="kd" style="font-weight: bold;">function</span> <span class="p">(</span><span class="nx">sampler</span><span class="p">)</span> <span class="p">{</span>
<span class="kd" style="font-weight: bold;">var</span> <span class="nx">that</span> <span class="o" style="font-weight: bold;">=</span> <span class="k" style="font-weight: bold;">this</span><span class="p">;</span>
<span class="k" style="font-weight: bold;">return</span> <span class="nx">sampler</span><span class="p">.</span><span class="nx">flatMap</span><span class="p">(</span><span class="kd" style="font-weight: bold;">function</span> <span class="p">()</span> <span class="p">{</span> <span class="k" style="font-weight: bold;">return</span> <span class="nx">that</span><span class="p">.</span><span class="nx">take</span><span class="p">(</span><span class="mi" style="color: #009999;">1</span><span class="p">);</span> <span class="p">}</span> <span class="p">);</span>
<span class="p">}</span></pre>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">О нём легко думать, как об отображении (map) потока на коробку.</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Вот как просто и красиво таким способом записывается такая сложная и неприятная вещь, как drag and drop. Получаем события мыши:</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12.727272033691406px; line-height: 19px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><span class="nv" style="color: teal;">mousedown = </span><span class="nx">$</span><span class="p">(</span><span class="nb" style="color: #0086b3;">document</span><span class="p">).</span><span class="nx">stream</span><span class="p">(</span><span class="s" style="color: #dd1144;">'mousedown'</span><span class="p">,</span> <span class="s" style="color: #dd1144;">'.item'</span><span class="p">)</span>
<span class="nv" style="color: teal;">mouseup = </span><span class="nx">$</span><span class="p">(</span><span class="nb" style="color: #0086b3;">document</span><span class="p">).</span><span class="nx">stream</span><span class="p">(</span><span class="s" style="color: #dd1144;">'mouseup'</span><span class="p">)</span>
<span class="nv" style="color: teal;">mousemove = </span><span class="nx">$</span><span class="p">(</span><span class="nb" style="color: #0086b3;">document</span><span class="p">).</span><span class="nx">stream</span><span class="p">(</span><span class="s" style="color: #dd1144;">'mousemove'</span><span class="p">)</span></pre>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Легко и непринуждённо получаем такую прелесть, как событие mouseDrag:</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12.727272033691406px; line-height: 19px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><span class="nv" style="color: teal;">mousedrag = </span><span class="nx">mousedown</span><span class="p">.</span><span class="nx">flatMapLast</span><span class="p">(</span>
<span class="nf" style="color: #990000; font-weight: bold;">(e)-></span> <span class="nx">mousemove</span><span class="p">.</span><span class="nx">takeUntil</span><span class="p">(</span><span class="nx">mouseup</span><span class="p">)</span>
<span class="p">)</span></pre>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Ловим положение курсора...</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12.727272033691406px; line-height: 19px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><span class="nv" style="color: teal;">cursorPosition = </span><span class="nx">mousemove</span><span class="p">.</span><span class="nx">box</span><span class="p">().</span><span class="nx">map</span><span class="p">(</span>
<span class="nf" style="color: #990000; font-weight: bold;">(e)-></span> <span class="p">{</span> <span class="nv" style="color: teal;">x: </span><span class="nx">e</span><span class="p">.</span><span class="nx">clientX</span><span class="p">,</span> <span class="nv" style="color: teal;">y: </span><span class="nx">e</span><span class="p">.</span><span class="nx">clientY</span> <span class="p">}</span>
<span class="p">)</span></pre>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">...в нужные нам моменты…</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12.727272033691406px; line-height: 19px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><span class="nv" style="color: teal;">startPosition = </span><span class="nx">cursorPosition</span><span class="p">.</span><span class="nx">sampledBy</span> <span class="nx">mousedown</span>
<span class="nv" style="color: teal;">currentPosition = </span><span class="nx">cursorPosition</span><span class="p">.</span><span class="nx">sampledBy</span> <span class="nx">mousedrag</span></pre>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Потом немножко считаем…</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12.727272033691406px; line-height: 19px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><span class="nv" style="color: teal;">shiftPosition = </span><span class="nx">startPosition</span><span class="p">.</span><span class="nx">zip</span><span class="p">(</span><span class="nx">currentPosition</span><span class="p">)</span>
<span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="nf" style="color: #990000; font-weight: bold;">(s, m)-></span>
<span class="p">{</span> <span class="nv" style="color: teal;">left: </span><span class="nx">m</span><span class="p">.</span><span class="nx">x</span><span class="o" style="font-weight: bold;">-</span><span class="nx">s</span><span class="p">.</span><span class="nx">x</span><span class="p">,</span> <span class="nv" style="color: teal;">top: </span><span class="nx">m</span><span class="p">.</span><span class="nx">y</span><span class="o" style="font-weight: bold;">-</span><span class="nx">s</span><span class="p">.</span><span class="nx">y</span> <span class="p">}</span>
<span class="p">)</span></pre>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">...и двигаем объект, куда просили:</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12.727272033691406px; line-height: 19px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><span class="nx">shiftPosition</span><span class="p">.</span><span class="nx">onValue</span><span class="p">(</span> <span class="nf" style="color: #990000; font-weight: bold;">(pos)-></span> <span class="nx">$</span><span class="p">(</span><span class="s" style="color: #dd1144;">'.item'</span><span class="p">).</span><span class="nx">css</span><span class="p">(</span><span class="nx">pos</span><span class="p">)</span> <span class="p">)</span></pre>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Ах, да, и просим браузер не умничать:</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12.727272033691406px; line-height: 19px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><span class="nx">mousedown</span><span class="p">.</span><span class="nx">onValue</span> <span class="nf" style="color: #990000; font-weight: bold;">(e)-></span> <span class="nx">e</span><span class="p">.</span><span class="nx">preventDefault</span><span class="p">()</span></pre>
<b style="font-weight: normal;"><br /></b><span style="font-family: Arial; font-size: 15px; line-height: 1.15; text-align: justify; white-space: pre-wrap;">Можно ещё вместо этого обойтись замыканиями:</span><br />
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<pre style="background-color: #f8f8f8; border-bottom-left-radius: 3px; border-bottom-right-radius: 3px; border-top-left-radius: 3px; border-top-right-radius: 3px; border: 1px solid rgb(221, 221, 221); color: #333333; font-family: Consolas, 'Liberation Mono', Courier, monospace; font-size: 12.727272033691406px; line-height: 19px; overflow: auto; padding: 6px 10px; word-wrap: normal;"><span class="nv" style="color: teal;">newPosition = </span><span class="nx">mousedown</span><span class="p">.</span><span class="nx">flatMapLast</span> <span class="nf" style="color: #990000; font-weight: bold;">(md)-></span>
<span class="nv" style="color: teal;">target = </span><span class="nx">$</span><span class="p">(</span><span class="nx">md</span><span class="p">.</span><span class="nx">target</span><span class="p">);</span>
<span class="p">{</span><span class="nx">left</span><span class="p">,</span> <span class="nx">top</span><span class="p">}</span> <span class="o" style="font-weight: bold;">=</span> <span class="nx">target</span><span class="p">.</span><span class="nx">offset</span><span class="p">();</span>
<span class="p">[</span><span class="nx">startX</span><span class="p">,</span> <span class="nx">startY</span><span class="p">]</span> <span class="o" style="font-weight: bold;">=</span> <span class="p">[</span><span class="nx">md</span><span class="p">.</span><span class="nx">clientX</span> <span class="o" style="font-weight: bold;">-</span> <span class="nx">left</span><span class="p">,</span> <span class="nx">md</span><span class="p">.</span><span class="nx">clientY</span> <span class="o" style="font-weight: bold;">-</span> <span class="nx">top</span><span class="p">]</span>
<span class="nx">mousemove</span><span class="p">.</span><span class="nx">map</span> <span class="nf" style="color: #990000; font-weight: bold;">(mm)-></span>
<span class="nv" style="color: teal;">target: </span><span class="nx">target</span>
<span class="nv" style="color: teal;">left: </span><span class="nx">mm</span><span class="p">.</span><span class="nx">clientX</span> <span class="o" style="font-weight: bold;">-</span> <span class="nx">startX</span>
<span class="nv" style="color: teal;">top: </span><span class="nx">mm</span><span class="p">.</span><span class="nx">clientY</span> <span class="o" style="font-weight: bold;">-</span> <span class="nx">startY</span>
<span class="p">.</span><span class="nx">takeUntil</span> <span class="nx">mouseup</span></pre>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">В общем, инструмент гибкий и мощный, и единственное, чего ему не хватает - это паттернов применения. То есть, нужно, чтобы побольше людей так писало - тогда они будут ставить и решать реальные проблемы и пустота начнём кое-как заполняться.</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Итак, как теперь жить:</span></div>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<ul style="margin-bottom: 0pt; margin-top: 0pt;">
<li dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<a href="https://github.com/baconjs/bacon.js" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">Bacon.js</span></a><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, полностью рабочая библиотека.</span></div>
</li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<a href="https://github.com/it-vecherka/jnoid" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">jnoid</span></a><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">, демонстрационная библиотека, которая была написана, чтобы разобраться в теме и другие тоже могли в ней разобраться. Для этого даже было использовано “литературное программирование”.</span></div>
</li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<a href="https://github.com/tailrecursion/javelin" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">javelin</span></a><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> для closurescript от пользователя с одним из самых зачётных ников на Гитхабе.</span></div>
</li>
<li dir="ltr" style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; list-style-type: disc; text-decoration: none; vertical-align: baseline;"><div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<a href="http://elm-lang.org/" style="text-decoration: none;"><span style="background-color: transparent; color: #1155cc; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; vertical-align: baseline; white-space: pre-wrap;">elm</span></a><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"> для маньяков. Красивая вещь для поразбираться, не очень подходит для работы - там jQuery нету.</span></div>
</li>
</ul>
<b style="font-weight: normal;"><br /><span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;"></span></b>
<br />
<div dir="ltr" style="line-height: 1.15; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="background-color: transparent; color: black; font-family: Arial; font-size: 15px; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: none; vertical-align: baseline; white-space: pre-wrap;">Берите любой и пробуйте решать проблемы. Не пожалеете.</span></div>
<br />
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span>
Другие ссылки:<br />
<br />
<br />
<ul style="text-align: left;">
<li><a href="http://l.dn.ua/">Донецкий Лямбда-клуб</a>.</li>
<li><a href="http://www.slideshare.net/dimkiriyenko/ss-28519560">Слайды</a>.</li>
</ul>
</div>
Anonymoushttp://www.blogger.com/profile/17152157727140681943noreply@blogger.com1tag:blogger.com,1999:blog-6138770299473511818.post-78556943339344045012013-08-12T08:07:00.002+03:002013-08-12T08:08:44.622+03:00Дюжина прочитанных книг - второй выпуск<div dir="ltr" style="text-align: left;" trbidi="on">
Согласно статистике, предыдущий <a href="http://dimoneverything.blogspot.com/2013/05/12.html">подобный выпуск</a> хоть кто-то, да прочитал. Поэтому публикую второй.<br />
<br />
Итак, 12 книг, прочитанных с момента предыдущего выпуска, в произвольном порядке, с короткими рецензиями и оценками без спойлеров.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEgbdcE5F3ihsEnj-Sd9ueiFxVCTwfdlor97oYtTB2veBh7CWi5-8D9lGJYGfKj1Z3DcFxM11fVuYg6XTZvPTRGuwkX2t_oXa84mz41dSOnoWKbSyavnERFwTHTASa3L-GAMWqHlvvZZY/s1600/cover.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjEgbdcE5F3ihsEnj-Sd9ueiFxVCTwfdlor97oYtTB2veBh7CWi5-8D9lGJYGfKj1Z3DcFxM11fVuYg6XTZvPTRGuwkX2t_oXa84mz41dSOnoWKbSyavnERFwTHTASa3L-GAMWqHlvvZZY/s200/cover.jpg" width="118" /></a></div>
1. <a href="http://flibusta.net/b/269038">"Анафем" Нила Стивенсона.</a> Лучшее, что я читал, со времени "Ложной слепоты". Необычная вселенная, интересные персонажи, восхитительная концепция матического мира. Обилие выдуманных слов, на мой взгляд - не фича, можно было бы и без них, но в некоторых случаях таки именно они помогают автору передать мысль. Книге можно было бы пожелать быть покороче, возможно, иметь сюжет позакрученнее, но вытерпеть можно. Несколько раз я откладывал книгу в сторону и на полчасика просто задумывался. Эти моменты стоят того, чтобы прочитать книгу.<br />
<br />
По этой книге я буду должен вам отдельную рецензию. Возможно, со спойлерами.<br />
<br />
Оценка: 10+.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvZPzY2R1hMmhHsN2H90HvNcBjkSnYYE3NI9zno19j31Rb0_tSw6-r8OX8ybQ1F997bPhzoTpbgmAr3ssBUdTJI-fEJaYZ1M05W8X3o2Gj-gszg9u2XVaYn61P3OYxaNI_mLNox3j8uVs/s1600/7703.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvZPzY2R1hMmhHsN2H90HvNcBjkSnYYE3NI9zno19j31Rb0_tSw6-r8OX8ybQ1F997bPhzoTpbgmAr3ssBUdTJI-fEJaYZ1M05W8X3o2Gj-gszg9u2XVaYn61P3OYxaNI_mLNox3j8uVs/s200/7703.jpg" width="132" /></a></div>
2. <a href="http://etextlib.ru/Book/Details/26474">"Большое, малое и человеческий разум" Пенроуза</a>. Взгляд Пенроуза на то, как работает человеческий разум, стоит того, чтобы с ним ознакомиться. Поэтому, рекомендую вам <a href="http://flibusta.net/b/266217">"Новый ум короля"</a> и <a href="http://flibusta.net/b/95428">"Тени разума"</a>. Эта же книга является их продолжением, и содержит довольно много полемики по поводу его неортодоксальных тезисов, поэтому, в ней есть главы, написанные Хокингом, Картрайт и Шимони. Мне понравилось.<br />
<br />
Оценка: 8.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvRxT5J_DhGCMWI0ocvwyp3XwbtYLRE8AGbmQ2TSyq6QinNg5PDNyN3k_RrH3W9zPztrHMks3naJafMRJOwRfHDkClRVYt8uLMFMelgb8T1SE7baCaoefFDELqptqmsBp7SYqfIghGw0Y/s1600/bjarnason_cover150.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvRxT5J_DhGCMWI0ocvwyp3XwbtYLRE8AGbmQ2TSyq6QinNg5PDNyN3k_RrH3W9zPztrHMks3naJafMRJOwRfHDkClRVYt8uLMFMelgb8T1SE7baCaoefFDELqptqmsBp7SYqfIghGw0Y/s200/bjarnason_cover150.jpg" width="159" /></a></div>
3. <a href="http://www.manning.com/bjarnason/">"Функциональное программирование на Scala"</a> Рунара Бьярнасона. Наконец-то! Наконец-то нашлась книга, объяснившая мне моноиды, функторы, аппликативные функторы, Trampoline, корекурсию, алгебраические типы данных, а самое страшное - монады! Книга прекрасно инкрементально излагает основы функционального программирования, функционального дизайна, способы решения проблем в этой парадигме, как вообще думают эти люди и зачем нужна теория категорий. Упражнения ни в коем случае нельзя пропускать - автор считает, что вы их делаете и весомая часть книги находится именно там.<br />
<br />
Способ изложения - поставить проблему, разработать для неё набор примитивов, написать на них высокоуровневый интерфейс. Повторить несколько раз, оглянуться, нет ли чего похожего в том, что написали, чтобы выделить абстракцию более высокого уровня.<br />
<br />
Я категорически рекомендую к прочтению эту книгу всем своим коллегам, которые хотят разобраться в упомянутых темах. Тем, кто уже разобрался, книга, возможно, даст немного.<br />
<br />
Оценка: 9.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgE29uOJzCyI3f3h9d25vgO5w1R4uMWmbgGuhy7-0r7pF-W9ZQW5RzR0rzhRcdayDd5oOY7Bsg1mEbRODA0hDqkdvO4ajKN0aHWKJbZ7VMOXCIE7fAZUSn9N1n9O7c7IhY3hqINqymP-u8/s1600/books.jpeg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgE29uOJzCyI3f3h9d25vgO5w1R4uMWmbgGuhy7-0r7pF-W9ZQW5RzR0rzhRcdayDd5oOY7Bsg1mEbRODA0hDqkdvO4ajKN0aHWKJbZ7VMOXCIE7fAZUSn9N1n9O7c7IhY3hqINqymP-u8/s200/books.jpeg" width="130" /></a></div>
4. <a href="http://readanybooks.net/horror/Rita/1586.html">"Rita Hayworth and Shawshank Redemption"</a> Стивена Кинга. Решил попробовать читать художественную литературу на английском, и чтобы было проще, начать с хорошо знакомых и любимых книг. Эта книга восхитительна и будет таковой всегда. Она не о ужасах тюрьмы и не о изощрённых хитростях побега, она - о человеке и свободе. Если не читали - прочитайте немедленно.<br />
<br />
Если же говорить об особенностях оригинала, было нелегко. Кинг очень хорошо владеет языком, использует широкий словарь и разнообразные тактики построения предложений, и если бы это был первый раз, когда я читаю эту книгу, я бы не выдержал и взял перевод. В некоторых местах я уловил тонкости, не перешедшие в перевод, но в целом, нельзя сказать, что в оригинале читать обязательно, а то, мол, всё пропустите. Оригинал я читал не ради этого.<br />
<br />
Оценка: 10+.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-g2fRc5tYQJbLHsyQcEQukEITRsRR39acX5zLY4PhXuLnp44ovPzM9RFpoxsRGifpeEZhd-Rz8Ao3ETzpPx0JI1yYwGm3YiKRSMnIT1xSjZAh4jUJQPIqZEOa0xQUGw-At8QORC9Phhc/s1600/cover-1.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-g2fRc5tYQJbLHsyQcEQukEITRsRR39acX5zLY4PhXuLnp44ovPzM9RFpoxsRGifpeEZhd-Rz8Ao3ETzpPx0JI1yYwGm3YiKRSMnIT1xSjZAh4jUJQPIqZEOa0xQUGw-At8QORC9Phhc/s200/cover-1.jpg" width="128" /></a></div>
5. <a href="http://flibusta.net/b/107623">"Варяг" Александра Мазина.</a> Думал, что буду читать как книгу для отдыха. Так и вышло. Однако, если сравнивать книгу с другими книгами того же смысла (не особо нагружающими голову, которые можно читать на ходу и всё же не пойти на красный свет), книга резко становится весьма неплохой. Язык хороший (почти), сюжет не такой уж и прямолинейный, много экшена (куда без него), но при этом откровенной чуши нет.<br />
<br />
Оценка: 5.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCQkicfixReef5gH-Fw1bfnLcStrsNYZEnZ7a-KYjONH4Bb5-mKSliukmjKl3rrH9lXeCn3faRS_Yw8hmd8KwfEzsYebmd7ZA7Z8f-YOWtvIDpqpijQCinBA3g53qgXdO4Z3lsSitxcJM/s1600/cover-2.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiCQkicfixReef5gH-Fw1bfnLcStrsNYZEnZ7a-KYjONH4Bb5-mKSliukmjKl3rrH9lXeCn3faRS_Yw8hmd8KwfEzsYebmd7ZA7Z8f-YOWtvIDpqpijQCinBA3g53qgXdO4Z3lsSitxcJM/s200/cover-2.jpg" width="128" /></a></div>
6. <a href="http://flibusta.net/b/109513">"Место для битвы" Александра Мазина</a>. Да, я даже прочитал первую книгу продолжения. И она даже оказалась лучше начала. Язык автора стал намного лучше, сюжет, конечно, блистать не стал, но всё же интересно, чем это закончится.<br />
<br />
Оценка: 6.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_hI1DitzGOmlGefHSAs0xOeoveItt7IaTmn8EW38vo1fMyVd3sj_2ZDw0qvbP1O0bIEnnoxbdZM34dtSfyHnqNIR44fzbjNWQHGAjMzsyvQFsN59s925hnH88BnKvngCoge8LYZlX87Y/s1600/cover-3.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi_hI1DitzGOmlGefHSAs0xOeoveItt7IaTmn8EW38vo1fMyVd3sj_2ZDw0qvbP1O0bIEnnoxbdZM34dtSfyHnqNIR44fzbjNWQHGAjMzsyvQFsN59s925hnH88BnKvngCoge8LYZlX87Y/s200/cover-3.jpg" width="130" /></a></div>
7. <a href="http://flibusta.net/b/242911">"Московская магия" Артёма Михалёва</a>. А вот это уже типичная жёлтая книга, для чтения, когда вообще не хочется думать. На фоне таких книг, опять-таки весьма неплоха хотя бы сюжетом - несколько сюжетных линий нетипичны для этого жанра.<br />
<br />
Хотя - рояли, плоские герои...<br />
<br />
Оценка: 3.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9PKJkB1T0vN8YxPOP-cOePrG9u9qz6VWRcVIA7k5fPBypaXy1Ot3ghjP3xmSq9p93eflNp3WUsjKTeRaeSb-HGrvgviJwbYOxKrXqGvix7ECk7XgVb3jLAADJHOhVIm4KUgKEQfXhUBw/s1600/cover-4.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9PKJkB1T0vN8YxPOP-cOePrG9u9qz6VWRcVIA7k5fPBypaXy1Ot3ghjP3xmSq9p93eflNp3WUsjKTeRaeSb-HGrvgviJwbYOxKrXqGvix7ECk7XgVb3jLAADJHOhVIm4KUgKEQfXhUBw/s200/cover-4.jpg" width="126" /></a></div>
8. <a href="http://flibusta.net/b/306928">"Тёмное сердце" Артёма Михалёва</a>. Да, продолжение. Да, не хуже и не лучше.<br />
<br />
Оценка: 3.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0xaNtHvzKtNdL6kSKhK8gjIJYw94KWRVPTcF1zMSZgPo0PXiUXrvUyWWHX_ztp-X6XUuZ9Yuoi9G0eQSei8NHXTPB8y1cG040lysyXghZ1jv3j5L0knG1G_Llf6PxOep6okwcp9Rg0Yk/s1600/1984first.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0xaNtHvzKtNdL6kSKhK8gjIJYw94KWRVPTcF1zMSZgPo0PXiUXrvUyWWHX_ztp-X6XUuZ9Yuoi9G0eQSei8NHXTPB8y1cG040lysyXghZ1jv3j5L0knG1G_Llf6PxOep6okwcp9Rg0Yk/s200/1984first.jpg" width="134" /></a></div>
9. <a href="http://www.george-orwell.org/1984/0.html">"1984" Джорджа Оруэлла</a>. Читал в рамках "почитать знакомую художественную литературу на английском". Книга хорошая, сильная, отлично проработанная, повороты сюжета для меня непредсказуемые. Нужно только учитывать, что послевкусие от книги неоднозначное - можно надолго впасть в плохое настроение.<br />
<br />
По поводу особенностей оригинала - оказалось неожиданно легко. Очень простой язык, мало лишних синонимов, простые и короткие предложения. Если хотите попробовать читать на английском, вполне можно пробовать с этой книги.<br />
<br />
Оценка: 9.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3NRcrCf2uXfGTv1U4hF-g1jJBoFlCfUFco1A123tfpExiPnL99ZWYeB26_cZbP_jgLO6JNpJHKTuWFLiWH9qKRnL6seQnx4a4a6mViXrAXE8QJXNda_ZLN30zyhOZ1OC5334rQfKWUC0/s1600/The_Elegant_Universe._Superstrings%252C_Hidden_Dimensions%252C_and_the_Quest_for_the_Ultimate_Theory%2528rus%2529.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3NRcrCf2uXfGTv1U4hF-g1jJBoFlCfUFco1A123tfpExiPnL99ZWYeB26_cZbP_jgLO6JNpJHKTuWFLiWH9qKRnL6seQnx4a4a6mViXrAXE8QJXNda_ZLN30zyhOZ1OC5334rQfKWUC0/s200/The_Elegant_Universe._Superstrings%252C_Hidden_Dimensions%252C_and_the_Quest_for_the_Ultimate_Theory%2528rus%2529.jpg" width="134" /></a></div>
10. <a href="http://flibusta.net/b/265118">"Элегантная вселенная" Брайана Грина</a>. Классная книга, классный перевод, ничуть не хуже Хокинговских "Историй". Теория суперструн и браны, квантовый мир, мультивселенные и другие интересные штуки захватывают и не отпускают.<br />
<br />
Минусы - книга старая, до постройки "БАК" и до проигранного пари Хокинга, кто знаком с темой - это почувствует.<br />
<br />
Рекомендую всем, кому понравилась "Краткая история времени" Хокинга.<br />
<br />
Оценка: 9.<br />
<br />
11. <a href="http://flibusta.net/b/136378">"Урожаи и посевы" Александра Гротендика</a>. Очень интересная книга, пролившая свет для меня на то, чем занимаются математики. Не в смысле, чем они полезны, а именно в смысле, что что они на работе сидят и делают. То есть, автор пытается показать природу математического открытия. Автор, кстати, <a href="http://ru.wikipedia.org/wiki/%D0%93%D1%80%D0%BE%D1%82%D0%B5%D0%BD%D0%B4%D0%B8%D0%BA,_%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80">весьма серьёзная личность</a>.<br />
<br />
Как это часто бывает с хорошими книгами, иногда книга казалась нудной, но в целом это того стоило.<br />
<br />
Оценка: 9.<br />
<br />
12. <a href="http://flibusta.net/b/194458">"Лифт" Юрия Бурнозова</a>. Рассказ. По рекомендации Андрея Бабичева. Спасибо, Андрей, я теперь в лифт не сяду =)<br />
<br />
Оценка: 7.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div style="-webkit-text-stroke-width: 0px; color: black; font-family: Times; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; margin: 0px; orphans: auto; text-align: left; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px;">
<br /></div>
Сейчас в прочтении находятся: <a href="http://flibusta.net/b/267144">"В начале была командная строка" Нила Стивенсона</a>, <a href="http://book.realworldhaskell.org/read/">"Real World Haskell" Брайана Сулливана</a> и очень медленно продвигающийся <a href="http://www.ldsbox.kiev.ua/index.php?page=shop.product_details&flypage=flypage.tpl&product_id=115&category_id=35&option=com_virtuemart&Itemid=53">"Иисус есть Христос" Джеймса Талмейджа</a>.<br />
<br />
Ну и вы советуйте, если есть что.</div>
Anonymoushttp://www.blogger.com/profile/17152157727140681943noreply@blogger.com3tag:blogger.com,1999:blog-6138770299473511818.post-55932888101790997082013-07-11T08:56:00.002+03:002013-07-11T08:57:39.111+03:00Немного мыслей о языках программирования<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvsO8qK13sLTt0vWsG8l1tYQmFuBk9D3-ZTHDuCGWRNItSRgI9nSeNu6oo2DNLi0ZXG37DeqwAYDirQrd1pkAo26VTDG8LJj1qZJUxYbjUxr2lhfIec6DJh2Q79yHs0vUIUtC9FicHh8s/s1600/Charles_Sanders_Peirce_theb3558.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhvsO8qK13sLTt0vWsG8l1tYQmFuBk9D3-ZTHDuCGWRNItSRgI9nSeNu6oo2DNLi0ZXG37DeqwAYDirQrd1pkAo26VTDG8LJj1qZJUxYbjUxr2lhfIec6DJh2Q79yHs0vUIUtC9FicHh8s/s400/Charles_Sanders_Peirce_theb3558.jpg" width="292" /></a></div>
<span id="goog_1278794390"></span><span id="goog_1278794391"></span><br /></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Есть такая штука - естественный язык. Википедия определяет его как язык для общения людей, не созданный целенаправленно.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Но по мне, это определение плохое. Или мне нужен другой термин, описывающий понятие, очень похожее на естественный язык, но всё же ему не тождественное. Например, язык общего назначения или как-то ещё.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Словом, то, что в моём сознании стоит за "естественным языком", это язык, служащий для выражения мыслей и идей общего назначения. Это бытовые мысли: "хочу есть", "как пройти в библиотеку", это художественные произведения, это философские трактаты, это вообще научные произведения в гуманитарных науках, да и в какой-то мере в естественных и абстрактных тоже - хотя там встречаются и другие языки.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Причём, у естественных языков есть правила. Синтаксические (грамматические), семантические, прагматические. При том, что адресат языка допускает широкие отклонения от правил без потери передаваемой мысли, тем не менее, это поглощает дополнительные ресурсы считывателя на отсеивание этих помех. Когда отступлений от правил немного (запятая там, не та гласная здесь), это ещё не так заметно, но когда их много, и хуже того, в пределах грамматической, семантической и прагматической норм находится отличная от желаемой трактовка - возникает коллизия и адресат высказывания вынужден как-то эту коллизию решать. Если же информации для решения коллизии недостаточно, приходится даже запрашивать дополнительную информацию - переспрашивать. Синтетический пример: "Простите, а где вы пропустили запятую в "<i>Оставаться в школе не разрешаю никому покинуть помещение.</i>"?".</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Хочу ещё уточнить, что это синтаксические правила не допускают неоднозначной трактовки. Есть ещё правила семантические и прагматические, и они описывают верный способ излагать мысль на более высоком уровне - конструкцию предложений, разбивку на абзацы, пролог-эпилог, предпочительность синонимов, в поэзии - стихотворный размер, в научных статьях - правила оформления. И их нарушение тоже вызывает поначалу незаметные, но позже накапливающиеся эффекты, затрудняющие понимание мысли адресатом.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
А вот есть такая область человеческого знания, как музыка. Для того, чтобы записывать музыкальные мысли и идеи есть язык. И этот язык - ноты. Музыканты как-то договорились его использовать и очень довольны. На самом деле, музыкальную идею можно рассказать и на естественном языке. Но там будет довольно плохое соотношение "сигнал-шум". Этот язык относится к категории "формальных", что в бытовом понимании означает всего лишь более строгие правила. Более формальная трактовка понятия "формальный язык" говорит, что это множество конечных цепочек над конечным алфавитом, порождённых некоей, опять-таки, формальной структурой (грамматикой, БНФ-конструкцией или вообще конечным словарём), что тоже намекает нам, что он менее свободен, чем естественный. За счёт большей ограниченности исчезают коллизии (в естественном языке коллизии можно уменьшить избыточностью, именно поэтому на любом формальном языке идея занимает меньше места), то есть, исчезает необходимость переспрашивать и вероятность быть неправильно понятым. При этом, адресат языка всё ещё человек, и он всё ещё может иногда правильно понять идею, даже если она изложена с нарушением правил нотной грамоты. Однако в лучшем случае это вызовет у него раздражение, в худшем же будет потерян смысл.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Можно ещё вспомнить про большое количество языков математики, формулы в физике, уравнения химических реакций - подобие вполне очевидно. Во всех случаях получатель мысли - человек, можно немного отклониться от правил языка, но это всегда идёт во вред передаче сигнала.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Кажется, что языки программирования и компьютерные языки в этом смысле другие, ведь их получатель - компьютер, и он не допускает столь широких отклонений от нормы, как допускает человек. Вроде бы он вообще не допускает отклонений. Программы ведь пишутся для компьютеров, так?</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Не так. Программы пишутся для людей. Об этом говорят хотя бы отступы и выравнивание, которые большинство языков программирования игнорируют. И ваш браузер, в котором вы это читаете, допускает большое количество отклонений от нормы html, пытаясь донести высказанную человеком мысль до другого человека - вас.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Язык программирования в этом смысле ничем не отличается от всех остальных видов языков, которые я перечислил. Это <i>способ выразить мысль или идею - в данном случае, идею алгоритма или программы. </i>Причём, человек поймёт её, даже если вы отклонитесь от нормы - возможно. Но сделать ему это будет сложнее, могут возникнуть коллизии и карма у вас будет испорчена.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Опять-таки, есть масса не синтаксических правил в компьютерных языках, на которые компьютеру наплевать. Про отступы я уже говорил, но есть ещё именование идентификаторов, предельная сложность одной единицы кода, шаблоны проектирования, уровни доступа, запахи кода, парадигмы (функциональное / объектное / аспектное программирование), мутабельность-иммутабельность... Которые важны исключительно людям.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Итог: язык программирования - это удобный способ описать вычислительную идею. В нём есть некие правила, которых необходимо придерживаться, чтобы облегчить прохождение идеи до получателя - другого человека. Естественный язык - это удобный способ описать идею "общего назначения". В нём есть некие правила, которых необходимо придерживаться, чтобы облегчить прохождение идеи до получателя - другого человека.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
А выводов два.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Во-первых, вы пишете не работающую программу, а свои идеи о том, как должна работать программа. Вы пишете для людей. "Работает" - недостаточный критерий для признания кода хорошим.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Во-вторых, если вы понимаете необходимость писать хороший код, понимайте и необходимость хорошо выражать мысли. Если важны отступы в коде, важен синтаксис и пунктуация в обычных текстах. Если важны правила именования переменных, важен выбор синонимов в письмах, статьях и просто высказываниях.<br />
<br />
P.S. На картинке сверху Чарль Сандерс Пирс, основоположник <a href="http://ru.wikipedia.org/wiki/%D0%A1%D0%B5%D0%BC%D0%B8%D0%BE%D1%82%D0%B8%D0%BA%D0%B0">семиотики</a>.</div>
</div>
Anonymoushttp://www.blogger.com/profile/17152157727140681943noreply@blogger.com0tag:blogger.com,1999:blog-6138770299473511818.post-16611779567471337722013-05-17T08:19:00.001+03:002013-05-17T08:24:09.251+03:0012 книг, которые я прочитал наиболее недавно<div dir="ltr" style="text-align: left;" trbidi="on">
Как-то сейчас хуже читать стали, вы не заметили?<br />
<br />
<div style="text-align: justify;">
А ведь чтение формирует личность, мнение, напрягает правильные участки мозга, снижая вероятность болезни Альцгеймера, обогащает мир... Не читая, вы ограничиваетесь одним миром - читая, вы имеете очень много миров.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Предлагаю вашему вниманию 12 книг, которые я прочитал (или перечитал) наиболее недавно, без какого-либо порядка, с моими комментариями (без спойлеров).</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsbzItDK3rM2c7MJ8gLAfMfiMZZ4MdLeCGtdTImn-HflAk-AoIoNA_QrrBFwJroCwyC69Z26gDTd0hxJS1XL7Y_T2O7ijC2ZlXfmgYzt0BTR3lnd4yyVFz1333QWgv09U4uTzr6pSpYR0/s1600/cover.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsbzItDK3rM2c7MJ8gLAfMfiMZZ4MdLeCGtdTImn-HflAk-AoIoNA_QrrBFwJroCwyC69Z26gDTd0hxJS1XL7Y_T2O7ijC2ZlXfmgYzt0BTR3lnd4yyVFz1333QWgv09U4uTzr6pSpYR0/s200/cover.jpg" width="135" /></a></div>
1. <a href="http://flibusta.net/b/199443">"Песни Гипериона" Дэна Симмонса</a>. Это эпично. Далёкое будущее, сложная заковыристая вселенная, огромное количество разнообразнейших миров и сюжет, достойный как мощной космооперы, так и замечательного детектива.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Во всех четырёх книгах серии я получил массу разнообразнейшего удовольствия, а свои эмоции в конце всей серии я вообще нескоро забуду.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Первая книга, состоящая по сути из нескольких новелл, написанных разным языком и в разных стилях, прекрасна сама по себе.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Будьте осторожны: в серии есть слабые места, но надо прорваться - вы не пожалеете.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Оценка: 10. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6vFYol6qF5D8kAS5VsZKzlzG9NgYYSuhsbrr0gpz4Jm4W5_keJA1jRcR72K1JrggY1OTil3c7e5jDf-_0ZUlzYQuCRdq7E2wHVIbOXZrB7mcko_IFhI3RWymjzjIcQosNUeG7kVTyMyM/s1600/cover-1.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6vFYol6qF5D8kAS5VsZKzlzG9NgYYSuhsbrr0gpz4Jm4W5_keJA1jRcR72K1JrggY1OTil3c7e5jDf-_0ZUlzYQuCRdq7E2wHVIbOXZrB7mcko_IFhI3RWymjzjIcQosNUeG7kVTyMyM/s200/cover-1.jpg" width="128" /></a></div>
2. <a href="http://flibusta.net/b/315739">"Ложная слепота" Питера Уотса</a>. Обязательно к прочтению. Мне нечего добавить к <a href="http://aratak.livejournal.com/51952.html">рецензии моего друга</a>, кроме своего глубочайшего восхищения этой книгой.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Оценка: 10+.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhp8NY2MXfH_UwSoYKxG2zGEgTd9g0OCaUqYcaeyavVXXYUwSe0k0O416Kojj4xLlFYnOVqr8WVHDE6s2j7kHyKDKG6K5Ti7j0Y5btxjorJJvnxkbo3vRRCEnXsrn2iRFFaxbLUbWXZdVY/s1600/cover-2.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhp8NY2MXfH_UwSoYKxG2zGEgTd9g0OCaUqYcaeyavVXXYUwSe0k0O416Kojj4xLlFYnOVqr8WVHDE6s2j7kHyKDKG6K5Ti7j0Y5btxjorJJvnxkbo3vRRCEnXsrn2iRFFaxbLUbWXZdVY/s200/cover-2.jpg" width="141" /></a></div>
3. <a href="http://flibusta.net/b/133090">"Сами боги" Айзека Азимова</a>. Качественная научная фантастика, с привычными для Азимова социальными намёками. Вторая часть книги, про параллельный мир - шедевральная, построенное общество очень необычное и воистину из параллельного мира, но при этом устойчивое и вызывающее доверие. Есть и интересная загадка, которую можно попробовать решить раньше, чем автор её нам поведает.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Оценка: 8.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyL8_R5Tb7prl4zC0yf4i2AcWz7GCuv4Ej6P70JC9poZPcYlucYN58jyX9Ignbrc8ZjfxoTO0ISRHqhH1-TcZ-hVN_mGU4GJ5X_CyLHzaRfxFUmQlw4qXUpkdNO0COaCI0qvHwkYWXznc/s1600/361064.gif" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyL8_R5Tb7prl4zC0yf4i2AcWz7GCuv4Ej6P70JC9poZPcYlucYN58jyX9Ignbrc8ZjfxoTO0ISRHqhH1-TcZ-hVN_mGU4GJ5X_CyLHzaRfxFUmQlw4qXUpkdNO0COaCI0qvHwkYWXznc/s200/361064.gif" width="129" /></a></div>
4. <a href="http://flibusta.net/b/267052">"Простая одержимость. Бернхард Риман и величайшая нерешенная проблема в математике." Джона Дербишира</a>. Интересная книга американского математика рассказывает о многочисленных попытках доказать (или опровергнуть) гипотезу Римана, предпринимавшихся за последние сто пятьдесят лет, а также о судьбах людей, одержимых этой задачей. Гипотеза Римана входит в список "проблем тысячелетия", за решение любой из которых Математический Институт Клея обещает премию в один миллион долларов. Книга доставила много удовольствия, приятно напрягла голову и неплохо расширила горизонт, и я очень её рекомендую.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Оценка: 9.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
5. <a href="http://samlib.ru/d/dulepa_m_n/creators.shtml">"Творцы судьбы" некоего М. Дулепы</a>. Новый для меня жанр "литературной РПГ", где герой играет в какую-нибудь игру и собственно об этом и рассказывает. То, что было мне интересно - это как живут, на каком языке разговаривают и о чём думают задроты массивных многопользовательский онлайн игр - я узнал довольно много о быте и мыслях этой субкультуры.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
У меня такое ощущение, что я прочитал лучшую книгу этого жанра (т.е., все остальные будут хуже), поэтому жанр для себя я закрываю.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Оценка: 5.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjs6uwXfXkmiayfLUYEJvpUSKrI026mST702lxxJqZ2FbMVy-qmf0MMCcb8b0yK-jZn4mx_pOeiZlSDNbHAxgFYEu1SyJ_Uj90OJ5DpUgTWmv1M2AP2E75TbriadNjgPrI7Ec3wfYbFQkM/s1600/cover-3.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjs6uwXfXkmiayfLUYEJvpUSKrI026mST702lxxJqZ2FbMVy-qmf0MMCcb8b0yK-jZn4mx_pOeiZlSDNbHAxgFYEu1SyJ_Uj90OJ5DpUgTWmv1M2AP2E75TbriadNjgPrI7Ec3wfYbFQkM/s200/cover-3.jpg" width="126" /></a></div>
6. <a href="http://flibusta.net/b/238417">"Пентаграмма войны" Андрея Земляного</a>. Книги из серии "можно читать на ходу, второй рукой собирая кубик Рубика и разговаривая по телефону". Голову не напрягает ничем, события вокруг героев складываются максимально благоприятные, ножки роялей торчат из кажого куста и за героев не переживаешь совершенно. Читать когда очень устали.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Оценка: 3.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXG-Wbc4gHC6KNiaM7nYzTkUyxvBVm0JBkEKTna-ALNIQY_JJr2AC2OfEMVxNeD5NcsD4qC093HF_XcPX7Xar03CsO4YzSyJzad2vDvW24WZPhyphenhyphenkQ9k9oqOlByLPkvnzo8X_lCOW0wgYg/s1600/cover-4.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXG-Wbc4gHC6KNiaM7nYzTkUyxvBVm0JBkEKTna-ALNIQY_JJr2AC2OfEMVxNeD5NcsD4qC093HF_XcPX7Xar03CsO4YzSyJzad2vDvW24WZPhyphenhyphenkQ9k9oqOlByLPkvnzo8X_lCOW0wgYg/s200/cover-4.jpg" width="146" /></a></div>
7. <a href="http://flibusta.net/b/189156">"Мир в ореховой скорлупке" Стивена Хокинга</a>. Ну что я вам могу сказать? Если вы не читали "Краткую историю времени", <a href="http://flibusta.net/b/78758">марш читать</a>, а то так и не узнаете ничего о мире, в котором мы живём. Вот моя <a href="http://dimoneverything.blogspot.com/2010/04/blog-post_23.html">попытка написать рецензию</a> на "Краткую историю времени".</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Эта же книга рассказывает о научных свершениях в мире физики, произошедших с тех пор. Хокинг пишет очень хорошо - несмотря на то, что рассматриваются такие вещи, как <span style="text-align: left;">сферы применения теоремы Гёделя о неполноте и теории струн, квантовой теории и супергравитации, читатель своей ущербности не чувствует, абсолютно всё понятно и даже почти просто, а мир после этого играет новыми красками.</span></div>
<div style="text-align: justify;">
<span style="text-align: left;"><br /></span></div>
<div style="text-align: justify;">
<span style="text-align: left;">Оценка: 9.</span></div>
<div style="text-align: justify;">
<span style="text-align: left;"><br /></span></div>
<div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEia0j-vpXk15oBWEEMwQhKtdxv9ZId-8zHO6Y8IETG7wlCvo4kQByda_j8fuIPZztMj3ZOYYhIaf6D6c_b1x2GgTGQRlk1gTT0QRYzXyPT15gBcHc7KmBx1LBEBfG0Mpi0XvYRQkwrZvWk/s1600/cover-5.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEia0j-vpXk15oBWEEMwQhKtdxv9ZId-8zHO6Y8IETG7wlCvo4kQByda_j8fuIPZztMj3ZOYYhIaf6D6c_b1x2GgTGQRlk1gTT0QRYzXyPT15gBcHc7KmBx1LBEBfG0Mpi0XvYRQkwrZvWk/s200/cover-5.jpg" width="130" /></a></div>
<span style="text-align: left;">8. <a href="http://flibusta.net/b/315722">"Перекрёсток миров" Павла Кобылянского</a>. Ещё одна книга, которую можно читать, если очень устал или не хочется думать. Эта, правда, получше многих своих аналогов как минимум интересным социумом и, соответственно, местом действия. Но в принципе полноценный представитель своего жанра.</span></div>
<div style="text-align: justify;">
<span style="text-align: left;"><br /></span></div>
<div style="text-align: justify;">
<span style="text-align: left;">Оценка: 5.</span></div>
<div style="text-align: justify;">
<span style="text-align: left;"><br /></span></div>
<div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUxRUS2YtgF-681dqs-IojZwIjGEMCb0H0yn_J34WkrHzzWr_p5fZixmcJxBEbttXl5WvUUSBeZg_0ZLAMVe7N_HvkboRQQlkhX2ZYiteFRK4xK80JgY7zvDH6su4HqYRrZQSZJRWFAyc/s1600/cover_rus.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUxRUS2YtgF-681dqs-IojZwIjGEMCb0H0yn_J34WkrHzzWr_p5fZixmcJxBEbttXl5WvUUSBeZg_0ZLAMVe7N_HvkboRQQlkhX2ZYiteFRK4xK80JgY7zvDH6su4HqYRrZQSZJRWFAyc/s200/cover_rus.jpg" width="128" /></a></div>
<span style="text-align: left;">9. <a href="http://flibusta.net/b/315738">"Заводная" Паоло Бачигалупи</a>. Очень интересный автор, очень необычный и интересный роман. Не очень далёкое будущее, но трудно узнаваемая поначалу Земля (потом понимаешь, что люди остались те же), необычное место действия - Бангкок, описанный, судя по всему, со знанием дела, и довольно новый для меня жанр - биопанк. Много думал при чтении, при этом, сюжет с определённого места захватывает и держит. Немного непривычно написание книги в настоящем времени, как это делают в пьесах и киносценариях, но быстро привыкаешь.</span></div>
<div style="text-align: justify;">
<span style="text-align: left;"><br /></span></div>
<div style="text-align: justify;">
Оценка: 9+.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEii4GGFClyAh7JP96TcM2A6LSRx0fT9HHoXTMTE-l6rQ4NXhXpXvRvcqiY48-q3uvs_uf7Z7qbuflQRMRmQOIXe82wBATGmRYnSM8bpKh4wSFXwxvIE7Bpo_APjD9_9IyXAt4cQBepg2Qw/s1600/oblozka.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEii4GGFClyAh7JP96TcM2A6LSRx0fT9HHoXTMTE-l6rQ4NXhXpXvRvcqiY48-q3uvs_uf7Z7qbuflQRMRmQOIXe82wBATGmRYnSM8bpKh4wSFXwxvIE7Bpo_APjD9_9IyXAt4cQBepg2Qw/s200/oblozka.jpg" width="143" /></a></div>
10. <a href="http://flibusta.net/b/99034">"Проект Россия" неизвестного автора</a>. Публицистика на тему "Как нам обустроить Россию", прорелигиозная, довольно качественная книга. Предложения короткие, как будто их специально рубили, читая, просто чувствуешь ритм, с которым авторы излагают свою позицию. Напрягает циклическое повторение одних и тех же мыслей, но в остальном стиль приятный.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Несколько новых и интересных мыслей я для себя подчерпнул.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Оценка: 6. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrAfPaZS0E8n08JEyWL8yK3x1j3Byolm2d8F8UV35tdhZchN9mtO4nBfsr7TdWxb5CSFbHqBKZ2Xdj2yCsqjmk6rm1dQ-_h2LGbK0Kjuwig4nP_8Ey1rtSA1GIOboC0HRpxpuqqxnBDRI/s1600/cnp04307big.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrAfPaZS0E8n08JEyWL8yK3x1j3Byolm2d8F8UV35tdhZchN9mtO4nBfsr7TdWxb5CSFbHqBKZ2Xdj2yCsqjmk6rm1dQ-_h2LGbK0Kjuwig4nP_8Ey1rtSA1GIOboC0HRpxpuqqxnBDRI/s200/cnp04307big.jpg" width="119" /></a></div>
11. "Я, робот" Айзека Азимова. Конечно же, я читал эту книгу и раньше, но сейчас, по совету друга, перечитал. Книга оказалась не о роботах, а о человеке. Впечатления совсем не те, что в детстве и я очень рекомендую перечитать, если последний раз вы читали её в возрасте до 15 лет.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Оценка: 9.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjx3-WGtR4-mg114Wgo3dq2epJPFT02fOKVFEyrR8ArNdlSoJkadJL6Wi5TeX-3aHLFYivFoYB7md_rUPp4z8Fl4cbmMPaEEQL9EB-6gREPlnP3EpV0vnYwtgBYrmSEGsY2TRXWZwrdIoM/s1600/1005190598.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjx3-WGtR4-mg114Wgo3dq2epJPFT02fOKVFEyrR8ArNdlSoJkadJL6Wi5TeX-3aHLFYivFoYB7md_rUPp4z8Fl4cbmMPaEEQL9EB-6gREPlnP3EpV0vnYwtgBYrmSEGsY2TRXWZwrdIoM/s200/1005190598.jpg" width="200" /></a></div>
12. <a href="http://www.ozon.ru/context/detail/id/8696277/">"Изучай Haskell во имя добра!" Мирана Липовача</a>. Наверно, лучшая книга по языку программирования Haskell для людей, которым мало что говорят слова "аппликативный функтор" или "моноид". Как говорится, даже я понял.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Книга многое мне дала в понимании того, что же такое "функциональное программирование", как надо мыслить, работая в этой парадигме, что можно делать с помощью мощной системы типов и зачем вообще люди придумали Haskell.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<a href="http://learnyouahaskell.com/chapters">Читал на английском.</a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Оценка: 8.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Сейчас в прочтении находятся: <a href="http://flibusta.net/b/269038">"<span style="text-align: left;">Анафем</span>" Нила Стивенсона</a> как художественная книга, <a href="http://flibusta.net/b/192654">"Большое, малое и человеческий разум" Роджера Пенроуза</a> как научная публицистика, <a href="http://www.ldsbox.kiev.ua/index.php?page=shop.product_details&flypage=flypage.tpl&product_id=115&category_id=35&option=com_virtuemart&Itemid=53">"Иисус есть Христос" Джеймса Талмейджа</a> как религиозная публицистика и <a href="http://www.manning.com/bjarnason/">"Функциональное программирование на Scala" Рунара Бьярнасона</a> как книга по профессии.<br />
<br />
А у вас есть что посоветовать почитать?</div>
</div>
Anonymoushttp://www.blogger.com/profile/17152157727140681943noreply@blogger.com7tag:blogger.com,1999:blog-6138770299473511818.post-20459100921091623222013-03-29T11:33:00.001+02:002013-04-16T14:19:02.702+03:00Почему функциональное программирование?<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<div class="p1" style="text-align: justify;">
<div style="text-align: right;">
<i>Текст моего выступления на внутрикорпоративной мини-конференции.</i></div>
<br />
Сначала скажу, что такое функциональное программирование. Что это такое вообще, можно узнать в <a href="http://en.wikipedia.org/wiki/Functional_programming">Википедии</a>, в <a href="http://mitpress.mit.edu/sicp/full-text/book/book.html">SICP</a> (там его называют просто - программирование) или у товарища Одерского в курсе <a href="https://www.coursera.org/course/progfun">Functional Programming Principles with Scala</a>.</div>
<div class="p2" style="text-align: justify;">
<br /></div>
<div class="p3" style="text-align: justify;">
Я же хочу рассказать о том, чем меня цепляет функциональное программирование. И это одна довольно простая вещь. В привычном нам процедурном программировании, описывая алгоритм, мы отвечали на вопрос “как?” Как найти сумму? Как отсортировать массив?</div>
<div class="p2" style="text-align: justify;">
<br /></div>
<div class="p3" style="text-align: justify;">
Например, чтобы найти сумму элементов массива, нужно создать счётчик, инициализировать его нулём, пройтись по всему массиву, увеличивая счётчик на значение каждого элемента и вернуть этот счётчик.</div>
<div class="p2" style="text-align: justify;">
<br /></div>
<div class="p4">
<b id="internal-source-marker_0.13096528314054012" style="font-weight: normal;"><span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">def</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #990000; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">sum</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">(list):<br class="kix-line-break" /> result </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">=</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #009999; vertical-align: baseline; white-space: pre-wrap;">0</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">for</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> element </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">in</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> list:<br class="kix-line-break" /> result </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">=</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> result </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">+</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> element<br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">return</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> result</span></span></b></div>
<div class="p4">
<b style="font-weight: normal;"><span style="background-color: #f8f8f8; color: #333333; font-family: Consolas; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></b></div>
<div class="p3" style="text-align: justify;">
Я намеренно не использую здесь возможности Питона написать это функционально. Фактически, это псевдокод на почти любом алгоритмическом языке программирования.</div>
<div class="p2" style="text-align: justify;">
<br /></div>
<div class="p3" style="text-align: justify;">
Важно здесь то, что код фактически повторяет то, что я сказал выше - “чтобы найти сумму...”</div>
<div class="p2" style="text-align: justify;">
<br /></div>
<div class="p3" style="text-align: justify;">
В функциональном программировании, описывая алгоритм, мы отвечаем на вопрос “что?” Что такое сумма? Что такое отсортированный массив?</div>
<div class="p2" style="text-align: justify;">
<br /></div>
<div class="p3" style="text-align: justify;">
Например, сумма пустого массива - это ноль. Сумма непустого массива - это первый элемент плюс сумма массива, составленного из остальных элементов.</div>
<div class="p2" style="text-align: justify;">
<br /></div>
<div class="p4">
<b id="internal-source-marker_0.13096528314054012" style="font-weight: normal;"></b></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<b id="internal-source-marker_0.13096528314054012" style="font-weight: normal;"><span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><span style="background-color: #f8f8f8; color: #990000; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">sum'</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #445588; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">[]</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">=</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #009999; vertical-align: baseline; white-space: pre-wrap;">0</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span></span></b><br />
<b style="font-weight: normal;"><span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><span style="background-color: #f8f8f8; color: #990000; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">sum'</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> (x</span><span style="background-color: #f8f8f8; color: #445588; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">:</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">xs) </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">=</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> x </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">+</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> sum' xs</span></span></b></div>
<div>
<b id="internal-source-marker_0.13096528314054012" style="font-weight: normal;"><span style="background-color: #f8f8f8; color: #333333; font-family: Consolas; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></b></div>
<br />
<div class="p3" style="text-align: justify;">
Опять-таки, этот код фактически повторяет то, что я сказал.</div>
<div class="p2" style="text-align: justify;">
<br /></div>
<div class="p3" style="text-align: justify;">
Я проиллюстрирую это ещё раз. Процедурная быстрая сортировка:</div>
<div class="p2" style="text-align: justify;">
<br /></div>
<div class="p4">
<b id="internal-source-marker_0.13096528314054012" style="font-weight: normal;"></b></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<b id="internal-source-marker_0.13096528314054012" style="font-weight: normal;"><span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">public</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">static</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"><</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">E </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">extends</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> Comparable</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">super</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> E</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">>></span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> List</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"><</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">E</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">></span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> quickSort</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">List</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"><</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">E</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">></span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> arr</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">)</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">{</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">if</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">arr</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f8f8f8; color: teal; vertical-align: baseline; white-space: pre-wrap;">size</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">()</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"><=</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #009999; vertical-align: baseline; white-space: pre-wrap;">1</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">)</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">return</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> arr</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">;</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> E pivot </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">=</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> arr</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f8f8f8; color: teal; vertical-align: baseline; white-space: pre-wrap;">getFirst</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">();</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /><br class="kix-line-break" /> List</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"><</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">E</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">></span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> less </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">=</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">new</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> LinkedList</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"><</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">E</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">>();</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> List</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"><</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">E</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">></span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> pivotList </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">=</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">new</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> LinkedList</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"><</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">E</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">>();</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> List</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"><</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">E</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">></span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> more </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">=</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">new</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> LinkedList</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"><</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">E</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">>();</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">for</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">E i: arr</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">)</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">{</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">if</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">i</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f8f8f8; color: teal; vertical-align: baseline; white-space: pre-wrap;">compareTo</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">pivot</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">)</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"><</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #009999; vertical-align: baseline; white-space: pre-wrap;">0</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">)</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> less</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f8f8f8; color: teal; vertical-align: baseline; white-space: pre-wrap;">add</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">i</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">);</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">else</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #990000; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">if</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">i</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f8f8f8; color: teal; vertical-align: baseline; white-space: pre-wrap;">compareTo</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">pivot</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">)</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">></span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #009999; vertical-align: baseline; white-space: pre-wrap;">0</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">)</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> more</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f8f8f8; color: teal; vertical-align: baseline; white-space: pre-wrap;">add</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">i</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">);</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">else</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> pivotList</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f8f8f8; color: teal; vertical-align: baseline; white-space: pre-wrap;">add</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">i</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">);</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">}</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /><br class="kix-line-break" /> less </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">=</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> quickSort</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">less</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">);</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> more </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">=</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> quickSort</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">more</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">);</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /><br class="kix-line-break" /> less</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f8f8f8; color: teal; vertical-align: baseline; white-space: pre-wrap;">addAll</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">pivotList</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">);</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> less</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f8f8f8; color: teal; vertical-align: baseline; white-space: pre-wrap;">addAll</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">more</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">);</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">return</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> less</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">;</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">}</span></span></span></b></div>
<div>
<b id="internal-source-marker_0.13096528314054012" style="font-weight: normal;"><span style="background-color: #f8f8f8; color: #333333; font-family: Consolas; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"><br /></span></b></div>
<br />
<div class="p2">
<br /></div>
<div class="p3" style="text-align: justify;">
Функциональная быстрая сортировка:</div>
<div class="p2">
<br /></div>
<div class="p4">
<b id="internal-source-marker_0.13096528314054012" style="font-weight: normal;"></b></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<b id="internal-source-marker_0.13096528314054012" style="font-weight: normal;"><span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">def</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> qsort</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">[</span><span style="background-color: #f8f8f8; color: #445588; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">T</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"><%</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #445588; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">Ordered</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">[</span><span style="background-color: #f8f8f8; color: #445588; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">T</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">]](</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">list</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">:</span><span style="background-color: #f8f8f8; color: #445588; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">List</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">[</span><span style="background-color: #f8f8f8; color: #445588; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">T</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">]):</span><span style="background-color: #f8f8f8; color: #445588; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">List</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">[</span><span style="background-color: #f8f8f8; color: #445588; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">T</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">]</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">=</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">{</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> list </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">match</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">{</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">case</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #445588; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">Nil</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">=></span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #445588; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">Nil</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">case</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> x</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">::</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">xs </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">=></span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">val</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">before</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">,</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">after</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">)</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">=</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> xs partition </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">(_</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"><</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> x</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">)</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> qsort</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">before</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">)</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">++</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">x </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">::</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> qsort</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">after</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">))</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">}</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">}</span></span></b></div>
<div>
<b id="internal-source-marker_0.13096528314054012" style="font-weight: normal;"><span style="background-color: #f8f8f8; color: #333333; font-family: Consolas; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"><br /></span></b></div>
<span style="text-align: justify;">И я говорю вовсе не о количестве строк кода. Я говорю о способе его прочтения. Процедурный код пишется и читается как инструкции. Функциональный код пишется и читается как определения.</span><br />
<div class="p2" style="text-align: justify;">
<br /></div>
<div class="p3" style="text-align: justify;">
Говорят, что функциональное программирование - это объяснение того, что вам нужно, математику. А императивное - это объяснение того, что вам нужно, идиоту.</div>
<div class="p2" style="text-align: justify;">
<br /></div>
<div class="p3" style="text-align: justify;">
Лирическое отступление. Рекурсия. Принято считать неотъемлемой частью функциональной парадигмы такую штуку, как оптимизация хвостового рекурсивного вызова. Без него в ряде случаев будет порождаться ненужно рекурсивный процесс, что будет приводить к падению производительности, переполнению стека и прочим радостям жизни.</div>
<div class="p2" style="text-align: justify;">
<br /></div>
<div class="p3" style="text-align: justify;">
Однако я считаю, что можно писать в функциональной парадигме и без оптимизации хвостового вызова, ничего в ней не теряя. Любой чистый алгоритм, описываемый итеративным процессом, можно описать с помощью fold (reduce, inject... как вам нравится). И если в глубинах языка описан fold, порождающий итеративный процесс, то можно во всём положиться на него. Собственно, познакомившись с fold вы, скорее всего, и будете так поступать. Сумма, записанная с помощью fold, выглядит замечательно:</div>
<div class="p2">
<br /></div>
<div class="p4">
<b id="internal-source-marker_0.13096528314054012" style="font-weight: normal;"></b></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<b id="internal-source-marker_0.13096528314054012" style="font-weight: normal;"><span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><span style="background-color: #f8f8f8; color: #990000; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">sum</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="background-color: #f8f8f8; color: teal; vertical-align: baseline; white-space: pre-wrap;">L</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">) </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">-></span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #555555; vertical-align: baseline; white-space: pre-wrap;">lists</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">:</span><span style="background-color: #f8f8f8; color: #990000; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">foldl</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">fun</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="background-color: #f8f8f8; color: teal; vertical-align: baseline; white-space: pre-wrap;">X</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">, </span><span style="background-color: #f8f8f8; color: teal; vertical-align: baseline; white-space: pre-wrap;">Sum</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">) </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">-></span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: teal; vertical-align: baseline; white-space: pre-wrap;">X</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">+</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: teal; vertical-align: baseline; white-space: pre-wrap;">Sum</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">end</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">, </span><span style="background-color: #f8f8f8; color: #009999; vertical-align: baseline; white-space: pre-wrap;">0</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">, </span><span style="background-color: #f8f8f8; color: teal; vertical-align: baseline; white-space: pre-wrap;">L</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">).</span></span></b></div>
<div>
<b id="internal-source-marker_0.13096528314054012" style="font-weight: normal;"><span style="background-color: #f8f8f8; color: #333333; font-family: Consolas; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></b></div>
<br />
<div class="p3" style="text-align: justify;">
Хотя, конечно, фича оптимизации хвостового вызова очень полезна.</div>
<div class="p2" style="text-align: justify;">
<br /></div>
<div class="p3" style="text-align: justify;">
Однако, вернёмся к теме. Чем так хорошо функциональное программирование?</div>
<div class="p3" style="text-align: justify;">
<br /></div>
<div class="p3" style="text-align: justify;">
<b id="internal-source-marker_0.13096528314054012" style="font-weight: normal; text-align: start;"><img height="431" src="https://lh6.googleusercontent.com/tYUiPHvkAEj2ukh2aV3uR7z4ND2sg8vzuVJihv8SDRwwwYFhNa4mt4dZ4vN0yXGuUCLQJQ4_BSWUgS1smZvKgpdFVto37w6MfLMVkG73kTg18Ycf3CvEPAhA7g" width="640" /></b></div>
<div class="p2" style="text-align: justify;">
<br /></div>
<div class="p3" style="text-align: justify;">
Закон Мура перестал выполняться за счёт количества мегагерц и стал выполняться за счёт количества мега-ядер. Огромных массивов данных требует горизонтального масштабирования алгоритмов их обработки. </div>
<div class="p2" style="text-align: justify;">
<br /></div>
<div class="p3" style="text-align: justify;">
Так или иначе, это коснётся каждого из нас. Потому что прекратился рост тактовой частоты одного ядра, а несколько ядер - это не обязательно в несколько раз быстрее. </div>
<div class="p2" style="text-align: justify;">
<br /></div>
<div class="p3" style="text-align: justify;">
И хотя нам бы возможно хотелось, чтобы просто продолжался рост тактовой частоты, мы не просили ни многоядерности, ни паралеллизма, но те процессоры, что делают сейчас - это единственное, чего нам следует ожидать в ближайшем будущем. И чтобы освоить предлагаемые мощности, нужно сделать параллельное программирование доступным. А то и популярным.</div>
<div class="p2" style="text-align: justify;">
<br /></div>
<div class="p3" style="text-align: justify;">
Здесь есть два близких, но разных аспекта - параллельные вычисления и конкурентные вычисления. Параллельные вычисления - это как сделать так, чтобы программа выполнялась быстрее на параллельном железе. Но она могла бы с тем же успехом работать и в одном потоке - мы просто хотим, чтобы это было быстрее.</div>
<div class="p2" style="text-align: justify;">
<br /></div>
<div class="p3" style="text-align: justify;">
Конкурентные вычисления, с другой стороны, это когда предметная область описывается как некоторое, возможно, очень большое, количество одновременных (параллельных) потоков или событий, которые конкурентно взаимодействуют.</div>
<div class="p2" style="text-align: justify;">
<br /></div>
<div class="p3" style="text-align: justify;">
Оба этих аспекта достаточно сложны в любом языке, экосистеме и парадигме, и главная проблема - это так называемый нон-детерминизм или неопределённость. Он возникает, когда параллельные вычисления разделяют между собой изменяемое состояние.</div>
<div class="p2">
<br /></div>
<div class="p4">
<b id="internal-source-marker_0.13096528314054012" style="font-weight: normal;"></b></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<b id="internal-source-marker_0.13096528314054012" style="font-weight: normal;"><span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">var</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> x </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">=</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #009999; vertical-align: baseline; white-space: pre-wrap;">0</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">;<br class="kix-line-break" /><br class="kix-line-break" />setTimeout(</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">function</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> () { x </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">=</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> x </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">+</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #009999; vertical-align: baseline; white-space: pre-wrap;">1</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">; }, </span><span style="background-color: #f8f8f8; color: #009999; vertical-align: baseline; white-space: pre-wrap;">0</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">);<br class="kix-line-break" />setTimeout(</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">function</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> () { x </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">=</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> x </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">*</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #009999; vertical-align: baseline; white-space: pre-wrap;">2</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">; }, </span><span style="background-color: #f8f8f8; color: #009999; vertical-align: baseline; white-space: pre-wrap;">0</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">);<br class="kix-line-break" /><br class="kix-line-break" />console.log(x);</span></span></b></div>
<div>
<b id="internal-source-marker_0.13096528314054012" style="font-weight: normal;"><span style="background-color: #f8f8f8; color: #333333; font-family: Consolas; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></b></div>
<br />
<div class="p3" style="text-align: justify;">
Вот такой весёлый код на джаваскрипте в браузере может вывести и 1, и 2. А если переписать его на новомодных html5 воркерах, то и 0.</div>
<div class="p2" style="text-align: justify;">
<br /></div>
<div class="p3" style="text-align: justify;">
Замечаем, однако, что в самом определении проблемы звучит “изменяемое состояние”. Так вот. Функциональное программирование - оно как раз про “избегать изменяемого состояния”. В этой парадигме широко используются иммутабельные структуры данных, а в ортодоксально функциональных языках так вообще запрещают переменные, что приводит к тому, что единственным способом организации цикла является рекурсия.</div>
<div class="p2" style="text-align: justify;">
<br /></div>
<div class="p3" style="text-align: justify;">
Именно то, что параллельные вычисления - это реальность и никуда нам от неё не деться, а функциональное программирование, в частности, отказ от изменяемого состояния, сильно облегчает нам борьбу с неопределённостью (нон-детерминизмом), что является основной причиной сложности паралеллизма и конкурентности, и обусловило всевозрастающий интерес к функциональному программированию в последние годы.</div>
<div class="p2" style="text-align: justify;">
<br /></div>
<div class="p3" style="text-align: justify;">
При написании кода в функциональной парадигме задача осмысляется и реализуется совсем по-другому, не так, как в императивной. Программист реально по-другому мыслит.</div>
<div class="p3" style="text-align: justify;">
В императивном программировании программист во времени. Инструкции выполняются последовательно, сначала одна, потом другая, и если этот порядок каким-то образом нарушается, то рушится всё.</div>
<div class="p2" style="text-align: justify;">
<br /></div>
<div class="p3" style="text-align: justify;">
В функциональном программировании программист думает не так. Он описывает одну часть, вторую, третью строит на их основании, четвёртую - комбинируя какие-то из ранее написанных... <a href="http://www.youtube.com/watch?v=3jg1AheF4n0">Мартин Одерский говорит</a>, что программист мыслит в пространстве, противопоставляя это мышлению во времени.</div>
<div class="p3" style="text-align: justify;">
<br /></div>
<div class="p3" style="text-align: justify;">
<b id="internal-source-marker_0.13096528314054012" style="font-weight: normal; text-align: start;"><img height="354px;" src="https://lh4.googleusercontent.com/KtnMEboXxo0aRo5Cchlc9DyVb9Qnvv0hykNFK_0hd92SQfWnIZvBw_iEkmZyOqGXDwq0k0Gbv-sE2YL8czlUfpjAhSwwob8vY_jXgqFCkKjkB6lUj-1j6ai4Cw" width="601px;" /></b></div>
<div class="p2" style="text-align: justify;">
<br /></div>
<div class="p3" style="text-align: justify;">
Если добавить параллельности, мыслить в пространстве это не мешает. Никто не занимает место другого. Если мыслить во времени, становится тяжело, потому что всё происходит одновременно, конкурируя за общие ресурсы. Тот самый нон-детерминизм подкрадывается к вам.</div>
<div class="p2" style="text-align: justify;">
<br /></div>
<div class="p3" style="text-align: justify;">
Для того, чтобы с этим бороться, программисты придумали блокировки, мьютексы, программную транзакционную память... Всё это работает, но об этом надо постоянно думать, это проникает в код, заполняет его, не являясь решением предметной задачи, а хуже всего то, что это “отрицательный код” - который не решает задачу, а наоборот, придерживает код, который задачу решает, чтобы тот был “поспокойнее”. </div>
<div class="p2" style="text-align: justify;">
<br /></div>
<div class="p3" style="text-align: justify;">
А хочется решать задачу.</div>
<div class="p2" style="text-align: justify;">
<br /></div>
<div class="p3" style="text-align: justify;">
И вот тут важно понять, что отказ от изменяемого состояния не приводит ни к потере выразительности, ни к потере производительности, ни к потере памяти =)</div>
<div class="p3" style="text-align: justify;">
Сначала мы добавляем иммутабельные коллекции. Т.е., структуры данных, которые невозможно изменить, как невозможно изменить число. Это делает программирование ближе к математике, где, к примеру, точка не может увеличить свою абсциссу и переместиться правее - это будет уже другая точка.</div>
<div class="p2" style="text-align: justify;">
<br /></div>
<div class="p3" style="text-align: justify;">
И операция “добавить элемент в список” должна возвращать список, отличающийся от заданного наличием данного элемента.</div>
<div class="p2" style="text-align: justify;">
<br /></div>
<div class="p3" style="text-align: justify;">
Если всё иммутабельно, такие структуры данных очень экономно расходуют память, поскольку они копируют только отличающиеся части.</div>
<div class="p2" style="text-align: justify;">
<br /></div>
<div class="p3" style="text-align: justify;">
Теперь внимание - если мы ничего не меняем, только создаём новое, то нас не волнует проблема неопределённости. Возьмём императивный код из быстрой сортировки, который делит элементы на большие некоторого значения, и меньшие, и заменим идентификаторы, чтобы он описывал какой-то доменный процесс:</div>
<div class="p2" style="text-align: justify;">
<br /></div>
<div class="p4">
<b id="internal-source-marker_0.13096528314054012" style="font-weight: normal;"></b></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<b id="internal-source-marker_0.13096528314054012" style="font-weight: normal;"><span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><span style="background-color: #f8f8f8; color: #dd1144; vertical-align: baseline; white-space: pre-wrap;">$p</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">eople </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">=</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> array();</span><span style="background-color: #f8f8f8; color: #dd1144; vertical-align: baseline; white-space: pre-wrap;">$m</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">en </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">=</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> array();</span><span style="background-color: #f8f8f8; color: #dd1144; vertical-align: baseline; white-space: pre-wrap;">$w</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">omen </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">=</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> array();</span><span style="background-color: #f8f8f8; color: #990000; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">foreach</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> (</span><span style="background-color: #f8f8f8; color: #dd1144; vertical-align: baseline; white-space: pre-wrap;">$p</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">eople as </span><span style="background-color: #f8f8f8; color: #dd1144; vertical-align: baseline; white-space: pre-wrap;">$p</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">erson) {<br class="kix-line-break" /> array_push((</span><span style="background-color: #f8f8f8; color: #dd1144; vertical-align: baseline; white-space: pre-wrap;">$p</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">erson</span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">-></span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">gender </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">==</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> 'male' </span><span style="background-color: #f8f8f8; color: #333333; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">?</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #dd1144; vertical-align: baseline; white-space: pre-wrap;">$m</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">en : </span><span style="background-color: #f8f8f8; color: #dd1144; vertical-align: baseline; white-space: pre-wrap;">$w</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">omen), </span><span style="background-color: #f8f8f8; color: #dd1144; vertical-align: baseline; white-space: pre-wrap;">$p</span><span style="background-color: #f8f8f8; color: #333333; vertical-align: baseline; white-space: pre-wrap;">erson)<br class="kix-line-break" />}</span></span></b></div>
<div>
<b id="internal-source-marker_0.13096528314054012" style="font-weight: normal;"><span style="background-color: #f8f8f8; color: #333333; font-family: Consolas; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></b></div>
<br />
<div class="p3" style="text-align: justify;">
Поделим людей на мужчин и женщин.</div>
<div class="p2" style="text-align: justify;">
<br /></div>
<div class="p3" style="text-align: justify;">
Давайте возьмём этот же код, написанный в функциональном стиле:</div>
<div class="p2" style="text-align: justify;">
<br /></div>
<div class="p4">
<b id="internal-source-marker_0.13096528314054012" style="font-weight: normal;"></b></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<b id="internal-source-marker_0.13096528314054012" style="font-weight: normal;"><span style="font-family: Courier New, Courier, monospace;"><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">val</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> people</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">:</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #445588; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">Array</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">[</span><span style="background-color: #f8f8f8; color: #445588; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">Person</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">]</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">val</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">men</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">,</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> women</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">)</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">=</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> people partition </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">(_.</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">gender </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">==</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #dd1144; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">"male"</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">)</span></span></b></div>
<div>
<b id="internal-source-marker_0.13096528314054012" style="font-weight: normal;"><span style="font-family: Courier New, Courier, monospace;"><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"><br /></span></span></b></div>
<br />
<div class="p3" style="text-align: justify;">
Во-первых, он, как это часто бывает с функциональным кодом, ярче выражает свои намерения. Во-вторых, давайте попробуем сделать вычисления параллельными.</div>
<div class="p2" style="text-align: justify;">
<br /></div>
<div class="p3" style="text-align: justify;">
Что мы будем делать в случае императивного кода? Разобьём массив на подмассивы, позапускаем потоков, выставим локи, дождёмся результатов через Thread::join... Мы всё ещё останемся с недетерминизмом, потому что массивы $men и $women будут заполняться в случайном порядке, и если нас это вдруг начнёт волновать, придётся бороться ещё и с этим. Потом, не дай Бог, у вас возникнет состояние гонки и вы убъёте как минимум четыре пациента, которых будут лечить аппаратом лучевой терапии с вашим кодом в прошивке. Кому интересно, о чём я, гуглить therac-25. Да, конкурентные вычисления, основанные на потоках, уже убивали невинных пользователей.</div>
<div class="p2" style="text-align: justify;">
<br /></div>
<div class="p3" style="text-align: justify;">
А вот в данном конкретном функциональном коде мы допишем к people .par:</div>
<div class="p2">
<br /></div>
<div class="p4">
<b id="internal-source-marker_0.13096528314054012" style="font-weight: normal;"></b></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<b id="internal-source-marker_0.13096528314054012" style="font-weight: normal;"><b id="internal-source-marker_0.13096528314054012" style="font-weight: normal; text-align: left;"></b></b></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<b id="internal-source-marker_0.13096528314054012" style="font-weight: normal;"><b id="internal-source-marker_0.13096528314054012" style="font-weight: normal; text-align: left;"><span style="font-family: Courier New, Courier, monospace;"><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">val</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> people</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">:</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #445588; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">Array</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">[</span><span style="background-color: #f8f8f8; color: #445588; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">Person</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">]</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">val</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">men</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">,</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> women</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">)</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">=</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> people.par partition </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">(_.</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">gender </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">==</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #dd1144; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">"male"</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">)</span></span></b></b></div>
<div>
<b id="internal-source-marker_0.13096528314054012" style="font-weight: normal;"><b id="internal-source-marker_0.13096528314054012" style="font-weight: normal; text-align: left;"><span style="font-family: Courier New, Courier, monospace;"><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"><br /></span></span></b></b></div>
<br />
<br />
<div class="p3" style="text-align: justify;">
Всё. Появится то, что в Скале называют “параллельным массивом” и вычисление пойдёт в несколько потоков, а редукциё соберёт для нас результаты в правильном порядке.</div>
<div class="p2" style="text-align: justify;">
<br /></div>
<div class="p3" style="text-align: justify;">
Здесь интересно то, что на параллельных коллекциях не только map, но и reduce параллельный. </div>
<div class="p5" style="text-align: justify;">
<b></b><br /></div>
<div class="p4">
<b id="internal-source-marker_0.13096528314054012" style="font-weight: normal;"></b></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<b id="internal-source-marker_0.13096528314054012" style="font-weight: normal;"><b id="internal-source-marker_0.13096528314054012" style="font-weight: normal; text-align: start;"></b></b></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<b id="internal-source-marker_0.13096528314054012" style="font-weight: normal;"><b id="internal-source-marker_0.13096528314054012" style="font-weight: normal; text-align: start;"><span style="font-family: Courier New, Courier, monospace;"><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">val</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> people</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">:</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #445588; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">Array</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">[</span><span style="background-color: #f8f8f8; color: #445588; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">Person</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">]</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">val</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> totalMoney </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">=</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> people.par map </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">(_.</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">money) reduce (_+_)</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"></span></span></b></b></div>
<div>
<b id="internal-source-marker_0.13096528314054012" style="font-weight: normal;"><b id="internal-source-marker_0.13096528314054012" style="font-weight: normal; text-align: start;"><span style="background-color: #f8f8f8; color: #333333; font-family: Consolas; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></b></b></div>
<br />
<br />
<div class="p3" style="text-align: justify;">
Для того, чтобы не было недетерминизма в map достаточно отсутствия побочных эффектов. Для того, чтобы не было недетерминизма в reduce, нужно ещё чтобы переданная туда функция обладала свойством ассоциативности. Скала никак это не проверяет, хотя в серьёзной, мощной и правильной системе типов и это возможно.</div>
<div class="p2" style="text-align: justify;">
<br /></div>
<div class="p3" style="text-align: justify;">
Здесь я хочу заметить, что дело не только и не столько в замечательных Скаловских параллельных коллекциях, сколько в том, что изначальный код написан без побочных эффектов и изменяемого состояния, плюс абстрация partition отделена там от условия, по которому partition выполняется, за счёт наличия в языке функций высокого порядка. Это делает возможным подобную лёгкость параллельных вычислений.</div>
<div class="p2" style="text-align: justify;">
<br /></div>
<div class="p3" style="text-align: justify;">
Для конкурентных вычислений в Scala есть Akka, и она так же замечательная, как OTP. </div>
<div class="p2">
<br /></div>
<div class="p4">
<b id="internal-source-marker_0.13096528314054012" style="font-weight: normal;"></b></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<b id="internal-source-marker_0.13096528314054012" style="font-weight: normal;"><span style="font-family: Courier New, Courier, monospace;"><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">actor </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">{</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> receive </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">{</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">case</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> people</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">:</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #445588; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">Set</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">[</span><span style="background-color: #f8f8f8; color: #445588; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">Person</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">]</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">=></span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">val</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">(</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">men</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">,</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> women</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">)</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">=</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> people partition </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">(_.</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">gender </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">==</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> 'male</span><span style="background-color: #e3d2d2; color: #a61717; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">'</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">)</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #445588; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">Cosmopolitan</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">!</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> women<br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #445588; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">Playboy</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">!</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> men<br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">}</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">}</span></span></b></div>
<div>
<b id="internal-source-marker_0.13096528314054012" style="font-weight: normal;"><span style="background-color: #f8f8f8; color: #333333; font-family: Consolas; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"><br /></span></b></div>
<br />
<div class="p3" style="text-align: justify;">
Я бы с удовольствием послушал хороший доклад про Акку на одной из следующих конференций.</div>
<div class="p2" style="text-align: justify;">
<br /></div>
<div class="p3" style="text-align: justify;">
Есть ещё много радостей в “настоящем” функциональном программировании: функторы, монады, выведение типов, классы типов... Но главное - это переход от “как” к “что”, переход из времени в пространство, отказ от изменяемого состояния, пока получается и абстракция алгоритмов с помощью комбинаторов (map, reduce, filter и другие) и функций высшего порядка.</div>
<div class="p2" style="text-align: justify;">
<br /></div>
<div class="p2" style="text-align: justify;">
Пример на практике. Функционального программирования здесь не очень много, но сам подход оттуда.</div>
<div class="p2" style="text-align: justify;">
<br /></div>
<div class="p3" style="text-align: justify;">
Есть такой смешной антипаттерн в Ruby on Rails - паутина before_filter’ов. Когда сверху контроллера у вас пять, а то и больше строчек before_filter, у некоторых из которых есть ещё only и except, и вы уже разок фиксили баг, меняя порядок этих строчек. У меня такое было и это жутко.</div>
<div class="p2" style="text-align: justify;">
<br /></div>
<div class="p6">
<b id="internal-source-marker_0.13096528314054012" style="font-weight: normal;"><span style="font-family: Courier New, Courier, monospace;"></span></b></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<b id="internal-source-marker_0.13096528314054012" style="font-weight: normal;"><span style="font-family: Courier New, Courier, monospace;"><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">class</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #445588; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">OrderController</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"><</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: teal; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">ApplicationController</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> before_filter </span><span style="background-color: #f8f8f8; color: #990073; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">:authenticate_user!</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> before_filter </span><span style="background-color: #f8f8f8; color: #990073; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">:load_order</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">, </span><span style="background-color: #f8f8f8; color: #990073; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">only</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">: </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">[</span><span style="background-color: #f8f8f8; color: #990073; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">:edit</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">, </span><span style="background-color: #f8f8f8; color: #990073; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">:update</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">, </span><span style="background-color: #f8f8f8; color: #990073; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">:destroy</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">]</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> before_filter </span><span style="background-color: #f8f8f8; color: #990073; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">:create_order_from_params</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">, </span><span style="background-color: #f8f8f8; color: #990073; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">only</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">: </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">[</span><span style="background-color: #f8f8f8; color: #990073; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">:new</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">, </span><span style="background-color: #f8f8f8; color: #990073; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">:create</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">]</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> before_filter </span><span style="background-color: #f8f8f8; color: #990073; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">:authorize_user_on_order!</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">, </span><span style="background-color: #f8f8f8; color: #990073; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">only</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">: </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">[</span><span style="background-color: #f8f8f8; color: #990073; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">:edit</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">, </span><span style="background-color: #f8f8f8; color: #990073; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">:update</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">, </span><span style="background-color: #f8f8f8; color: #990073; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">:destroy</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">]</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> before_filter </span><span style="background-color: #f8f8f8; color: #990073; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">:update_order_from_params</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">, </span><span style="background-color: #f8f8f8; color: #990073; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">only</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">: </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">[</span><span style="background-color: #f8f8f8; color: #990073; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">:update</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">]</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> before_filter </span><span style="background-color: #f8f8f8; color: #990073; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">:render_if_save_error</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">, </span><span style="background-color: #f8f8f8; color: #990073; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">only</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">: </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">[</span><span style="background-color: #f8f8f8; color: #990073; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">:create</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">, </span><span style="background-color: #f8f8f8; color: #990073; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">:update</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">]</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">def</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #990000; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">new;</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">end</span></span></b></div>
<b id="internal-source-marker_0.13096528314054012" style="font-weight: normal;"><span style="font-family: Courier New, Courier, monospace;"><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">def</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #990000; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">edit;</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">end</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">def</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #990000; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">create</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> redirect_to success_url<br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">end</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">def</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #990000; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">update</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> redirect_to </span><span style="background-color: #f8f8f8; color: teal; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">@order</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">end</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">def</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #990000; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">destroy</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: teal; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">@order</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">destroy<br class="kix-line-break" /> redirect_to success_url<br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">end</span></span></b><br />
<div class="p6">
<b><span style="font-family: Courier New, Courier, monospace;"><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></span></b></div>
<div class="p6">
<b><span style="font-family: Courier New, Courier, monospace;"><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> private<br class="kix-line-break" /><span style="font-weight: normal;"><br class="kix-line-break" /> </span></span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">def</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #990000; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">load_order</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: teal; font-size: 13px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;">@order</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">=</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: teal; font-size: 13px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;">Order</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;">find params</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">[</span><span style="background-color: #f8f8f8; color: #990073; font-size: 13px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;">:id</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">]</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">end</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">def</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #990000; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">create_order_from_params</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: teal; font-size: 13px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;">@order</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">=</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: teal; font-size: 13px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;">Order</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;">new params</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">[</span><span style="background-color: #f8f8f8; color: #990073; font-size: 13px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;">:order</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">]</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">end</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">def</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #990000; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">authorize_user_on_order!</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> permission_denied! </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">unless</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;"> current_user</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;">can_edit? </span><span style="background-color: #f8f8f8; color: teal; font-size: 13px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;">@order</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">end</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">def</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #990000; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">update_order_from_params</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: teal; font-size: 13px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;">@order</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;">update_attributes<br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">end</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">def</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #990000; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">render_if_save_error</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">unless</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: teal; font-size: 13px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;">@order</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;">valid?<br class="kix-line-break" /> render </span><span style="background-color: #f8f8f8; color: #dd1144; font-size: 13px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;">'error'</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">and</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">return</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">false</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">end</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">end</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: normal; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">end</span></span></b></div>
<div class="p2">
<br /></div>
<div class="p3" style="text-align: justify;">
Суть тут в том, что все эти фильтры работают с переменными экземпляра контроллера, тем самым, корень наших проблем как обычно в изменяемом состоянии и мышлении во времени. Несмотря на то, что всё очень даже однопоточно, стоит последовательность инструкций разнести по разным местам и спрятать за колбеками, как мы уже теряемся.</div>
<div class="p2" style="text-align: justify;">
<br /></div>
<div class="p3" style="text-align: justify;">
Я заменил большую часть этих фильтров просто методами. При входе в action их клубок разматывается совершенно самостоятельно, и я совершенно не забочусь о порядке вычислений. </div>
<div class="p2" style="text-align: justify;">
<br /></div>
<div class="p4">
<b id="internal-source-marker_0.13096528314054012" style="font-weight: normal;"></b></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<b id="internal-source-marker_0.13096528314054012" style="font-weight: normal;"><span style="font-family: Courier New, Courier, monospace;"><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">class</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #445588; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">OrderController</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"><</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: teal; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">ApplicationController</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> before_filter </span><span style="background-color: #f8f8f8; color: #990073; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">:authenticate_user!</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">def</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #990000; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">new</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: teal; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">@order</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">=</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> order<br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">end</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">def</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #990000; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">create</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: teal; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">@order</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">=</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> refreshed_order<br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: teal; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">@order</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">save<br class="kix-line-break" /> respond_with(</span><span style="background-color: #f8f8f8; color: teal; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">@order</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">)<br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">end</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">def</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #990000; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">edit</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: teal; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">@order</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">=</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> order<br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">end</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">def</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #990000; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">update</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: teal; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">@order</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">=</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> refreshed_order<br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: teal; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">@order</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">save<br class="kix-line-break" /> respond_with(</span><span style="background-color: #f8f8f8; color: teal; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">@order</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">)<br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">end</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">def</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #990000; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">destroy</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: teal; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">@order</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">=</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> order<br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: teal; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">@order</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">destroy<br class="kix-line-break" /> respond_with(</span><span style="background-color: #f8f8f8; color: teal; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">@order</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">)<br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">end</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">private</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">def</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #990000; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">order</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> params</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">[</span><span style="background-color: #f8f8f8; color: #990073; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">:id</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">]</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> ? ensure_access! </span><span style="background-color: #f8f8f8; color: teal; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">Order</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">find(params</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">[</span><span style="background-color: #f8f8f8; color: #990073; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">:id</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">]</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">) : </span><span style="background-color: #f8f8f8; color: teal; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">Order</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">new<br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">end</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">def</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #990000; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">resfreshed_order</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> order</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">tap { </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">|</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">o</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">|</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> o</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">attributes </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">=</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> params</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">[</span><span style="background-color: #f8f8f8; color: #990073; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">:order</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">]</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> }<br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">end</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">def</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #990000; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">ensure_access!</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">(order)<br class="kix-line-break" /> current_user</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">can_edit?(order) ? order : permission_denied! <br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">end</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">end</span></span></b></div>
<div>
<b id="internal-source-marker_0.13096528314054012" style="font-weight: normal;"><span style="background-color: #f8f8f8; color: #333333; font-family: Consolas; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"><br /></span></b></div>
<br />
<div class="p2">
<br /></div>
<div class="p3" style="text-align: justify;">
Мне это настолько понравилось, что захотелось вообще не выставлять переменную экземпляра в контроллере, а отдать во вью, да и самому работать, сразу с методом. Стало, на мой взгляд, ещё лучше, хотя здесь меня уже можно упрекнуть в грехе неидиоматичности.</div>
<div class="p2" style="text-align: justify;">
<br /></div>
<div class="p4">
<b id="internal-source-marker_0.13096528314054012" style="font-weight: normal;"></b></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<b id="internal-source-marker_0.13096528314054012" style="font-weight: normal;"><span style="font-family: Courier New, Courier, monospace;"><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">class</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #445588; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">OrderController</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"><</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: teal; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">ApplicationController</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> before_filter </span><span style="background-color: #f8f8f8; color: #990073; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">:authenticate_user!</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> helper_method </span><span style="background-color: #f8f8f8; color: #990073; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">:order</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">def</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #990000; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">new</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">; </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">end</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">def</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #990000; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">edit</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">; </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">end</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">def</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #990000; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">create</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> order</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">save<br class="kix-line-break" /> respond_with(order)<br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">end</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">def</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #990000; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">update</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> order</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">save<br class="kix-line-break" /> respond_with(order)<br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">end</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">def</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #990000; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">destroy</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> order</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">destroy<br class="kix-line-break" /> respond_with(order)<br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">end</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">private</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">def</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #990000; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">order</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: teal; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">@_order</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">||=</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> refresh(params</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">[</span><span style="background-color: #f8f8f8; color: #990073; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">:id</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">]</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> ? ensure_access! </span><span style="background-color: #f8f8f8; color: teal; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">Order</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">find(params</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">[</span><span style="background-color: #f8f8f8; color: #990073; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">:id</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">]</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">) : </span><span style="background-color: #f8f8f8; color: teal; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">Order</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">new)<br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">end</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">def</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #990000; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">resfresh</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">(order)<br class="kix-line-break" /> order</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">tap { </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">|</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">o</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">|</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> o</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">attributes </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">=</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> params</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">[</span><span style="background-color: #f8f8f8; color: #990073; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">:order</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">]</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">if</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> params</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">[</span><span style="background-color: #f8f8f8; color: #990073; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">:order</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">]</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> }<br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">end</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">def</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #990000; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">ensure_access!</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">(order)<br class="kix-line-break" /> current_user</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">can_edit?(order) ? order : permission_denied! <br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">end</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">end</span></span></b></div>
<div>
<b id="internal-source-marker_0.13096528314054012" style="font-weight: normal;"><span style="background-color: #f8f8f8; color: #333333; font-family: Consolas; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"><br /></span></b></div>
<br />
<div class="p2">
<br /></div>
<div class="p3" style="text-align: justify;">
Тут ещё можно было бы добавить инкапсуляцию мемоизации с помощью некоего <a href="https://github.com/voxdolo/decent_exposure">decent_exposure</a>, который, впрочем, насколько прост, что его можно реализовать самостоятельно. Всё, что делает expose - это мемоизирует и пишет за вас helper_method.</div>
<div class="p2" style="text-align: justify;">
<br /></div>
<div class="p4">
<b id="internal-source-marker_0.13096528314054012" style="font-weight: normal;"><span style="font-family: Courier New, Courier, monospace;"><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">class</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #445588; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">OrderController</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"><</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: teal; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">ApplicationController</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> before_filter </span><span style="background-color: #f8f8f8; color: #990073; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">:authenticate_user!</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">def</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #990000; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">new</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">; </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">end</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">def</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #990000; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">edit</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">; </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">end</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">def</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #990000; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">create</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> order</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">save<br class="kix-line-break" /> respond_with(order)<br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">end</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">def</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #990000; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">update</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> order</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">save<br class="kix-line-break" /> respond_with(order)<br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">end</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">def</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #990000; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">destroy</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /> order</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">destroy<br class="kix-line-break" /> respond_with(order)<br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">end</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /><br class="kix-line-break" /> expose(</span><span style="background-color: #f8f8f8; color: #990073; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">:order</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">) {<br class="kix-line-break" /> refresh(params</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">[</span><span style="background-color: #f8f8f8; color: #990073; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">:id</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">]</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> ? ensure_access! </span><span style="background-color: #f8f8f8; color: teal; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">Order</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">find(params</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">[</span><span style="background-color: #f8f8f8; color: #990073; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">:id</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">]</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">) : </span><span style="background-color: #f8f8f8; color: teal; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">Order</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">new)<br class="kix-line-break" /> }<br class="kix-line-break" /><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">private</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">def</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #990000; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">resfresh</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">(order)<br class="kix-line-break" /> order</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">tap { </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">|</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">o</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">|</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> o</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">attributes </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">=</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> params</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">[</span><span style="background-color: #f8f8f8; color: #990073; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">:order</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">]</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">if</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> params</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">[</span><span style="background-color: #f8f8f8; color: #990073; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">:order</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">]</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> }<br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">end</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /><br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">def</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"> </span><span style="background-color: #f8f8f8; color: #990000; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">ensure_access!</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">(order)<br class="kix-line-break" /> current_user</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">.</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;">can_edit?(order) ? order : permission_denied! <br class="kix-line-break" /> </span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">end</span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; vertical-align: baseline; white-space: pre-wrap;"><br class="kix-line-break" /></span><span style="background-color: #f8f8f8; color: #333333; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;">end</span></span></b></div>
<div class="p4">
<b style="font-weight: normal;"><span style="background-color: #f8f8f8; color: #333333; font-family: Consolas; font-size: 13px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"><br /></span></b></div>
<div class="p2">
Выводы: </div>
<ol class="ol1">
<li class="li3">От параллельного и конкурентного программирования никому никуда не деться, или его приложения будут сильно проигрывать в скорости исполнения, что вполне может для этих приложений быть фатальным.</li>
<li class="li3">Параллельные и конкурентные вычисления на потоках и блокировках уже убивали людей.</li>
<li class="li3">Функциональное программирование прекрасно само по себе и замечательно решает существенную часть параллельных вычислений.</li>
<li class="li3">Изменяемое состояние - зло, чистые функции - добро. Я готов провозгласить новый смелл “переприсвоение локальной переменной”.</li>
<li class="li3">Пишите чисто.</li>
</ol>
<div>
<span style="font-size: x-small;">Ссылки:</span></div>
<div>
<span style="font-size: x-small;">1. Вдохновением, парой картинок и общей напраленностью я обязан <a href="http://www.youtube.com/watch?v=3jg1AheF4n0">выступлению Мартина Одерского "Working hard to keep it simple" на конференции</a></span><span style="font-family: Times, Times New Roman, serif; font-size: x-small;"><a href="http://www.youtube.com/watch?v=3jg1AheF4n0"> O'Reilly OSCON Java 2011</a></span><span style="font-size: x-small;">.</span></div>
<div>
<span style="font-size: x-small;">2. Своим интересом к функциональному программированию я обязан <a href="http://mitpress.mit.edu/sicp/full-text/book/book.html">книге Абельсона и Сассмана "Структура и интерпретация компьютерных программ"</a>.</span></div>
<div>
<span style="font-size: x-small;">3. Своим интересом к языку программирования Scala я обязан <a href="https://www.coursera.org/course/progfun">курсу "Принципы функционального программирования в Scala" на coursera</a>.</span></div>
<div>
<span style="font-size: x-small;">4. Идеей заменить в контроллерах поток вычислений цепочкой вычислений я обязан <a href="https://github.com/voxdolo/decent_exposure">гему decent_exposure</a>.</span></div>
<div>
<span style="font-size: x-small;">5. Другой хороший пример подаёт <a href="https://github.com/jonleighton/focused_controller">гем focused_controller</a>.</span></div>
<div>
<span style="font-size: x-small;">6. <a href="http://www.slideshare.net/dimkiriyenko/2013-2803dakwhyfp">Слайды с выступления</a>.</span></div>
<div>
<span style="font-size: x-small;">7. <a href="https://github.com/dmitriy-kiriyenko/why-fp-conference">Исходный код из выступления</a>.</span></div>
</div>
Anonymoushttp://www.blogger.com/profile/17152157727140681943noreply@blogger.com0tag:blogger.com,1999:blog-6138770299473511818.post-48613553259510939642013-02-10T19:07:00.002+02:002013-02-10T20:55:21.422+02:00Немного о толерантности<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<i>С просторов сети. В тексте изменено два слова, чтобы расширить круг людей, которые могут прочитать его и не оскорбиться.</i><br />
<br />
...Однажды к Мастеру Вану пришли трое его детей, и каждый желал странного.<br />
<br />
- Отец, - жеманясь и краснея, сказал старший сын. - Мне кажется, я люблю мужчин больше, чем женщин. А среди мужчин я больше всех люблю Сунь Ахуя из соседней деревни. Он такой... такой!.. он как Бьякуи из "Блича"!.. Я понимаю, ты хотел видеть во мне опору в будущем, продолжателя рода и наследника своего мастерства, но... извини, я хочу иначе. Ничего, если я приведу в дом Сунь Ахуя, и мы будем спать в одной кровати и сидеть у огня, держась за руки?..<br />
<br />
- Папа, - потупясь, сказал средний сын. - Мне кажется, я пацифист и не могу даже смотреть на оружие, мясную пищу и чужие страдания. Я понимаю, ты хотел бы видеть во мне сильного воина, победителя и защитника, который прославится на всю Поднебесную, но... извини, я хочу иначе. Ничего, если ты отмажешь меня от армии, и мы возьмем в дом нашего поросенка, которого мы откармливаем на Праздник Фонарей? Я назову его Пикачу, буду купать в теплой воде, повяжу на шею синий бантик, и мы с Пикачу будем кушать только растительную пищу!..<br />
<br />
- Папа! - сказала любимая дочь Мастера Вана, Ма Сянь, водя изящной ножкой по глиняному полу. - Ты знаешь, я ведь молодая, красивая и умная девушка. Поэтому я хочу самореализоваться и пожить для себя. Я понимаю, ты хотел бы видеть во мне любящую жену, умелую хозяйку и заботливую мать своих многочисленных внуков, но... извини, внуков у тебя не будет. Ничего, если я уеду в город, стану там офисным работником, сделаю карьеру и стану чайлдфри? А по выходным я буду приезжать к тебе в дом престарелых на своем "Матисе" и куплю тебе замечательное кресло-качалку...<br />
<br />
Мастер Ван уже открыл было рот, чтобы громко высказать детям все, что он о них думает, но так и не издал ни звука. "А нужно ли? - подумал он вдруг. - Да какое же я имею право решать за своих детей, как им жить, с кем спать, что есть, во что верить? Они же самостоятельные личности! Ну и что, что старшему всего семнадцать? Подумаешь, мне не нравится! Ничего, потерплю, зато дети мои будут счастливы! В конце концов, чем цивилизованнее человек, тем он толерантнее, так неужели я буду вести себя как дикарь?!"<br />
<br />
- Хорошо, - устало сказал он, - живите как хотите.<br />
<br />
...Прошло десять лет. Дети жили как хотели, а Мастер Ван просто устал от всего этого.<br />
<br />
Он пришел к соседу поделиться своим несчастьем и увидел, что Мастер Чжан сидит в беседке перед садом камней, пьет сливовое вино и курит свою любимую кривую трубочку.<br />
<br />
- Как поживаешь, сосед? - спросил Мастер Ван. - Все ли в порядке? Что детишки?<br />
<br />
Мастер Чжан неторопливо отпил из чашки и ответил:<br />
<br />
- Старший сын женился на дочери уездного судьи. Они живут душа в душу, сын хорошо зарабатывает, у них в городе большой дом. Средний сын служит в императорской коннице на южных рубежах Поднебесной. Он начальник "длинной сотни" конников. Враги боятся его, как огня, друзья любят, подчиненные уважают, а начальники ценят. А дочь - что ж, вон моя красавица-дочь, ее любимый муж и пять моих внуков...<br />
<br />
- Невероятно! - вскричал Мастер Ван. - Но разве десять лет назад твои дети, будучи молодыми, горячими и глупыми, не приходили к тебе, желая странного?!<br />
<br />
Мастер Чжан степенно кивнул.<br />
<br />
- Как же тебе удалось воспитать таких славных детей?!<br />
<br />
- Я просто сказал им, что если не перестанут валять дурака, я высеку их розгами.<br />
<br />
<i>Собственно, моя позиция полностью соответствует позиции мастера Чжана.</i></div>
Anonymoushttp://www.blogger.com/profile/17152157727140681943noreply@blogger.com5tag:blogger.com,1999:blog-6138770299473511818.post-76105592843145243902013-01-29T10:14:00.001+02:002013-01-29T15:50:26.334+02:00Лямбды, блоки, замыкания<div dir="ltr" style="text-align: left;" trbidi="on">
<b id="internal-source-marker_0.09381896303966641" style="font-weight: normal;"></b><br />
<div style="text-align: right;">
<span style="font-family: Arial; font-size: x-small;"><span style="font-weight: normal; white-space: pre-wrap;"><i>Этот текст не совсем статья в блог. Это слайды к презентации, перемешанные с текстом, который я говорил на выступлении, одной картинкой "от Кутейко" и парой пояснений. Это максимум времени, который я готов в это проинвестировать, поэтому, простите за некопирующийся исходный код. Весь код, который есть на картинках, есть в специальном <a href="https://github.com/dmitriy-kiriyenko/ruby-blocks-lambdas-closures-presentation-code">github репозитории</a>.</i></span></span></div>
<h1 dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<b style="font-weight: normal;"><span style="font-family: Arial; font-size: 24px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></b></h1>
<h1 dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<b id="internal-source-marker_0.09381896303966641" style="font-weight: normal;"><span style="font-family: Arial; font-size: 24px; vertical-align: baseline; white-space: pre-wrap;">Лямбды, блоки, замыкания.</span></b></h1>
<div>
<b style="font-weight: normal;"><span style="font-family: Arial; font-size: 24px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></b></div>
<div>
<b style="font-weight: normal;"><span style="font-family: Arial; font-size: 24px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></b></div>
<b id="internal-source-marker_0.09381896303966641" style="font-weight: normal;"><span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><img height="266" src="https://lh6.googleusercontent.com/DBQjjKs7SSVI83WAj0Gox-8KKkl_9ue1S0BCuw1gb9Qpz9e0357CIYv3WBiDzp-BoaSUZVjatf0YyQF3RS47OO7XnQq2IQOmqvcpJgBDX8cXXwfkVbyXePMZag" width="400" /><span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span></b><br />
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<b id="internal-source-marker_0.09381896303966641" style="font-weight: normal;"><span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></b></div>
<b id="internal-source-marker_0.09381896303966641" style="font-weight: normal;">
</b>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<br /></div>
<b id="internal-source-marker_0.09381896303966641" style="font-weight: normal;">
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">То, что было для меня лично наибольшим открытием в Руби - это блоки. Я до этого мало писал в Джаваскрипте и много - на Джаве, и удобство конструкций вида select, reject, inject, map, то, как они меняют способ думать о коде и решаемой задаче буквально покорило меня. Функции высшего порядка теперь неотъемлемая часть нашего арсенала и без них настолько неуютно, что язык, который их не поддерживает в буквальном смысле неполноценен.</span></div>
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Однако же, идея блоков кода или функций высокого порядка далеко не нова. Концепт блоков и замыканий появился через несколько лет после того, как Джон Маккарти написал первую версию языка Лисп. Позднее, он был взят на вооружение Сассманом и Стилем, когда они создавали диалект Лиспа, который называется “Схема”.</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<br /></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<br /></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<img height="233" src="https://lh4.googleusercontent.com/PudLJdSfZRuwTNWkn1WXoaI2dctp8Us8tITZf7VR4W-2a5aPF_8Zg5yCHWdS00a0vTkalrRkaKr6RipuAsOw_QkKf2O62ARQUDP-RYW7rhAEHwCb0w66QEGcvw" width="400" /><span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span></div>
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Внутри Руби представляет блоки как структуры С типа rb_block_t. Что же такое блоки? Давайте заглянем в описание этой структуры - это может пролить свет. </span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<br /></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<img height="282" src="https://lh4.googleusercontent.com/LmzniwmvlC0pSICdrzo3U-6q2NBlFvqNmpcP6mfN9ZPWbjyQ9pM7ARGkl2rhYE3dnyefXDj3ECfdn9UedzGs-Y4HKC5gi3EJHQv86qrinuR1pQlXQrnr1ahUWQ" width="400" /><span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span></div>
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Во-первых, очевидно там должен лежать кусок Руби кода или набор скопмилированных инструкций байт-кода YARV.</span></div>
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">В примере, когда мы отдаём блок в метод times объекта 10, метод должен знать, какой код исполнять.</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<br /></div>
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><img height="212" src="https://lh6.googleusercontent.com/rJmUCo2zgy1A1OJ45qA8vPuYp8bE5vn44W8skT71OTSuizH1cLy8l6HCf_Mglb6Ulniduw0YxJJBVL6Tke-bO9zv8MV5s-bPRQART8MyJc7fQam58H2iLRxzSA" width="400" /><span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Однако же, интересной особенностью блоков в Руби является то, что код в них имеет доступ к лексическому окружению блока.</span></div>
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Вот, посмотрите - метод puts обращается не только к локальной переменной из своей области видимости (str), но и к локальной переменной за пределами своей области видимости (str_ext). Мы тут все принимаем это как должное. Это вообще одна из главных фич блоков, которые и делают их полезными.</span></div>
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">То есть, с одной стороны, блоки - это функции. Им можно передать аргументы и получить возвращаемое значение. С другой же стороны, они - часть окружающего их метода. Когда я пишу такой скрипт, я не думаю о блоке, как о отдельной функции - я воспринимаю его как часть скрипта верхнего уровня - напечатать строку 10 раз.</span></div>
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Так как же это работает?</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<br /></div>
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><img height="323" src="https://lh4.googleusercontent.com/6QRbMsYBJJaza_pYYJnr3w_5NpUKgrrq_RgI_B6vckKP99GFeNao6h-A6sqBMS-5C6crz68PltMAEVjwRk5AfmR7j-cMoZuVMtvkGMDs5Fa1JZ3a7vfDlKtLRQ" width="400" /><span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">В самой первой статье из цикла Lambda Papers, статье, с которой в мир программирования вошла Схема, Сассман и Стиль вводят понятие замыкания, как структуры, содержащей лямбда-выражение, и окружение, которое будет использовано, когда это выражение будет применено к аргументам.</span></div>
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Эта самая идея и взята на вооружение в Руби.</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<br /></div>
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><img height="337" src="https://lh4.googleusercontent.com/mDXLX_qJXIFRbV8rFwJ8anpFm8bVLU5WIEKjKtQgKHUQZPDiRhA_yS_xH_3jRaSFzApCZXipdTu-OM4Dj8jvuRoGFKDqBZ9e8v6qp01sqEK_jUMcS3HLBZ8Ilg" width="400" /><span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<br /></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">В нашем примере, при выполнении первой строки кода YARV сохранит локальную переменную str_ext в свой внутренний стек и сохранит её расположение в указателе EP (environment pointer), расположенном в структуре rb_control_frame_t.</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<b id="internal-source-marker_0.09381896303966641" style="font-weight: normal; text-align: left;"><img height="321" src="https://lh3.googleusercontent.com/ced-Z1eHk1uijlOYwVksRYSfqlxvJNMTGEANYCIpYTt_7lRdTOcVLNEksUeZ0eCJQWWoVQqnR8I7WfJRrh0N2HLu25IhKIEV3bn4gXaJm69tYfiQAak7DFlK-Q" width="400" /></b></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<b id="internal-source-marker_0.09381896303966641" style="font-weight: normal; text-align: left;"></b><br />
<div dir="ltr" style="display: inline !important; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<div style="display: inline !important;">
<b id="internal-source-marker_0.09381896303966641" style="font-weight: normal; text-align: left;"><span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Дальше идёт вызов “10.times do”. Поскольку порядок вычислений в Руби аппликативный, сначала вычислятся аргументы метода times, в нашем случае - блок. Руби создаст и проинициализирует новую структуру rb_block_t. В структуре кроме уже обсуждённого iseq есть свой указатель на окружение (EP), который показывает на текущий кадр стека. То есть, в блоке сохранён указатель на кадр стека, в котором создан блок.</span></b></div>
</div>
</div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<br /></div>
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><img height="320" src="https://lh4.googleusercontent.com/BnpDTSVnrjz9QkkZgJaUqmAT1Pc_ZfDiobhWcGrTge3sQ47V9BDBQUMo1pYbMYuFwhGnA9fKbstn1yUR1rc2wgaeRe_SAD138LKVcVpVa_Ejn4JX413BJju7Fw" width="400" /><span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><b id="internal-source-marker_0.09381896303966641" style="font-weight: normal;"><div dir="ltr" style="display: inline !important; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<div style="display: inline !important;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Потом происходит вызов метода times на объекте 10. Создаётся новый кадр в стеке YARV. Метод Fixnum#times написан на С, но ход выполнения такой же, какой был бы, если бы метод был написан на Руби - перебираются числа от нуля до девяти и с каждым из этих чисел в качестве аргумента вызывается yield блока. Код, который выполняет yield блока, для того, чтобы выполнить инструкции, скомпилированные в iseq создаёт третий кадр в стеке YARV (там есть ещё один кадр в стеке непосредственно перед вызовом блока, но это не поможет нам сейчас рассуждать о замыканиях). </span></div>
</div>
</b><br />
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<br /></div>
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><img height="327" src="https://lh5.googleusercontent.com/Uvlkd20Ybfz5p6up0LgNDzCEQldWshsZqXzOCkWMZPJU0icAdmJfNBpijMvAj_Aj9SrB0n9bldWphSBPsCPXr2OGjPlU_4igZ1LNpwWYmjFRmsWksgiO2CFulg" width="400" /><span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<br /></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<b id="internal-source-marker_0.09381896303966641" style="font-weight: normal; text-align: left;"></b><br />
<div dir="ltr" style="display: inline !important; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<div style="display: inline !important;">
<b id="internal-source-marker_0.09381896303966641" style="font-weight: normal; text-align: left;"><span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Итак мы видим три кадра стека:</span></b></div>
</div>
</div>
<br /><ol style="margin-bottom: 0pt; margin-top: 0pt;">
<li dir="ltr" style="font-family: Arial; font-size: 15px; list-style-type: decimal; vertical-align: baseline;"><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="vertical-align: baseline; white-space: pre-wrap;">Кадр блока, содержит переменную str.</span></div>
</li>
<li dir="ltr" style="font-family: Arial; font-size: 15px; list-style-type: decimal; vertical-align: baseline;"><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="vertical-align: baseline; white-space: pre-wrap;">Кадр Fixnum#times.</span></div>
</li>
<li dir="ltr" style="font-family: Arial; font-size: 15px; list-style-type: decimal; vertical-align: baseline;"><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="vertical-align: baseline; white-space: pre-wrap;">Кадр верхнего уровня содержит переменную str_ext.</span></div>
</li>
</ol>
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">В процессе создания кадра стека для блока Руби копирует EP из блока в новый кадр стека. Теперь код внутри стека имеет доступ и к своим локальным переменным через rb_control_frame, и к переменным родительского кадра стека через EP с помощью динамического доступа к переменным. В нашем случае это помогает коду в блоке достать переменную str_ext.</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<br /></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<b id="internal-source-marker_0.09381896303966641" style="font-weight: normal; text-align: left;"><img height="400" src="https://lh3.googleusercontent.com/1Cd8nLGLxjHvjs2m6MMfggs1__K35R2MDq7NLErnAdhseRkBaBUG3VtydF3mbhyN5EGyTlFBaNwqvnEzpP_qvgZB2s4bUKX97A442ZD5-LrEUAvofus0EZcFvQ" width="383" /></b></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<a href="https://github.com/ruby/ruby/blob/trunk/insns.def#L43L67"><span style="color: #1155cc; font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><i>https://github.com/ruby/ruby/blob/trunk/insns.def#L43L67</i></span><span style="color: black; font-family: Arial; font-size: 15px; text-decoration: initial; vertical-align: baseline; white-space: pre-wrap;"></span></a></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<br /></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<b id="internal-source-marker_0.09381896303966641" style="font-weight: normal; text-align: left;"></b></div>
<div dir="ltr" style="display: inline !important; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<b id="internal-source-marker_0.09381896303966641" style="font-weight: normal; text-align: left;"><b id="internal-source-marker_0.09381896303966641" style="font-weight: normal; text-align: left;"></b></b></div>
<div dir="ltr" style="display: inline !important; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<b id="internal-source-marker_0.09381896303966641" style="font-weight: normal; text-align: left;"><b id="internal-source-marker_0.09381896303966641" style="font-weight: normal; text-align: left;"><span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Вот код, который обеспечивает динамический доступ к пе</span><span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">ременным. Макрос GET_EP возвращает EP текущей области видимости. Потом Руби перебирает все EP, передвигаясь от текущей области видимости к родительской и так далее. Для этого используется макрос GET_PREV_EP, который переходит к родительской области видимости. И вот EP кадра стека, в котором непосредственно исполняется код блока, указывает в качестве родительского на кадр, в котором объявлена переменная str_ext.</span></b></b></div>
<br /><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Помните? Замыкание - это структура, состоящая из лямбда-выражения, т.е., функции и окружения, которое будет использовано в момент вызова лямбды или функции.</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<b id="internal-source-marker_0.09381896303966641" style="font-weight: normal; text-align: left;"><img height="343" src="https://lh4.googleusercontent.com/EeX40v8_DnmA6LgX8bxrAMas3YKIPfB4b9YQjTUp4skKiAXwqf0HAyVgS3md7s0yq12m2mSny4xEknas6haMQiI1p1AYOL9JYHjN-yddRs6MHSNBqcujfPJToA" width="400" /></b></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Рубишный блок соответствует этому определению - вот функция (iseq), а вот указатель на окружение. Там ещё есть self, это очень важная часть замыкания, как мы увидим позже, и proc, используемый внутри для преобразования блока в proc, когда нужно. </span></div>
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Сравните определение с rb_control_frame_t. С self до proc они совпадают. Помните, когда блок только создаётся, в него копируется часть переменных, описывающих текущее окружение, в частности EP. Так вот, на самом деле Руби ничего не копирует. а вместо этого выставляет указатель прямо в середину структуры rb_control_frame_t. Подобная утиная типизация выглядит немного странно, но без неё создание блоков тормозило бы гораздо ощутимее - мы избегаем лишних операций malloc.</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<br /></div>
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><img height="284" src="https://lh4.googleusercontent.com/QT1hBG1PipByIEVUU7H6lrUIRipMJimEYiTnWPbxl2EuN-V1DQJEQEw9CAd-44i-nUg5K4gox7Q1foG1vYsAeCBXf5HM1SAioQRd9kQO84q894H8wT2c3-jGZQ" width="400" /><span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">И без того все эти игрища с блоками ощутимо медленнее прямого влобного программирования. Только не вздумайте на основании этого писать без блоков! Мы с вами как Rails программисты чаще грешим лишними запросами в базу, бездумным пользованием ORM и прочими ужасными вещами на макроуровне. Никакие микрооптимизации не сделают пузырьковую сортировку быстрой.</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<br /></div>
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><img height="335" src="https://lh6.googleusercontent.com/5NpE429PMUdbNhth4_P9y3Mp7HlUWP7qjzmAOdsdW7gKCvYk1Rac4nqLgdeaz8gEeGJboxtsEv6nMYG15LgvwfYzT16rYlIyAbDZozgnE1HahiWIp4yClSmSqQ" width="400" /><span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<br /></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Давайте взглянем на другой кусок кода. Здесь с первого взгляда тоже блок, но не совсем. В функции get_helloer я с помощью ключевого слова lambda создаю и возвращаю некий блок кода - то, что обычно называют функцией высшего порядка или функции как граждане первого класса, сохраняю его в переменную и затем вызываю. С помощью ключевого слова lambda и, как обычно в Руби, ещё пары способов, блок можно превратить в такую сущность, которую можно возвращать как результат и передавать как аргумент. Лирическое отступление - почему лямбда?</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<br /></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><img height="355" src="https://lh4.googleusercontent.com/W0KyObIIgpvqHfOoW0p1bwkXPoeEVXVDlY7HGSLonafTrdiThbeFhJeJ1RxKfWY-gYwMWKPOwNgWQsABg3UPeyANYUvtokbZseAxFvqMY37nwU7W0yLgw-Meow" width="400" /><span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="font-family: Arial; font-size: 15px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">В 1930-х годах Алонзо Чёрч ввёл лямбда-нотацию в своём исследовании "Лямбда-исчисление"</span><br /><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<br />
<div dir="ltr" style="display: inline !important; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<div style="display: inline !important;">
<b id="internal-source-marker_0.09381896303966641" style="font-weight: normal; text-align: left;"><span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Лисперы привыкли к слову лябмда для создания анонимных функций, однако, не в Лиспе это придумано. Этот термин пришёл из труда Алонзо Чёрча “Лямбда-исчисление”, написанного в 1930-х. На этот труд ссылаются как Маккарти в своём историческом “Рекурсивные функции над символьными выражениями и их машинное вычисление” 1960-го, с которого берёт начало Лисп, и Сассман и Стиль в своей исторической статье “Схема: интерпретатор для продвинутого лямбда-исчисления” 1975-го, с которого берёт начало Схема.</span></b></div>
</div>
</div>
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Вернёмся к примеру. Однако, что же здесь происходит? Работают ли лямбды так же, как и блоки? То, что мы уже знаем о блоках, заставляет нас предположить, что лямбды должны работать как-то по-другому. Блок замыкается на свой кадр стека, мы же возвращаем нашу лямбду из функции, поэтому наш кадр стека будет потерян и забыт. Как же нам замкнуться?</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><img height="230" src="https://lh5.googleusercontent.com/jC0lRsmIZoRnxUrji8trPXYERBjK-_GfK2pX25vAV8Bzz0GZUBvKzwdAHEL7IvFOmnFajEMi9XxCfiXkDszqUqEWJDxPH_a7dfao4rgv99MifJeEfncLTxQ7dw" width="400" /><span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<br /></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<div dir="ltr" style="display: inline !important; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<div style="display: inline !important;">
<b id="internal-source-marker_0.09381896303966641" style="font-weight: normal; text-align: left;"><span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Что там, внутри лямбды?</span></b></div>
</div>
</div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<b id="internal-source-marker_0.09381896303966641" style="font-weight: normal; text-align: left;"><img height="261" src="https://lh4.googleusercontent.com/Kzbz2WRFINhEBSY94JhAXdwAe_uMKsU2dBPcN6PFfeVmMv1Ae65bhT5INRgGfXH4B_GLOTmY7tPGCJomL7x5iwW7wLqbsEtDANYdR2X4N11fX-VwkUEE_nvGWA" width="400" /></b></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<br /></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Напомню присутствующим про стек и кучу. Когда в переменной str_ext сохраняется строка, выделяется память в куче и непосредственно контент строки сохраняется туда в виде структуры RString. В стеке хранится лишь указатель. Если мы ничего не сделаем с переменной str_ext, то после выхода из этого кадра стека на неё не останется ссылок и ей останется лишь спокойно ждать прихода сборщика мусора на следующей итерации. Если же мы её вернём, ссылка на неё останется и у неё будет иммунитет.</span></div>
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Итак, почему же в нашем коде сборщик мусора не съедает str_ext?</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<br /></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><img height="293" src="https://lh5.googleusercontent.com/majPAe9YIE-FiwgImuZxRV0HK5cf9pnf67lmilQ1xBbxrpasHrP-D5g-B5wWP1pR-Xwu9Kkg0Mxg7Y_-FNPiSi-Jmmsjw4f-OoTLNe_yiW5kH14ZeI43-grX0w" width="400" /><span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">При создании лямбды, Руби создаёт копию кадра стека в куче! Теперь там есть ссылка на str_ext и переменной ничего не угрожает. Кроме этого, создаётся ещё два объекта:</span></div>
<br /><ol style="margin-bottom: 0pt; margin-top: 0pt;">
<li dir="ltr" style="font-family: Arial; font-size: 15px; list-style-type: decimal; vertical-align: baseline;"><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="vertical-align: baseline; white-space: pre-wrap;">rb_ent_t - это обёртка для копии стека в куче и</span></div>
</li>
<li dir="ltr" style="font-family: Arial; font-size: 15px; list-style-type: decimal; vertical-align: baseline;"><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="vertical-align: baseline; white-space: pre-wrap;">rb_proc_t - это наша лямбда.</span></div>
</li>
</ol>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Обратите внимание, что rb_proc_t внутри себя содержит rb_block_t, включая скомпилированный набор инструкций и указатель на окружение. Но этот указатель установлен на новую копию стека в куче.</span></div>
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Дурной флаг is_lamda внизу нужен потому, что в Руби есть несколько видов лямбд, которые создаются разными способами и ведут себя </span><span style="font-family: Arial; font-size: 15px; font-style: italic; vertical-align: baseline; white-space: pre-wrap;">немножко</span><span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"> по-разному. Мне тоже это не нравится.</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<br /></div>
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><img height="286" src="https://lh3.googleusercontent.com/Bc25ECSMoS2_cXpaX97JZ2Ks_rdqYs3CXgXIpikxOA2hLyEVO7iaQslnMsYeZ2rEoUfp1rqWzkTKmodiRcjHljuxFIIdhEz2qcdYDL5S8DJ9450qh681dNct-A" width="400" /><span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<br /></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Теперь видно, что когда мы вернёмся из функции, переменная str_ext уцелеет, потому что мы возвращаем лямбду, указатель на которую лежит в стеке. Лямбда, в свою очередь, ссылается на rb_env_t, которая среди всего прочего ссылается на str_ext.</span></div>
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Наконец, мы вызываем лямбду.</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<br /></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><img height="291" src="https://lh5.googleusercontent.com/BVWd4jrPBqU3rRbPCeH2y8zcxQOfyn9XwHc65bZrePCOxZPhz-IuThzoAlf8MNheWkCZeNMUilF6Aj75CIOdkjdv_ukVB3k5i-waG9TJP4GPKOwTsEJFPvne4w" width="400" /><span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<b id="internal-source-marker_0.09381896303966641" style="font-weight: normal; text-align: left;"></b><br />
<div dir="ltr" style="display: inline !important; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<div style="display: inline !important;">
<b id="internal-source-marker_0.09381896303966641" style="font-weight: normal; text-align: left;"><span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Единственная разница здесь с блоком в том, что родителем EP указана структура rb_env_t в куче.</span></b></div>
</div>
</div>
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Итак, есть важная разница между блоками и лямбдами. Лямбды - граждане первого класса, они включают структуру RBasic и представляют собой объекты Proc. Ну, это не совсем так, но с поправкой на абстракцию думать так можно.</span></div>
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Теперь давайте поэкспериментируем с замыканиями. </span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<br /></div>
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><img height="400" src="https://lh3.googleusercontent.com/kp7wHYa1_J0-u252KaPAWGcf3Uj5gwVbEjtpyXbUBUSzabsRJdaSxpTDelTOMnh9dSPrETKaFSmfT2JKnochF9E6-TjVdLm0ReB4zMjdkXzy7j5PV6dfU8hQIw" width="395" /><span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<b id="internal-source-marker_0.09381896303966641" style="font-weight: normal; text-align: left;"></b><br />
<div dir="ltr" style="display: inline !important; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<div style="display: inline !important;">
<b id="internal-source-marker_0.09381896303966641" style="font-weight: normal; text-align: left;"><span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Посмотрите на этот код и скажите, что он, по-вашему выведет. </span></b></div>
</div>
</div>
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Конечно же, он выведет “Goodbye there!”</span></div>
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Как так? Ну, я забыл рассказать кое-то ещё. Руби не только копирует кадр стека в кучу, но ещё и выставляет EP структуры rb_control_frame_t на только что созданную копию.</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<br /></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><img height="288" src="https://lh6.googleusercontent.com/jck-tRM_tOJKEe0q7IcSOHrXAHt3PsjVCVuNgGtbE5h7NeMp6g93ylkxIygPLf0T_cqChd8BlL1a3hsHBuuexIjQ1fXSTjvpax7jkNEe6YWPzrwM1HO2uh_ReQ" width="400" /><span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<b id="internal-source-marker_0.09381896303966641" style="font-weight: normal; text-align: left;"></b><br />
<div dir="ltr" style="display: inline !important; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<div style="display: inline !important;">
<b id="internal-source-marker_0.09381896303966641" style="font-weight: normal; text-align: left;"><span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Теперь в дальнейшем мы работаем с копией стека в куче. Зачем? Чтобы не копировать стек каждый раз, когда мы создаём лямбду.</span></b></div>
</div>
</div>
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Интересным последствием этого факта является то, что две (или больше) лябмд в пределах одного метода работаю с одним и тем же кадром стека, даже после завершения работы метода.</span></div>
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Это даёт интересную с академической точки зрения возможность навертеть своё ООП.</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<br /></div>
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><img height="280" src="https://lh6.googleusercontent.com/jZeZdwcfkgVWWqvnFk4yf8T8WaVfzsRaQfq4fBjykAyP8G8IcayhgOc2LmKwypjej-r6bLqLwiSsacoDj9VlK94H1U8x64cUe5D6xIyj3mPS0lCigbQKVUYVEg" width="400" /><span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<br /></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Собственно, это даёт понимание того, что лексические замыкания - концепция более мощная, чем объектно-ориентированное программирование и ООП реализуется с их помощью легко и быстро.</span></div>
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Посмотрите на этот код - здесь три лямбды замкнуты на одну и ту же переменную.</span></div>
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Зачем же нам нужны блоки, если хватает лямбд? Производительность.</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<br /></div>
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><img height="295" src="https://lh4.googleusercontent.com/enrWbKipjAaUTJajdhIV8CtoKIox49Cq428P6x1T4iTiDxNGlq1ci_rlEpizK5ogb0sJqXPZ6cGcMS9ZOz2eiwwpkEqxt8rUBW2jJuyZRjHNX_NgwIDP6ICkIA" width="400" /><span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<br /></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Посмотрите на эти два фрагмента кода. Они выглядят абсолютно идентичными, но демонстрируют очень разную производительность. Штука здесь в том, что когда вы принимаете блок в формальный аргумент, Руби на самом деле конвертирует его в лямбду и это более чем логичное решение. Ведь в остальном коде блок теперь лежит как локальная переменная, и вы в следующей строчке вполне можете вернуть этот блок из функции.</span></div>
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Вот разница того, что происходит в этих кусках кода:</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><img src="https://lh5.googleusercontent.com/9ujJLhZY68Ibsp9xNGtVePOAO_Yo4kVVgy9s9-G3ZTHJ9S3QswBv0aSAjWHZcpb4zVIjmIIY1S_WiEshUbh1z52XF_-JfMhp3ngVqLNuUSMeSZsFDHuySD7HJw" /><span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<br /></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<b id="internal-source-marker_0.09381896303966641" style="font-weight: normal; text-align: left;"></b></div>
<div dir="ltr" style="display: inline !important; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<b id="internal-source-marker_0.09381896303966641" style="font-weight: normal; text-align: left;"><span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Это "декомпилированные" функции из бенчмарка. Слева yield, справа &block.</span></b></div>
<br /><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Видно, что для вызова yield достаточно низкоуровневой инструкции "invokeblock". А вот второй вариант вынужден создавать объект и посылать ему сообщение "call". Понятно откуда накладные расходы. Тут и диспетчеризация и нагрузка на GC и чёрт знает что ещё. Дело в том, что интерпретатор не в состоянии предсказать, что произойдёт с блоком и вынужден отбросить оптимизации. Из блока строится Proc.</span></div>
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Вывод - не принимайте блок в переменную, если это вам необязательно. Обязательным же это становится, если вы хотите передать этот блок в другую функцию (синтаксиса “вызови функцию с блоком, который мне передали” в Руби нет). </span></div>
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">В конце вкратце коснусь JRuby и Rubinius.</span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<br /></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><img height="295" src="https://lh5.googleusercontent.com/XkQfsRtNj3Pq7wdJMq-FlDazSTZNuhQ0D3mpB3dgYnoEHSu36DQ6wzZkXGwdGEiDSrBknTh22N-toTaiR3ckgUjyg7cr8L3Nb72wWO6oHrXcGrElLfRCiQLI8w" width="400" /><span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"></span><br /><div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<b id="internal-source-marker_0.09381896303966641" style="font-weight: normal; text-align: left;"></b></div>
<div dir="ltr" style="display: inline !important; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<b id="internal-source-marker_0.09381896303966641" style="font-weight: normal; text-align: left;"><b id="internal-source-marker_0.09381896303966641" style="font-weight: normal; text-align: left;"></b></b></div>
<div dir="ltr" style="display: inline !important; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<b id="internal-source-marker_0.09381896303966641" style="font-weight: normal; text-align: left;"><b id="internal-source-marker_0.09381896303966641" style="font-weight: normal; text-align: left;"><b id="internal-source-marker_0.09381896303966641" style="font-weight: normal;"><span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">JRuby не использует стек JVM тем способом, которым MRI использует стек YARV. Эквивалента EP в JRuby тоже нет. Вместо этого используется набор Java классов, и в особенности DynamicScope. Когда вы ссылаетесь на переменную не из своего окна, то есть, пользуетесь замыканием, JRuby сохраняет переменные, на которые вы сослались, в DynamicScope (на самом деле, в одном из его подклассов). Позже, когда JRuby выполняет блок, он создаёт новый объект DynamicScope, который ссылается на “родительский”. Каждый DynamicScope содержит ссылку на включающий его scope - так в JRuby реализован динамический доступ к переменным.</span></b></b></b></div>
<br />
<br />
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<b style="font-weight: normal; text-align: left;"></b></div>
<div dir="ltr" style="display: inline !important; margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<b id="internal-source-marker_0.09381896303966641" style="font-weight: normal; text-align: left;"><img height="299" src="https://lh6.googleusercontent.com/agbk100-1sF3VVCEOcw0dW5lTzT4xlrWc1aDsq2mJ5Dh_EBU22h7q8NLjGMPf-49E_XnJJ5NJ0sAnejGEoKBKgzxU_jCh50Kf9NceZrMyNRmXMsb6cP6rro8rg" width="400" /></b></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
<div dir="ltr" style="margin-bottom: 0pt; margin-top: 0pt; text-align: justify;">
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;">Рубиниус удивительно похож в этом на JRuby. Видимо, дело в том, что и тот и другой реализован на объектно-ориентированном языке. </span></div>
<div>
<span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"><br /></span></div>
</b></div>
Anonymoushttp://www.blogger.com/profile/17152157727140681943noreply@blogger.com0tag:blogger.com,1999:blog-6138770299473511818.post-50371060742541425422012-11-29T08:37:00.001+02:002012-11-29T09:54:40.173+02:00Садок вишневий коло хати<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: right;">
Спитай себе, дитино, хто ти є,</div>
<div style="text-align: right;">
І в серці обізветься рідна мова;</div>
<div style="text-align: right;">
І в голосі яснім ім’я твоє</div>
<div style="text-align: right;">
Просяє, наче зірка світанкова.</div>
<div style="text-align: right;">
<i>Д. Павличко.</i></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Є в моїй вірі доктріна, яку я розумію не повністю. Це реакція Господа на побудову Вавілонської башти. Він не лише не дав її збудувати, але й покарав усе людство на віки вічні. И досі в нашому побуті мі посвякдень бачимо наслідки тої кари.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Тому що з того дня на чолі Землі почали з'явлюватися різні мови. У багатьох людей сьогодення через мовний бар'єр немає доступу до необхідної їм профессійної чі религійної інформації. Є суцільна професія - перекладач. Величезна кількість зусиль людства витрачається на підтримку цієї безлічі мов. Різні алфавіти. Різні кодировки. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Звісно я розумію, що через це Господь являє дива, вчіть терпінню, ввічлівості та сумірності. Також само, як він це робить через войни або хвороби.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Проте я навіть не впевнен, що через мову ви ще не припинили мене читати. </div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPDvhVLusNKbLZiUJIDasCYfHanTUKr3MroWEnFjcg5LTp4AzSw1uql9LgJAcObvyQJtDuPBqJmUg8K9YLxWf95f1e1eaBEdmxmUHbky4qp4bgwL5nEOFcTVRt6fWL2_VQjZRzDaZ3f8k/s1600/0_809c5_935d39f6_orig-1.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPDvhVLusNKbLZiUJIDasCYfHanTUKr3MroWEnFjcg5LTp4AzSw1uql9LgJAcObvyQJtDuPBqJmUg8K9YLxWf95f1e1eaBEdmxmUHbky4qp4bgwL5nEOFcTVRt6fWL2_VQjZRzDaZ3f8k/s640/0_809c5_935d39f6_orig-1.jpeg" width="432" /></a></div>
<br /></div>
<div style="text-align: justify;">
И вот здесь я хочу сказать несколько слов об украинском языке и почему я так и не могу проникнуться его певучестью и рiднiстю настолько, чтобы учить детей разговаривать именно на нём, чтобы самому разговарить на нём в быту и множить на нём контент, проявляя тем самым сознательность и патриотизм. Текст частично навеян статьёй Виталия Скороходова, и являет для меня редкий пример того, как полнейший неадекват может порождать хороший и правильный контент.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Во-первых, то, на чём сейчас говорят на западной Украине, это не язык Шевченко, а какой-то чудовищный новояз. Дичайшая смесь украинского с польским и немецким, причём, заимствования идут по следующему принципу - заменить слова, похожие на русские, на слова, непохожие на русские. Зачем заменять украинское слово "кладовыще" немецким "цвынтарем"? Что такое этот ваш "этер"? Кто такой "милициянт"?</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Во-вторых, русские - не национальное меньшинство в Украине, а вторая государствообразующая нация. Русский язык в Украине, это не оберегаемый язык национального меньшинства, а доминирующий и преобладающий язык. В Украине легче найти человека, который по каким-то причинам плохо знает украинский, чем того, кто плохо знает русский. Глупо пытаться считать этот факт ошибкой и пытаться её исправить. Русский язык доминирует не просто так.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Наконец, главное соображение. Язык - это в первую очередь инструмент для построения второй и третьей сигнальной систем. И я не понимаю, зачем мне использовать тупой и негодный инструмент, если у меня есть отточенный и годный. Украинский язык примитивизировался до бытового уровня. Новые научные и технические материалы на украинском не появляются, а те, которые появляются - это переводы. По большей части с русского. Украинская Википедия в 2 раза меньше русской и поддерживается в 6 раз хуже. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Каких современных украинских писателей или поэтов я должен захотеть прочитать в оригинале? Какой последний украинский фильм я должен захотеть посмотреть? Какие новые хорошие песни на украинском вы хотите предложить мне послушать?</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Украинский язык имеет слишком узкую область применимости. За пределами Украины на нём говорит около 15 миллионов человек. Русский же язык недавно обошёл испанский и сейчас является третьим в мире языком по распространённости. На русском говорят более 150 миллионов человек за пределами Росии. На нём появляется новый контент. Много и в самых разных областях и отраслях. Это язык фундаментальной науки и великой культуры.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Я согласен с тем, что украинский язык нуждается в защите, развитии и разумной государственной поддержке, так как сейчас он не может выдержать никакой конкуренции с русским языком, даже на территории Украины. Но не за счёт ущемления русского языка.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
На мой взгляд, скандальный мовный закон на самом деле ущемляет права русского языка, закрепляя за ним статус регионального. Несколько областей получают право использовать русский язык (как будто они были его лишены), а в остальных областях русский низводят до семейно-бытового.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Итог: разговоры о чудовости и спивучести ридной мови лишены для смысла. Мне она не ридна, современная ещё и сильно отличается от той, что я учил в школе, а как инструмент украинский язык никуда не годится. Только возводит дополнительный барьер между людьми. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Дайте русскому языку статус второго официального, и украинский язык сам, естественным образом, низведётся до статуса регионального. Сейчас, при капитализме и рыночной экономике ведь этот путь более правильный? Раз что-то не выдерживает конкуренции, значит, оно неэффективное, правда же?</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhl9Ks6kOIeDs1jgTcsN_dM5FJPq8nFD-B6GSQlrbap_wt9kf92DZpUlIsRXO6eVMh_PbEy_dyj1tmH70-F7BR1Ls0Up1Ri0jTtuPixS341PK65VytFcDzgVZIQUnRyiQQiD8vUTkj3axA/s1600/156ad5167e.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhl9Ks6kOIeDs1jgTcsN_dM5FJPq8nFD-B6GSQlrbap_wt9kf92DZpUlIsRXO6eVMh_PbEy_dyj1tmH70-F7BR1Ls0Up1Ri0jTtuPixS341PK65VytFcDzgVZIQUnRyiQQiD8vUTkj3axA/s320/156ad5167e.jpeg" width="298" /></a></div>
<div style="text-align: justify;">
<br /></div>
</div>
Anonymoushttp://www.blogger.com/profile/17152157727140681943noreply@blogger.com5tag:blogger.com,1999:blog-6138770299473511818.post-35722999850739226342012-11-22T20:17:00.001+02:002012-11-22T20:17:12.587+02:00Миссия выполнена<div dir="ltr" style="text-align: left;" trbidi="on">
<span style="background-color: white; color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 13.333333015441895px; line-height: 18px;">Миссия завершена: <b>"Папаша"</b>.</span><br style="background-color: white; color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 13.333333015441895px; line-height: 18px;" /><br style="background-color: white; color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 13.333333015441895px; line-height: 18px;" /><span style="background-color: white; color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 13.333333015441895px; line-height: 18px;"><b>Основные задания: </b></span><br style="background-color: white; color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 13.333333015441895px; line-height: 18px;" /><span style="background-color: white; color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 13.333333015441895px; line-height: 18px;">- продержаться до прихода подкрепления: 62 часа из 62 (<i>выполнено</i>)</span><br style="background-color: white; color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 13.333333015441895px; line-height: 18px;" /><span style="background-color: white; color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 13.333333015441895px; line-height: 18px;">- ребёнок должен выжить (<i>выполнено</i>)</span><br style="background-color: white; color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 13.333333015441895px; line-height: 18px;" /><span style="background-color: white; color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 13.333333015441895px; line-height: 18px;">- папа должен выжить (<i>выполнено</i>)</span><br style="background-color: white; color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 13.333333015441895px; line-height: 18px;" /><span style="background-color: white; color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 13.333333015441895px; line-height: 18px;">- не менее 50% квартиры должно уцелеть: 75% из 100% (<i>выполнено</i>)</span><br style="background-color: white; color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 13.333333015441895px; line-height: 18px;" /><span style="background-color: white; color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 13.333333015441895px; line-height: 18px;">- не более 50% одежды ребёнка должно быть использовано: 25% (<i>выполнено</i>)</span><br style="background-color: white; color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 13.333333015441895px; line-height: 18px;" /><br style="background-color: white; color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 13.333333015441895px; line-height: 18px;" /><span style="background-color: white; color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 13.333333015441895px; line-height: 18px;"><b>Дополнительные задания:</b></span><br />
<div class="text_exposed_show" style="background-color: white; color: #333333; display: inline; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 13.333333015441895px; line-height: 18px;">
- кошка должна выжить (<i>выполнено</i>)<br />- использовать соску не более 6 раз, не считая сна: 0 раз из 6 (<i>выполнено</i>)<br />- гулять не менее 1 часа в первый день: 2 часа из 1 (<i>выполнено</i>)<br />- гулять не менее 1 часа во второй день: 2,5 часа из 1 (<i>выполнено</i>)<br />- уложить ребёнка спать днём вовремя в первый день (<i>выполнено</i>)<br />- уложить ребёнка спать днём вовремя во второй день (<i>выполнено</i>)<br />- папа должен выспаться в последнюю ночь: 5 часов из 8 (<i>провалено</i>)<br />- накормить ребёнка кашей в первый день (<i>провалено</i>)<br />- накормить ребёнка кашей во второй день (<i>провалено</i>)<br /><br /><b>Уровневые перки:</b><br />- <b>"Сто шуб"</b>. Умение одевать ребёнка в зимнюю одежду (<i>выучено</i>)<br />- <b>"Не отвертишься".</b> Умение настоять на шапке (<i>выучено</i>)<br />- <b>"Кашевар".</b> Умение варить съедобную кашу (<i>заблокировано</i>)<br />- <b>"Папа мой".</b> +50% к репутации папы у ребёнка (<i>выучено</i>)<br /><br /><b>Бонусные перки:</b><br />- <b>"Папа может!".</b> +100% морали на все последующие задания из серии "Один в поле".<br />- <b>"Сила дракона".</b> +10 к силе на 15 минут при подъёме ребёнка на улице, если ребёнок переносится на своих плечах. Можно использовать дважды за прогулку.<br />- <b>"Как на праздник".</b> +10 к скорости при уходе на работу в следующие 5 дней.</div>
</div>
Anonymoushttp://www.blogger.com/profile/17152157727140681943noreply@blogger.com0tag:blogger.com,1999:blog-6138770299473511818.post-25604329326590340912012-11-20T16:41:00.002+02:002012-11-20T16:46:34.888+02:00Миссия невыполнима 2: Папа может всё, что угодно<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: justify;">
Это вторая статья из цикла "Миссия невыполнима". Начало <a href="http://dimoneverything.blogspot.com/2012/11/blog-post.html">здесь</a>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Коротко ознакомившись с утренней прессой и сделав лёгкую зарядку (пробежав 10 кругов по комнате) Таня заказала завтрак.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Тут надо сказать, что я не был так уж сильно к этому не готов. Я неоднократно интересовался процессом варки утренней каши, перенимал передовой опыт, непосредственно наблюдая за её приготовлением мамой и даже сварил два релиз-кандидата, которые, впрочем, потребитель категорически отверг. Но я учёл допущенные ошибки и был вполне уверен, что на этот раз осечки быть не может.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
После получения первой ложки внутрь, Таня серьёзно задумалась. Она даже достала часть каши рукой изо рта и начала задумчиво её разглядывать. Выражение лица отражало нешуточную работу мысли. Попытки дать ей вторую ложку явно отвлекали ребёнка от размышлений, поэтому от них она попросту небрежно отмахивалась.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Неожиданно, лицо её прояснилось. Было очевидно, что это озарение. "Папа," – решительно сказал ребёнок, – "я придумала, как нам быть. Давай в нашей семье готовить будет мама."</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Да, Таня ещё не в силах столь стройно выразить свои мысли, но иного толкования быть не может – подумала она именно это.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Вы можете себе представить, какая буря поднялась в моей душе. Ведь ребёнка надо же накормить! Мама всегда делала это! Мама...</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Вот в этот момент я и понял, что нужно сменить парадигму своего мышления. Я почему-то пытался заменить маму. А между нами говоря, мама из меня так себе. Но ведь я не должен этого делать! Что в такой ситуации должен сделать папа?</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Уж всяко не заставлять съесть эту кашу. Да я бы и сам её не ел ни за что. Зачем есть эту ужасную субстанцию, когда в доме есть материал для кучи вкусных, ароматных, хрустящих тостов, которые можно приготовить почти не прерывая совместного просмотра песенок из диснеевских мультфильмов. И с удовольствием съесть их вдвоём.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Смену парадигм Таня горячо поприветствовала аппетитным хрустом. Поняла, что и папа на что-то сгодится.</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipSK9v4XRxFliz-3daEu6QDKsay8eq-Ls_t13P-Hwbew8rRYGw0CM92WLnrWTjU7mehlxeFiRhcEqXrDTBm6rWwzuRl7fjZj0zHhKAtoyJme__XLbukFlAj0d1L_M71qOy06Iy2Fkeq0c/s1600/2012-11-20+09.32.40.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipSK9v4XRxFliz-3daEu6QDKsay8eq-Ls_t13P-Hwbew8rRYGw0CM92WLnrWTjU7mehlxeFiRhcEqXrDTBm6rWwzuRl7fjZj0zHhKAtoyJme__XLbukFlAj0d1L_M71qOy06Iy2Fkeq0c/s320/2012-11-20+09.32.40.jpg" width="191" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Дальнейшее течение дня было предрешено: папа может! Разумеется, смена парадигм повлияла и на прогулку. Ведь что такое прогулка с мамой? Идём туда, куда хочет мама. Держим в руке то, что взяла с собой мама и сама предложила взять в руку. Чередуем занятия так, как придумала себе мама. И потом Лиля мне ещё жалуется, что ребёнок плохо себя ведёт на прогулке, а потом его ещё сложно спать уложить.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Со всей ответственностью Таня рекомендует вам гулять с папой.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
С папой можно идти туда, куда сама хочешь. Папа при этом проследит, чтобы тебе не угрожала реальная опасность, но под ноги смотреть всё равно надо – против падений с небольшой высоты папа ничего не имеет. Ещё и вставать потом самой придётся. Однако, у папы есть что посоветовать по вопросам куда идти – он может найти место, где есть огромная толпа голубей и их можно с удовольствием гонять.</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3v7oHxKDM8ZLwW56Yrc8vW0Zx0_rxJz2nOyRizIUMI0w_pTJ1TcokQypWuCK-Rv2RL1S_OvvrHpUFjqiy1ZDoy-kJi9PbpJLj1DY6eH33UiSFYHpQ0xDa9le7o2Nzh8Bo6xHWO1-a0XY/s1600/2012-11-20+11.10.51.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg3v7oHxKDM8ZLwW56Yrc8vW0Zx0_rxJz2nOyRizIUMI0w_pTJ1TcokQypWuCK-Rv2RL1S_OvvrHpUFjqiy1ZDoy-kJi9PbpJLj1DY6eH33UiSFYHpQ0xDa9le7o2Nzh8Bo6xHWO1-a0XY/s320/2012-11-20+11.10.51.jpg" width="191" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Если голубей мало, можно сходить с папой в магазин и взять маленькую булку. Голубей станет много.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
С папой можно ходить куда глаза глядят. С ним можно даже переходить дороги, правда, по пешеходному переходу, но своими ногами. С ним можно покачаться на цепочных качелях, на которых мама катать отказывается – говорит, опасно. Можно взобраться на горку в обратном направлении, а уже потом с неё съехать. Причём, съехать самой, папа только внизу впоймает, и то если что-то пойдёт не так.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Если осторожно, с папой можно зайти на заброшенную детскую площадку, на которую вход воспрещён и которая в аварийном состоянии. Конечно, папа не пустит ни к одной из качелей, но походить там – это очень увлекательно.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
С папой можно вдоволь налазиться по любой из приглянувшихся лестниц, даже если это лестница не на горку на детской площадке, а в какой-нибудь магазин прямо на улице.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Да, папа не подсадит на качелю, если считает, что ты можешь залезть туда сама. Но он подстрахует, а залезть самой даже веселее. И слезать тоже.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCg9nE0ga2VJOf2CyaSmfFGPQp07FZR6AAx32mlhr6J6NAqGXgnA_7GaYpVPiKkTAxczenIX9gUo69eBaHDhonP8sxCmzkQRaDBYfmdfqtLyYmzScmQN9ztv6vECW2aVmDaplGhMHxws8/s1600/2012-11-20+11.43.40.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCg9nE0ga2VJOf2CyaSmfFGPQp07FZR6AAx32mlhr6J6NAqGXgnA_7GaYpVPiKkTAxczenIX9gUo69eBaHDhonP8sxCmzkQRaDBYfmdfqtLyYmzScmQN9ztv6vECW2aVmDaplGhMHxws8/s320/2012-11-20+11.43.40.jpg" width="191" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
С папой можно даже зайти в венскую булочную, взять там слойку с яблоком и прямо на улице весело её съесть, кусая по очереди. А на остаток крошек папа может подманить себе прямо на руку голубей, и их даже можно попытаться погладить.</div>
<br />
Есть свои недостатки – психовать с папой можно, но бесполезно. Он не ведётся.<br />
<br />
Зато когда придёшь с такой двухчасовой прогулки, так хочется есть! А потом спать... спать... спать...<br />
<br />
В общем, до приезда мамы остались 1 сутки, 16 часов и 20 минут, но, похоже, мы сможем их прожить.</div>
Anonymoushttp://www.blogger.com/profile/17152157727140681943noreply@blogger.com1tag:blogger.com,1999:blog-6138770299473511818.post-25947060779603797762012-11-19T19:46:00.003+02:002012-11-20T16:17:08.516+02:00Миссия невыполнима<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: justify;">
Супруга, свет очей моих, оставила меня на шестьдесят два часа дома на хозяйстве. Одного.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Если бы мне надо было скомбинировать несколько аппликативных функторов через монады или спроектировать объектную архитектуру приложения, или провести рефакторинг большого куска унаследованного кода – я бы не испугался. Но монада тут одна, у неё светлые волосы, фирменный кириенковский нос и полное отсутствие понимания принципов функционального программирования. Зовут Татьяна. Поэтому сложности начались с первых мгновений вместе.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Мамы нет около 30 минут – она всё ещё в одном с нами городе. Но количество событий уже зашкаливает. Во-первых, как только за мамой закрылась дверь, ребёнок немедленно потребовал маму назад. Моя апелляция была отклонена и маленький человек упорно требовал немедленного исполнения судебного решения в точности – а именно, подайте мне маму здесь и сейчас. Как только мне удалось убедить пострадавшую сторону, что Тимон и Пумба вместе, если постараются, ненадолго маму могут заменить, сразу выяснилось, что за это время ребёнок стал легче, и я бы сказал, что граммов на шестсот. Я как раз задумался о том, что новые технологии уже в силах донести до меня с экрана особенности секретного оружия Пумбы, и тут Таня оповестила меня о том, что с такой запятнанной репутацией спокойно сидеть она не будет - требуется срочное техобслуживание.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
После пит-стопа я тоже узнал много нового. Во-первых, что нужно убирать влажные салфетки после проведения техобслуживания. Во-вторых, что телефон не мешает располагать повыше или класть в карман домашних шорт. В-третьих, что меня очень любят и хотят немедленно расцеловать.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
В общем, полёт проходит нормально, чувствую себя хорошо. Ребёнок знакомится с иллюстрированной историей некоего семейства медведей. До приезда мамы осталось 2 суток, 13 часов и 20 минут.</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: justify;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0WxkezLK7YMULl29OX38NZsOlsl4OjNmE50Y3v8L6jgag_z1nTMWadlcIP4607TJ3VnV5hCeVFp0W4reU1eMjRpIpAU-uNRbSSxSFnDke8q5MAxB3nR5Se1-UXNbg2ZAaB3V1L76Ns2o/s1600/2012-11-19+19.41.52.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi0WxkezLK7YMULl29OX38NZsOlsl4OjNmE50Y3v8L6jgag_z1nTMWadlcIP4607TJ3VnV5hCeVFp0W4reU1eMjRpIpAU-uNRbSSxSFnDke8q5MAxB3nR5Se1-UXNbg2ZAaB3V1L76Ns2o/s320/2012-11-19+19.41.52.jpg" width="191" /></a></div>
<div style="text-align: justify;">
<br /></div>
</div>
Anonymoushttp://www.blogger.com/profile/17152157727140681943noreply@blogger.com1tag:blogger.com,1999:blog-6138770299473511818.post-30572406205095698962012-10-12T08:27:00.000+03:002012-10-12T08:49:09.081+03:00О мостостроении<div dir="ltr" style="text-align: left;" trbidi="on">
<div style="text-align: right;">
<blockquote class="tr_bq">
<span style="background-color: white; color: #333333; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px;">Я сейчас понял</span><span style="background-color: white; color: #333333; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; margin-right: -0.2em;">,</span><span style="background-color: white; color: #333333; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; margin-left: 0.2em;"> </span><span style="background-color: white; color: #333333; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px;">кого мне напоминают большинство знакомых дизайнеров. Маленьких детей. Схватит ребёнок палку и кричит</span><span style="background-color: white; color: #333333; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; margin-right: 0.44em;"> </span><span style="background-color: white; color: #333333; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; margin-left: -0.44em;">«</span><span style="background-color: white; color: #333333; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px;">Это автомат с лазерными пулями! Тиу-тиу-тиу!». Или сядет в коробку</span><span style="background-color: white; color: #333333; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; margin-right: 0.44em;"> </span><span style="background-color: white; color: #333333; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; margin-left: -0.44em;">«</span><span style="background-color: white; color: #333333; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px;">Это мой джип</span><span style="background-color: white; color: #333333; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; margin-right: -0.2em;">,</span><span style="background-color: white; color: #333333; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; margin-left: 0.2em;"> </span><span style="background-color: white; color: #333333; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px;">дрынь-дрынь</span><span style="background-color: white; color: #333333; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px;">!» И главная проблема в том</span><span style="background-color: white; color: #333333; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; margin-right: -0.2em;">,</span><span style="background-color: white; color: #333333; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; margin-left: 0.2em;"> </span><span style="background-color: white; color: #333333; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px;">что стреляет и ездит эта фиговина только у него в воображении. На деле оказывается</span><span style="background-color: white; color: #333333; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; margin-right: -0.2em;">,</span><span style="background-color: white; color: #333333; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; margin-left: 0.2em;"> </span><span style="background-color: white; color: #333333; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px;">что лазерных пуль не бывает</span><span style="background-color: white; color: #333333; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; margin-right: -0.2em;">,</span><span style="background-color: white; color: #333333; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px; margin-left: 0.2em;"> </span><span style="background-color: white; color: #333333; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; line-height: 24px;">а у джипа должен быть движок и колёса.</span> </blockquote>
<blockquote class="tr_bq">
<span style="color: #333333; font-family: Helvetica Neue, Helvetica, Arial, sans-serif;"><span style="line-height: 23.99691390991211px;"><i>Из интернета.</i></span></span></blockquote>
</div>
<div style="text-align: right;">
<span style="color: #333333; font-family: Helvetica Neue, Helvetica, Arial, sans-serif;"><span style="line-height: 23.99691390991211px;"><br /></span></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHZBk1ITJ-6mhHPmf4C0l_ErU_pX8P0Ccj4pZj3zSgNV2NU7jTc5nl56sEaYnePxam5TmqUiMbckoE4cjkaOgcMismmkYgSWFDDWzybu0V2MOcmz-cUe9xySD-GNHNuXTAkUG-8S2W-RU/s1600/Science_rules.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="193" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHZBk1ITJ-6mhHPmf4C0l_ErU_pX8P0Ccj4pZj3zSgNV2NU7jTc5nl56sEaYnePxam5TmqUiMbckoE4cjkaOgcMismmkYgSWFDDWzybu0V2MOcmz-cUe9xySD-GNHNuXTAkUG-8S2W-RU/s320/Science_rules.jpeg" width="320" /></a></div>
<div style="text-align: left;">
<span style="color: #333333; font-family: Helvetica Neue, Helvetica, Arial, sans-serif;"><span style="line-height: 23.99691390991211px;"><br /></span></span></div>
<span style="color: #333333; font-family: Helvetica Neue, Helvetica, Arial, sans-serif;"><span style="line-height: 23.99691390991211px;"><br /></span></span>
<br />
<div style="text-align: justify;">
<span style="color: #333333; font-family: Helvetica Neue, Helvetica, Arial, sans-serif;"><span style="line-height: 23.99691390991211px;">Лучший дизайнер нашей фирмы очень любит обвинять учёных-теоретиков в бесполезности. Особенно математиков и представителей других наук с абстрактым предметом изучения. Дескать, городят свою никому, кроме них, непонятную и неинтересную заумь, <strike>в то время, как в Африке голодают дети</strike> в то время, как масса повседневных проблем не решена. Вот взять бы их всех и <strike>расстрелять</strike> приставить к полезному делу, а главное - к практике. Зачем нужно дальше считать простые числа? Что толку в бозоне Хиггса, который просто чтобы заметить нужно затратить миллиарды долларов? А всякие полностью непонятные области математики, которые сами математики не в силах объяснить зачем нужны?</span></span></div>
<br />
<div style="text-align: justify;">
<span style="color: #333333; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height: 23.99691390991211px;">В качестве примера правильного поведения наш друг приводит такую вот конструкцию: есть остров, на котором живут простые люди. Так сказать, "человек массовый". Есть остров, на котором есть куча пока что бесполезных научных достижений. Там проживает "человек учёный". И вот самый правильный, самый клёвый человечище - это тот, который строит между этими островами мост. А потом придумывает, как этот хлам со второго острова пристроить на пользу обитателям первого. Как внимательный читатель мог догадаться, первым и основным примером такового человека, мой собеседник приводит Стивена Джоббса.</span></div>
<br />
<div style="text-align: justify;">
<span style="color: #333333; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height: 23.99691390991211px;">Проблема этой позиции в нарушении причинно-следственной связи.</span></div>
<br />
<div style="text-align: justify;">
<span style="color: #333333; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height: 23.99691390991211px;">Ни один человек - ни я, ни упомянутый дизайнер, ни Стив Джоббс, ни Стивен Хокинг - не может уверенно заявить о любом научном исследовании, что это бесполезно. Просто потому, что мы этого не знаем. Нашими куцыми мозгами очень сложно представить, что именно сочинит очередной мостостроитель, чтобы применить ту или иную бесполезную научную конструкцию на благо человечества.</span></div>
<br />
<div style="text-align: justify;">
<span style="color: #333333; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height: 23.99691390991211px;">Вся современная цивилизация - электроника, вычислительная техника - стоит на уравнениях Максвелла. Когда Максвелл писал "Труд об электричестве и магнетизме", всё добываемое на тот момент электричество добывалось в лабораториях для вот таких исследований. Его исследовали как какой-то курьёз природы - ну интересно же. Подумать о том, насколько плотно оно войдёт в нашу жизнь и сколько вещей можно делать с его помощью на тот момент не мог ни Максвелл, ни кто бы то ни было ещё. Мало того - Максвелл опирался на труды Фарадея, а тот - на работу Эрстеда, а у них было ещё меньше шансов ощутить </span><i style="color: #333333; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height: 23.99691390991211px;">практическую </i><span style="color: #333333; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height: 23.99691390991211px;">пользу от своей работы. Непосредственную пользу, каковая и интересует в основном героя нашего рассказа.</span></div>
<br />
<div style="text-align: justify;">
<span style="color: #333333; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height: 23.99691390991211px;">Книга Шрёдингера "Что такое жизнь" не имела непосредственной практической пользы. Просто не было средств, позволяющих поближе заглянуть в эту "крупную органическую молекулу, по всей видимости определяющую наследственные признаки". Это была теория чистой воды. Но именно Шрёдингер, сформулировав своё волновое уравнение и попытавшись описать жизнь в терминах физики, несёт основную ответственность за современную биологию. И потом Уотсону и Крику было на что опираться, когда они расшифровывали структуру ДНК.</span></div>
<br />
<div style="text-align: justify;">
<span style="color: #333333; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height: 23.99691390991211px;">Матхеттенский проект. Торжество чудес, которые может творить заказная наука. Где бы он был без трудов Резерфорда, самоотверженной работы Кюри, да хотя бы любопытства Беккереля?</span></div>
<br />
<div style="text-align: justify;">
<span style="color: #333333; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height: 23.99691390991211px;">Гравитационное ускорение времени Эйнштейна не имело практической пользы десятки лет. Но только когда его учли, удалось добиться современной точности работы спутниковой навигации.</span></div>
<br />
<div style="text-align: justify;">
<span style="color: #333333; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height: 23.99691390991211px;">Ну а про то, где были бы сейчас совершенно практические и многократно применённые научные отрасли без абсолютно бесполезных на момент своего придумывания отрицательных или комплексных чисел, или о том, что понятие атом было введено за сотни лет до микроскопа, наверно и говорить не стоит.</span><br />
<span style="color: #333333; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height: 23.99691390991211px;"><br /></span>
<span style="color: #333333; font-family: Helvetica Neue, Helvetica, Arial, sans-serif;"><span style="line-height: 23.99691390991211px;">И даже шествие к успеху многократно обсуждённого в последнее время высокотехнологичного украинского стартапа Viewdle началось с того, что один из его основателей заинтересовался научной работой Михаила Шлёзингера.</span></span></div>
<br />
<div style="text-align: justify;">
<span style="color: #333333; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height: 23.99691390991211px;">И прости меня, мой друг дизайнер, но без Тьюринга, Хоппер, Ричи, Алана Кея персональных компьютеров и вообще вычислительной техники могло и не выйти. А вот без Джоббса - да кто-то ещё вытащил бы этот секрет из Xerox Parc. Или те сами бы осознали.</span></div>
<br />
<div style="text-align: justify;">
<span style="color: #333333; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height: 23.99691390991211px;">Учёному нельзя говорить, чем ему заниматься. Иначе это мёртвый учёный. Никто не может сказать, полезен его труд или нет. Только время. И то подождать придётся.</span></div>
<br />
<div style="text-align: justify;">
<span style="color: #333333; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height: 23.99691390991211px;">Если все талантливые люди, способные проколоть пузырь научного познания и расиширить его границы начнут вместо этого заниматься практическим применением уже сделанных научных достижений - второй остров опустеет. И в какой-то момент нам не хватит научного знания для достижения результата. </span></div>
<br />
<div style="text-align: justify;">
<span style="color: #333333; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height: 23.99691390991211px;">Нет, мостостроители нужны. Очень нужны. Куда без них. Но не нужно путать причину и следствие. Источник и транспорт. А то выходит, что в каком-нибудь доисторическом племени главными были женщины. Ведь что делали мужчины - убивали на охоте мамонтов. А что такое убитый мамонт? Гора непригодного к немедленному употреблению мяса. Его теперь надо </span><strike style="color: #333333; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height: 23.99691390991211px;">перевезти по мосту к простым людям</strike><span style="color: #333333; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height: 23.99691390991211px;"> разрезать на куски, зажарить, добавить трав... И тогда он уже становится полезен.</span></div>
<br />
<div style="text-align: justify;">
<span style="color: #333333; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; line-height: 23.99691390991211px;">Кто-то должен ходить на охоту за новыми мамонтами. И, на самом деле, именно они обеспечивают выживание и процветание племени. А не повара.</span></div>
<br />
<div style="text-align: justify;">
<span style="color: #333333; font-family: Helvetica Neue, Helvetica, Arial, sans-serif;"><span style="line-height: 23.99691390991211px;"><br /></span></span>
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2T120KaE3J-79Q8izet8TrR2wsnA1nD67MNStO8ijpiTK9XJin-j75hGhNU9z7I52cvSlMg-mS119HaTOQ_rIiUkZKuiYxxolbHSE9mFamOZw4R5aVUeNvsJIDBWyZOK58Bx3XBqQRZU/s1600/54_v1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="248" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2T120KaE3J-79Q8izet8TrR2wsnA1nD67MNStO8ijpiTK9XJin-j75hGhNU9z7I52cvSlMg-mS119HaTOQ_rIiUkZKuiYxxolbHSE9mFamOZw4R5aVUeNvsJIDBWyZOK58Bx3XBqQRZU/s320/54_v1.png" width="320" /></a></div>
<span id="ctrlcopy" style="background-color: white; color: transparent; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 16px; height: 1px; line-height: 24px; overflow: hidden; position: absolute; width: 1px;"><br />С сайта<a href="http://www.inpearls.ru/" style="color: #776439; text-decoration: none;">http://www.inpearls.ru/</a></span></div>
Anonymoushttp://www.blogger.com/profile/17152157727140681943noreply@blogger.com0tag:blogger.com,1999:blog-6138770299473511818.post-14480209111945192502012-08-05T12:41:00.002+03:002012-08-05T12:41:24.784+03:00Как я провёл лето<div dir="ltr" style="text-align: left;" trbidi="on">
Этот текст я пишу для того, чтобы подготовиться к отчёту о новом эксперименте, который поставили у нас на фирме и в котором я служу подопытным кроликом.<br />
<br />
Как-то у нас на работе попробовали решить некоторое подможество проблем хитрым приёмом. Это подмножество включало в себя:<br />
<br />
<ul style="text-align: left;">
<li>Новые проекты, которое берёт фирма, зачастую гибнут вследствие неправильного общения с заказчиком, расстановки приоритетов, медленного первого релиза, неверных проектных решений...</li>
<li>Фирма распадается на мелкие фракции, диффузия информации и знаний между которыми стремится к нулю.</li>
<li>Сложно оценить уровень людей, работающих в глубоком одиночестве.</li>
<li>Исполнители, уровень которых позволяет решать 80% повседневных задач вполне могут надолго затупить или начать неправильными костылями решать задачи из остальных 20%</li>
<li>Старшим разработчикам, так называемым сеньорам (seniors) в этом же ворохе повседневных задач скучно и неинтересно, они тупеют и не могут поднять головы от сохи и посмотреть на звёзды.</li>
<li>Наверно и ещё что-то.</li>
</ul>
<div>
Для всего этого вороха проблем директор предложил такое решение: вывести сеньоров из-под текущего проекта, дать им под крыло несколько проектов на правах "блуждающего форварда" - самим определять себе точку приложения усилий. Такой сеньор может и научить разработчиков техпроцессу, как делать продукт, как вести коммуникацию. Поучит, как писать код, как управлять репозиторием и трекером. Будучи свободен от оценок и обязательств, может выбрать себе интересную задачу и со вкусом её сделать без оглядки на заказчика - большой рефакторинг или ещё что-нибудь интересное. Он же поможет исполнителям повышать свою квалификацию, он же даст оценку этой квалификации при принятии решения о повышении. Он же поможет решить задачу из верхних 20%. И сможет распространять своё понимание хорошего на несколько проектов, что создаст конвекционное течение знаний, навыков и практик.</div>
<div>
<br /></div>
<div>
Есть одно опасение - а не задолбётся ли такой сеньор переключать контексты? Ну, это уж как он время своё организует.</div>
<div>
<br /></div>
<div>
Для оценки эффективности идеи выбрали тестового сеньора - меня. Посмотреть, что из этого получится. Так я и стал <a href="http://flibusta.net/b/46756/read">Муравьём Красная Точка</a>. Этот текст о моих приключениях и промежуточном подведении результатов эксперимента.</div>
<div>
<br /></div>
<div>
В среднем, после пары замен, я вёл то три, то четыре проекта. Все, кроме одного - новые, ещё не имеющие стейджинг-сервера, не вышедшие в продакшн и не имеющие пользователей. Один - тот из которого меня вывели - давно запущенный проект с реальными пользователями, которые даже платят.</div>
<div>
<br /></div>
<div>
На одном из еженедельных совещаний руководства фирмы и её топ-сотрудников программист Стропалов Дима высказал мысль - а как оценивать результаты и полезность таких вот "свободных сеньоров"? Первое, и пока единственное, что пришло в голову - успех проекта и рост квалификации его исполнителей. Скорее всего, именно это и стало моим камнем преткновения на этом поприще. Конечно же, не то, что Дима высказал эту мысль, а сама мысль - у меня она появилась раньше.</div>
<div>
<br /></div>
<div>
В точных науках очень важна верификация / фальсификация. Теория хороша, если она даёт сбывающиеся предсказания, и плоха, если она ошибается. Одна теория лучше другой, если её предсказания точнее и спектр применимости - шире. Одного провалившегося эксперимента достаточно для признания теории неверной или для сужения спектра её применимости.</div>
<div>
<br /></div>
<div>
Для меня важно получать зарплату не просто так и верифицировать результаты своей деятельности. Единственные критерии, которые я вижу - это рост квалификации исполнителей и успех проектов. С этого места всё меняется.</div>
<div>
<br /></div>
<div>
Как только я начинаю болеть за проекты, я перестаю быть свободным. От сроков и обязательств, от заказчиков и пользователей. Когда цель - это успех проекта, самостоятельное программирование становится роскошью и неверной тратой времени и сил. Время начинает полностью уходить на типичные менеджерские задачи - поддержка коммуникации, расстановка приоритетов и дорожных столбов, определение точек входа и выхода дополнительных специалистов, - дизайнеров, верстальщиков, - вразумление заказчиков и программистов, планирование релизов, поддержание порядка на Трекере. Если эти задачи решены - code review. Больше времени не хватает ни на что.</div>
<div>
<ul style="text-align: left;">
<li>Редактор кода на прошлой неделе я запускал один раз. В три часа дня. В пять я его закрыл. Нормальная ситуация.</li>
<li>Приходится очень много писать писем, очень много разговаривать в живую и по Скайпу, очень много чатиться, очень много времени проводить на Трекере.</li>
<li>Я стал гораздо больше переживать по поводу своих неправильных решений. Я очень сильно переживаю по поводу каждой из своих менеджерских ошибок, допущенных в этом качестве. </li>
<li>Я стал намного сильнее уставать. Да-да.</li>
<li>Я вовсе не стал более свободным.</li>
</ul>
<div>
Не всё так мрачно. Мне нравилось то, что я делаю, когда я был программистом. Мне нравится то, что я делаю сейчас, когда я менеджер. В конце концов, это вполне логичный этап эволюции и профессионального роста на моём поприще. Да, по программированию скучаю, отсюда всякие разминки и прочее. Но разработка продукта - тоже интересная штука.</div>
</div>
<div>
<br /></div>
<div>
В какой ситуации я мог бы попрограммировать? Ответ очевиден - если на всех моих проектах всё хорошо. В частности, все уже в продакшене, у всех есть пользователи, у всех порядок на трекере и виден план их дальнейшего развития.</div>
<div>
<br /></div>
<div>
Вторым вариантом являлось бы <i>наличие</i> на этих проектах менеджера. То есть, было кому делать это работу. Тогда при сохранении критерия "с проектом всё хорошо - значит и сеньор справляется", сеньор мог бы позволить себе роскошь программирования.<br />
<br />
Третьим вариантом может быть снижение количества поддерживаемых проектов до, скажем, двух. Теоретически управленческих задач тупо станет меньше, во столько же раз уменьшится количество отвлекающих запросов, и станет настолько легче, что по отношению к двум проектам можно будет исполнять все цели - и управление, и техническую помощь, и, собственно, произвольный вклад программированием.</div>
<div>
<br /></div>
<div>
Возможно, это всё мои комплексы. Возможно, мне стоит забить на эту менеджерскую возню и начать развлекаться с кодом проектов, заодно помогая их исполнителям советами и техническими решениями. Меня останавливает то, что провалившийся проект с кучей шикарных технических решений внутри - это не очень хорошо. И Анахорет в целом, и я лично, хотя и приобретаем больше позитивного опыта программирования, но, к примеру, сильно теряем в области портфолио.</div>
<div>
<br /></div>
<div>
Что очень мешает? Нереально бесит переключение контекстов. Мои наивные мечты о переключении контекста раз в сутки сродни мечтам Ассоль - в какой-нибудь сказке они могли бы и сбыться. На практике, если я не сижу рядом с кем-то, разговаривая, разработчики всех проектов дёргают меня с периодичностью инъекций личинок в инкубаторы зерга. Да в принципе, если с кем-то засижусь, происходит то же самое. "Дима, давай посоветуемся". "Дима, что сейчас лучше делать?". "Дима, как ты думаешь?". В пятницу вечером я хотел выделить себе три часа в конце дня разгрести трекер проекта Turbine. Я смог начать это делать, когда из этих трёх часов осталось сорок минут. Из-за этого я вообще не могу сосредоточиться на чём-либо. Причина и решение это проблемы вполне очевидны. Причина - фиговый я менеджер пока что. Учусь. Слишком много микроконтроля. Решение - надо лучше распоряжаться временем, лучше планировать и лучше ставить задачи. Ещё это зависит от уровня исполнителей - проект Влада гораздо менее чувствителен к контролю, чем проект Жени. Но тут уж какой топор есть, так из него уху и варить.</div>
<div>
<br /></div>
<div>
Вижу ли я перспективы - да, вижу. Научусь я быть менеджером. Станет у меня всё лучше получаться. Доведу проекты до их запусков. И если мне не дадут новых проектов взамен этих, у меня начнёт появляться свободное время. Может быть, его даже хватит, чтобы попрограммировать.</div>
<div>
<br /></div>
<div>
Чего бы мне хотелось? Мне нравилось быть программистом. Мне нравится то, что я делаю сейчас. Мне намного больше будет нравится это же занятие, когда, как я и сказал, проекты дойдут до релиза, а я научусь управлению проектами и времени станет больше.</div>
<div>
<br /></div>
<div>
Программировать мне всё же нравится больше. И если бы я получил новый проект сам для себя или с одним равным напарником, или с одним джуниором на обучение - был бы доволен. Счастлив был бы, если бы этот проект ставил передо мной наукоёмкие задачи - обработка естественных языков, распознавание образов или речи, написание кодека, базы данных, компилятора, параллельных вычислений... Но об этом я напишу в другой раз.<br />
<br />
<b>Резюме</b>. В том виде, в котором я сейчас работаю, я не кто иной, как менеджер, и больше никем быть не могу. Программировать некогда, и не всегда есть время посмотреть код, который пишут исполнители. Возможные пути решения этой проблемы конфликтуют с другими целями, стоящими перед этой программой или требуют отсутствующих в данный момент ресурсов. Поставленный руководить тремя-четырьмя проектами, из которых более одного не вышло в продакшн, сеньор будет вынужден заниматься исключительно менеджерскими обязанностями, под которыми я понимаю - коммуникации, обучение исполнителей, планирование итераций и релиза.</div>
</div>
Anonymoushttp://www.blogger.com/profile/17152157727140681943noreply@blogger.com4tag:blogger.com,1999:blog-6138770299473511818.post-26434520090004481372012-07-31T22:50:00.001+03:002012-07-31T23:07:17.328+03:00От благодарного слушателя<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<div style="background-color: white; color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px;">
Топ-1 смешных случаев с Таней.</div>
<div style="background-color: white; color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px;">
<br /></div>
<div style="background-color: white; color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px;">
Бульвар Пушкина, вечер. Выступает заезжий коллектив - саксофон, альт, клавиши. Играют джаз.</div>
<div style="background-color: white; color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px;">
<br /></div>
<div style="background-color: white; color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px;">
Мы с Таней гуляем, Таня в обнимку со своей куклой. Таня слышит музыку, подходит ближе и начинает танцевать. Ну, как умеет. С куклой в обнимку. Несколько движений плюс повороты вокруг своей оси. Ну нравится Тане музыка. Люди проходят мимо, иногда что-то бросая в чехол от альта. Некоторые дети и младенцы тоже остановились послушать.</div>
<div style="background-color: white; color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px;">
<br /></div>
<div style="background-color: white; color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px;">
Конец произведения. Тишина. Таня подходит к чехлу и бросает туда свою куклу.</div>
<div style="background-color: white; color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px;">
<br /></div>
<div style="background-color: white; color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px;">
Занавес.</div>
<div style="background-color: white; color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px;">
<br /></div>
<div style="background-color: white; color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px;">
Когда все отсмеялись, я подошёл и выкупил честно заработанную музыкантами куклу. Конечно же, гораздо дешевле себестоимости.</div>
<div style="background-color: white; color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px;">
<br /></div>
<div style="background-color: white; color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px;">
А играли ребята и правда неплохо.</div>
<div style="background-color: white; color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px;">
<br /></div>
<div style="background-color: white; color: #333333; font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px;">
P.S. Моё преступление перед обществом состоит в отсутствии фото и видеоматериалов о событии. Приношу всем свои извинения. Не подумал.</div>
</div>Anonymoushttp://www.blogger.com/profile/17152157727140681943noreply@blogger.com2tag:blogger.com,1999:blog-6138770299473511818.post-76387318351310342962012-07-25T01:00:00.002+03:002012-12-08T19:48:12.231+02:00Гуманитарии, вы не справились.<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<div style="padding: 0px; text-align: -webkit-auto;">
<span style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px; text-align: -webkit-auto;">Прогулки домой можно потратить на размышления, а можно - на разговор с умным человеком, особенно если вам по пути. Я выбрал второе и не пожалел. Дальнейший текст представляет собой обработку высказанных моим собеседником мыслей, под каждой из которых готов подписаться и я.</span></div>
<div style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px; padding: 0px; text-align: -webkit-auto;">
<br style="font-size: 11px; line-height: 16px;" /></div>
<div style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px; padding: 0px; text-align: -webkit-auto;">
Бог, природа, эволюция, здравый смысл ориентируют человечество добиваться двух осмысленных целей: покинуть пределы нашей маленькой голубой точки как максимум и построить счастливую жизнь на этой самой точке как минимум. Чаще всего вторую цель характеризуют как "рай на земле" - некое справедливое общество, в котором каждый человек достигает максимума своего потенциала, полностью реализует данные ему Богом, природой и эволюцией таланты, способности и возможности, при этом максимально обогащая своими достижениями общество.</div>
<div style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px; padding: 0px; text-align: -webkit-auto;">
<br style="font-size: 11px; line-height: 16px;" /></div>
<div style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px; padding: 0px; text-align: -webkit-auto;">
Такое общество требует двух непременных условий: высокого уровня технологий и духовной полноценности большинства своих членов.</div>
<div style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px; padding: 0px; text-align: -webkit-auto;">
<br style="font-size: 11px; line-height: 16px;" /></div>
<div style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px; padding: 0px; text-align: -webkit-auto;">
Технологии нужны для того, чтобы было время развиваться. Самая первая известная человечеству форма хозяйствования - собирательство - 100% времени бодрствования каждого индивидуума требует посвящать добыче пропитания. При таком раскладе один дееспособный в состоянии прокормить себя и при хорошем раскладе своих недееспособных детей. При этом уровне технологий времени больше нет ни на что. Прирост населения тоже ограничен, причём, не только количеством детей, которых индивидуум может прокормить, но и чрезвычайной уязвимостью такого общества ко всему - пожарам, засухам, эпидемиям... Ни о каком развитии говорить не приходится. Первые же технологии - земледелие, скотоводство - дают возможность дееспособному члену общества, занятому производством пищи кормить себя "и того парня". Первые такие освободившиеся, конечно, становятся защитниками (солдатами), ну или нападающими, но постепенно, высвободившиеся получают время подумать и двигать технологии дальше. Постепенно, технологии позволяют всё большему количеству людей повышать качество жизни, а не просто её поддерживать - медицина, транспорт, развлечения, да та же вкусная еда.</div>
<div style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px; padding: 0px; text-align: -webkit-auto;">
<br style="font-size: 11px; line-height: 16px;" /></div>
<div style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px; padding: 0px; text-align: -webkit-auto;">
Чуть дальше технологии уже начинают служить целям того самого справедливого общества. Связь позволяет людям принимать больше участия в управлении, письменность и книгопечатание - получать больше знаний, чем людям на предыдущем уровне технологий удавалось получить за всю свою жизнь, медицина - выживать и поменьше отвлекаться на болезни.</div>
<div style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px; padding: 0px; text-align: -webkit-auto;">
<br style="font-size: 11px; line-height: 16px;" /></div>
<div style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px; padding: 0px; text-align: -webkit-auto;">
В общем, технологии необходимы.</div>
<div style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px; padding: 0px; text-align: -webkit-auto;">
<br style="font-size: 11px; line-height: 16px;" /></div>
<div style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px; padding: 0px; text-align: -webkit-auto;">
Духовая же полноценность членов общества необходима не меньше. "Богат не тот, у кого много, а тот, кому хватает". Это значит, что, конечно же, есть некий необходимый минимум, который у человека для счастья должен быть обязательно, но при этом, при отсутствии правильного нематериального наполнения никакого максимума человеку не хватит. Посмотрите на способ жизни современных олигархов, или просто внезапно разбогатевших людей, чтобы это понять. Когда материальные потребности человека удовлетворены, начинается самое сложное - нужно, чтобы он хотел удовлетворять свои духовные потребности - в интеллектуальном или духовном развитии, в труде или любимом хобби - а не продолжал наращивать материальные. Мало того, человек ещё должен быть умён и адекватен - его духовные потребности должны приносить такому обществу пользу, а не вред. </div>
<div style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px; padding: 0px; text-align: -webkit-auto;">
<br style="font-size: 11px; line-height: 16px;" /></div>
<div style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px; padding: 0px; text-align: -webkit-auto;">
За развитие необходимых технологий традиционно отвечают технари "физики", за воспитание человека - гуманитарии "лирики".</div>
<div style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px; padding: 0px; text-align: -webkit-auto;">
<br style="font-size: 11px; line-height: 16px;" /></div>
<div style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px; padding: 0px; text-align: -webkit-auto;">
Что же мы видим?</div>
<div style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px; padding: 0px; text-align: -webkit-auto;">
<br style="font-size: 11px; line-height: 16px;" /></div>
<div style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px; padding: 0px; text-align: -webkit-auto;">
Технари со своей задачей справились на "отлично". Беднейший член современного цивилизованного общества живёт на уровне дворянина 17-18 веков, или любого правителя государства 1000-1500 лет назад. Один работник сельского хозяйства сейчас может кормить 100 человек, у которых, соответственно, есть время на что-то ещё. В принципе, чтобы обеспечить человечество всем необходимым, достаточно, чтобы работало около 15% населения земли. Всё, что сверху - это или излишества, наподобие меняемых раз в полгода коммуникаторов, или бесполезные накладные расходы капиталистического общества - реклама, маркетинг, конкурентная борьба, промышленный шпионаж и защита от него и тому подобное. И даже при этом жутком перерасходе на планете в целом сейчас всего работает около 60% трудоспособного населения. У всех есть образование, у всех есть медицина, о которой два века назад не смели мечтать правители государств. У всех есть доступ ко всему интеллектуальному наследию человечества, и стоит он в цивилизованной части планеты невероятно дёшево. Если кто-то хочет дать мне ссылку на голодных детей в Африке, не трудитесь - я уточню. Говоря "у всех есть", я имею в виду "у всех может быть". Если сейчас по-шариковски всё отнять и поделить, то у 9 из 10 человек станет гораздо больше чем было, и у 10 из 10 - будет намного больше, чем необходимо для жизни.</div>
<div style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px; padding: 0px; text-align: -webkit-auto;">
<br style="font-size: 11px; line-height: 16px;" /></div>
<div style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px; padding: 0px; text-align: -webkit-auto;">
Итак, технари справились.</div>
<div style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px; padding: 0px; text-align: -webkit-auto;">
<br style="font-size: 11px; line-height: 16px;" /></div>
<div style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px; padding: 0px; text-align: -webkit-auto;">
А вот гуманитарии облажались. Человечество всё ещё несчастно. Недавно ехал из Мариуполя на новеньком электропоезде "Шкода". Красота - на улице +38, внутри +23, мягкие сидения и фильмы в дороге, полтора часа на 126 километров пути. Мой попутчик всю дорогу возмущался тем, что ему стыдно за свою страну и всё у нас через анальное отверстие. Ну вот, например, Wi-Fi не работает. Как жить? Дорогие читатели, как жить, если в пригородной электричке с работающим кондицинером и чистыми удобными вагонами не работает вай-фай?</div>
<div style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px; padding: 0px; text-align: -webkit-auto;">
<br style="font-size: 11px; line-height: 16px;" /></div>
<div style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px; padding: 0px; text-align: -webkit-auto;">
Человек несчастен, когда у него меньше, чем у кого-то ещё. Заметьте, не когда у него мало, а когда у него меньше. Человек не хочет знать, как устроен мир. Человек не хочет становится лучше. Человек ждёт, когда мир вокруг него станет идеальным, причём, идеальным лично для него.</div>
<div style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px; padding: 0px; text-align: -webkit-auto;">
<br style="font-size: 11px; line-height: 16px;" /></div>
<div style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px; padding: 0px; text-align: -webkit-auto;">
При входе на вокзал меня поймал проводник этого поезда. В чистой, новенькой форме. Получивший возможность ехать не три часа в жаре, а полтора - с кондиционером. И предложил поехать зайцем. Цитирую "а то эти скоты совсем отобрали возможность заработать". И эта близорукость тоже никого не удивляет.</div>
<div style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px; padding: 0px; text-align: -webkit-auto;">
<br style="font-size: 11px; line-height: 16px;" /></div>
<div style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px; padding: 0px; text-align: -webkit-auto;">
Так вот - похоже, что свою часть гуманитарии бездарно провалили. Новый мир готов сделать человека счастливым, но человек не готов им стать. Все эти писатели, поэты, музыканты, воспитатели, проповедники, философы, экономисты - они просрали наше счастье. Потому что инструменты для того, чтобы быть счастливыми есть, но применить их нельзя из-за человеческого фактора.</div>
<div style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px; padding: 0px; text-align: -webkit-auto;">
<br style="font-size: 11px; line-height: 16px;" /></div>
<div style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px; padding: 0px; text-align: -webkit-auto;">
Поневоле приходишь к выводу, что подавляющая часть гуманитариев настолько бездарна, что им нельзя доверить даже гуманитарные науки. И поэтому, по всей видимости, за них тоже придётся взяться нам - технарям. И попытаться-таки построить то самое справедливое общество.</div>
<div style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px; padding: 0px; text-align: -webkit-auto;">
<br style="font-size: 11px; line-height: 16px;" /></div>
<div style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px; padding: 0px; text-align: -webkit-auto;">
Какие бы выводы из этого могли сделать гуманитарии? Да перестать относиться столь высокомерно к точным наукам и столь восторженно - к своим духовным. Сейчас в обществе возникла какая-то идиотская ситуация, что вот если мой собеседник не знает, зачем нужен диодный мостик или почему лёд не тонет в воде, или что такое полный дифференциал - это нормально, просто у него гуманитарный склад ума. А вот если я не читал Сэллинджера или Гумилёва - я бездуховен и безнадёжен и со мной не о чем поговорить. Друзья! Наши точные науки дают не менее точный результат. Мы выполнили свою часть работы и продолжаем её выполнять. А ваши 1000+ экономических теорий породили нищету при выброшенных миллиардах на рекламу, ваши миллионы философских школ и вдохновенных проповедей - миллиарды вечно недовольных вороватых людишек. Может быть, что-то не так с вашим подходом? Подойдите, поучитесь у нас. На стыке гуманитарных и точных наук тоже возникают работающие вещи - глобальные поисковые системы, базы знаний, машинный перевод и даже такие маленькие чудеса, как Siri.</div>
<div style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px; padding: 0px; text-align: -webkit-auto;">
<br style="font-size: 11px; line-height: 16px;" /></div>
<div style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px; padding: 0px; text-align: -webkit-auto;">
Какие выводы из этого могут сделать технари? Не надо отстраняться от обществознания, или им так и будут заниматься гуманитарии. Сейчас плоды точных наук уже могут влиять на общество. Прямая демократия, социальные сети, программное обепечение с открытым исходным кодом - всё это плоды технологий, но имеет прямое отношение к организации справедливого общества. "Рая на земле". Да, изучать звёзды, числа, абстрации, элементарные частицы, программирование гораздо приятнее, чем людей. Но без нас никак.</div>
<div style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px; padding: 0px; text-align: -webkit-auto;">
<br style="font-size: 11px; line-height: 16px;" /></div>
<div style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11.333333015441895px; line-height: 16px; padding: 0px; text-align: -webkit-auto;">
Начну-ка я с того, что стану на работе внимательнее к людям и организации их работы. Я ведь почти менеджер.</div>
</div>
Anonymoushttp://www.blogger.com/profile/17152157727140681943noreply@blogger.com0tag:blogger.com,1999:blog-6138770299473511818.post-90909396507010010312010-11-20T15:54:00.000+02:002010-11-20T15:56:40.298+02:00Юта - колыбель МЛМ: Доходы и налоги<span class="Apple-style-span" style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; color: rgb(51, 51, 51); line-height: 16px; "><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; "><strong>Текст не мой.</strong></p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; "><strong><br /></strong></p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; "><strong>TAX PREPARERS</strong></p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; ">Кто такие "TAX PREPARERS"? Ничего сложного. Это бухгалтеры, которые помогают людям готовить налоговые декларации. Их называют ещё "составителями налоговых деклараций". В Шататах эта профессия очень ценится, так как налоговое законодательство там очень строгое, и обман государства может стоить человеку не только огромных материальных убытков, но даже тюремного заключения. Я уже не говорю о бизнес-репутации.</p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; "> </p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; ">А кто такие "UTAH TAX PREPARERS"? Правильно! - Это те же самые бухгалтеры, но работающие в Юте. Жители штата обращаются к ним за помощью в подготовке своих налоговых деклараций. Составители налоговых деклараций в Юте ценятся не меноше, чем в други штатах.</p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; "> </p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; ">Почему нас заинтересовали именно они? Отвечу: Юта с недавних пор считается "колыбелью" МЛМ бизнеса. А для нас - Юта ещё и штат, где находится Главное Управление нашей Церковью, где стоит главный храм Церкви, где живут современные пророки и апостолы... В общем, очень хорошее место, место, которое мы любим и ценим, хотя прекрасно понимаем, что там не одни только члены Церкви живут. Не знаю, как у вас, а у меня к штату Юра очень тёплые чувства. Оттуда почти все миссионеры приехали. А миссионер - это человек, который через проповедь Евангелия способен дать толчёк таким подвижкам в жизни человека, которые меняют её коренным образом, меняют к лучшему. У подавляющего большинства членов Церкви самые тёплые чувства к миссионерам, к их семьям, к наследию, которым они делились с нами. В целом, это очень уважаемые люди. И место, где они живут, тоже вызывает особое внутреннее восприятие. Но весь этот абзац - лишь лирическое отступление, и пора вернуться к делу.</p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; "> </p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; "><strong>СОСТАВИТЕЛИ НАЛОГОВЫХ ДЕКЛАРАЦИЙ ЗНАЮТ О ДОХОДАХ СВОИХ КЛИЕНТОВ</strong></p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; ">По-моему, это очевидно, что люди подают в налоговую точные сведения о своих налогах. Вполне может случиться, что в каких-то других штатах могут попастся нечестные люди, рискующие своей репутацией и свободой в попытках обмануть государство и скрыть от него реальные размеры своих доходов. Но не в Юте - нет! Это же "самый мормонский" штат! Там живёт так много членов Церкви, что нечистых на руку бизнесменов там быть не может (по крайней мере, это следует из огромного кредита доверия, который наши местные святые готовы дать любой бизнес-схеме из этой местности)!</p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; "> </p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; ">Как же обстоит дело с компаниями МЛМ в США и в штате Юта, в частности?</p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; "> </p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; "><strong>ФЕДЕРАЛЬНЫЙ УРОВЕНЬ</strong></p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; ">Следует сказать, что в Штатах любые МЛМ схемы сразу вызывают пристальное внимание властей, включая Федеральную Торговую Комиссию (ФТК), налоговую администрацию и массу обществ по защите прав потребителей. Поскольку большинство МЛМ-компаний на поверку оказывалось мошенническими, хищническими, направленными на обогащение небольшой группы людей, находящихся на вершине пирамиды, и приносящими убытки всем остальным вовлечённым в аферу людям, некоторые штаты просто запретили законодательно создание и деятельность таких организаций на своей территории. Другие штаты, защищая своих граждан, очень серьёзно ограничивают и тщательно контролируют деятельность МЛМ-организаций. Например, продукцию пирамиды разрешается продавать только для 30% своих же дистрибуторов (если больше - это товарная пирамида, а не прямые продажи), запрещается брать взносы за вступление (если берут - это признак бестоварной пирамиды) или не позволяют получать больше дивидендов от вербовки, чем от продажи (иначе - это рекрутинговая пирамида) и многое другое. В общем, каждый штат по-своему пытается защищать своих граждан от нечистых на руку дельцов.</p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; "> </p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; "><strong>ШТАТ ЮТА</strong></p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; ">Здесь можно увидеть высокую концентрацию основанных в Юте МЛМ (из знаменитых можно назвать Nu Skin и Usana, например). Может быть мормоны любят заниматься МЛМ, и это выгодно? Нет, причина в другом: определённые "ДЫРЫ" В ЗАКОНОДАТЕЛЬСТВЕ штата привели к тому, что Юта стала излюбленным местом для создания подобного рода пирамид. В других штатах основателям МЛМ компаний пришлось бы туговато с этим делом.</p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; "> </p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; "></p><div class="photo photo_center" style="padding-top: 0px; padding-right: 0px; padding-bottom: 10px; padding-left: 0px; clear: both; text-align: center; "><div class="photo_img" style="margin-top: 0px; margin-right: auto; margin-bottom: 0px; margin-left: auto; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; text-align: center; width: 180px; "><img class="img" src="http://photos-a.ak.fbcdn.net/hphotos-ak-snc4/hs984.snc4/75702_1615980073228_1048123890_1743514_6332651_a.jpg" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; " /></div></div><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; "></p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; "> </p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; ">Округ Юта, в частности, это просто центр деятельности МЛМ. Согласно переписи населения 2002 года, там проживало 398 тысяч 56 человек, и, в то же время, там действовало 11 компаний МЛМ, то есть одна МЛМ на 33503 человека – значительно больше по плотности количество МЛМ на душу населения, чем в любом другом округе по всей стране! Где ещё можно найти лучшее место для изучения МЛМ, чем в Юте? Опросы показали, что в любой момент времени можно найти довольно устойчивое количество (5-6%) семей из Юты, которые участвуют в роли дистрибуторов в какой-либо МЛМ компании. И примерно одна пятая (21%) когда-либо в своей жизни участвовала в МЛМ. [ОБНОВЛЁННАЯ СТАТИСТИКА: На 1 июля 2009 года уже 25 активных структур MLM действовали в одном только округе Юта.]</p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; "> </p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; "><strong>МЛМ - БИЗНЕС БЕЗ ПОКУПАТЕЛЕЙ</strong></p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; ">Большинство МЛМ заявляют, что занимаются "прямыми продажами", но это только притворство. Промоутеры МЛМ навязывают свои программы под видом "прямых продаж", являющихся альтернативой розничной торговле, но лишь для того, чтобы избежать преследования со стороны (ФТК) и инспекторами штата за ведение пирамидных схем (см. правило ФТК). Тем не менее, если эти МЛМ компании действительно занимаются прямыми продажами, то можно было бы ожидать, что жители Юты засыпаемы предложениями торговцев, продающих товары таких МЛМ из Юты, как Nu Skin и Usana. Но этого ведь НЕ ПРОИСХОДИТ.</p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; "> </p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; ">Недавний опрос, который мы провели в округе Юта, где концентрация МЛМ самая большая, показал, что за прошлый год только к одной из 15 семей (то есть к 6.9% от общего числа) подходили представители МЛМ, предлагая свою продукцию (представители рекрутинговых МЛМ), но не продавали "возможность", связанную с продажами (обычно на "собраниях возможностей"). И только 1.1% что-то купили у МЛМ компаний.</p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; "> </p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; ">За тот же период 56% семей в округе Юта были сделаны предложения поучаствовать в МЛМ "возможности", и 4.6%, в конце концов, присоединились. Пропорция четыре "дистрибутора" к одному: это говорит о том, что МЛМ ищут новых "дистрибуторов" на рынке, а не занимаются прямыми продажами (хотя только их можно признать законными).</p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; "> </p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; ">В документах ФТК определение легальной МЛМ включает в себя правило, которое позволяет не более 30% продаж собственным "дистрибуторам". Вряд ли это возможно в округе Юта, потому что вербуемых "дистрибуторов" В ЧЕТЫРЕ РАЗА БОЛЬШЕ, чем найденных реальных покупателей. В своих последних финансовых заявлениях для Комиссии по Ценным Бумагам США (КЦБ), компания Usana признаёт, что "индивидуальные покупатели" составили всего 15% её розничных прямых продаж. Основываясь на этом отчёте, беспристрастный наблюдатель поймёт, что имеется всего несколько реальных покупателей вне группы рекрутов, инвестирующих в "возможность".</p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; "> </p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; ">Эти находки поднимают несколько важных вопросов:</p><ul style="list-style-type: square; margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 25px; "><li>В каком бизнесе нет покупателей? (только у МЛМ, которые делают вид, что занимаются "прямыми продажами")</li><li>Кто являются покупателями продукции, которая по отчётам о доходах МЛМ компаний из округа Юта составляет миллиарды? (живущие за пределами округа Юта, где обитают многие TOPPы, покупателями которых являются их же "дистрибуторы").</li><li>Если прямых продаж нет, тогда кто делает деньги на этих предполагаемых продажах? (те самые TOPPы - находящиеся на вершине основатели компании и её приближённые сотрудники).</li></ul><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; "><strong>У КОГО ЕСТЬ ИНФОРМАЦИЯ? У СОСТАВИТЕЛЕЙ НАЛОГОВЫХ ДЕКЛАРАЦИЙ!</strong></p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; ">Многие отмечают непрекращающиеся доходы, о которых рассказывают клиенты МЛМ. Один из менеджеров компании <strong>H&R Block</strong> из северной Юты (компания занимается подготовкой налоговых декларацийдля своих клиентов) рассказал мне, что за последние 25 лет ни он, ни его сотрудники не смогли указать ни одного клиента, который бы заявил о какой-либо значительной прибыли от участия в МЛМ! А делают они по 12 тысяч деклараций в год! (Был один человек, заявивший о большом доходе в один год, но ставший банкротом в следующем.)</p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; "> </p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; ">Другой бухгалтер поделился информацией с семинара, на котором проходил тренинг составителей налоговых деклараций со всей страны. Тема о МЛМ часто возникала в связи с "убытками на хобби", и все пришли к выводу, что крайне редко можно наблюдать выгоду от участия в МЛМ. Другой разработчик программы по налогам, работающий с тысячами составителей налоговых деклараций по всей стране, рассказывал, что опросил около 100 из них на предмет: слышали ли они когда-нибудь о прибылях от участимя в МЛМ программах? Оказалось, ни один из них не встречался с таким. А ведь это данные из более чем миллиона налоговых деклараций.</p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; "> </p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; ">Чтобы подтвердить такое положение вещей, я прошёл телефонный опрос среди тех, кто знали бы, если бы можно было заработать на МЛМ: среди людей, которые составляют налоговые декларации для населения, где участников МЛМ больше всего – в Юте. То, что удалось узнать, подтвердило всё то, о чём мы подозревали в течение многих лет, но что не могли объективно доказать из-за отсутствия информации (за исключением десятка программ, типа Nu Skin, Amway и Melaleuca, по которым у нас уже была собрана хорошая статистика). Лишь немногие TOPPы обогащаются за счёт массы низлежащих рекрутов, инвестирующих в продукцию, чтобы участвовать в МЛМ программе, и введённых в заблуждение по поводу ожидающегося потенциала прибыли.</p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; "> </p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; ">Не так легко было разговорить составителей налоговых деклараций и получить искомую информацию. Поскольку разглашение налоговыми профессионалами конфиденциальной информации о клиенте считается неэтичным, мне пришлось зайти с другой стороны. Я начинал с того, что делился общей информацией, полученной от других профессионалов. Я уверил их, что даже не думаю спрашивать о данных про конкретного клиента, но хочу лишь узнать, не стыкуется ли их личный опыт с тем, что я узнал от их коллег. Большинство из них уже наблюдали то же самое: что практически никто не мог заявить о прибылях от участия в МЛМ. Они не смогли вспомнить о ком-либо, кто когда-либо заявлят о значительном доходе от МЛМ (за исключением округа Юта, о чём мы расскажем позже). Когда я подошёл с этой стороны, то оказалось, что только один составитель налоговых деклараций из округа Юта отказался сотрудничать.</p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; "> </p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; "><strong>ТРИ ОКРУГА В ШТАТЕ ЮТА: ТЫСЯЧИ УЧАСТНИКОВ МЛМ, И НИ ОДНОГО ЗАРАБОТАВШЕГО НА ЭТОМ</strong></p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; ">Удалось определить три округа в штате Юта, где нет базирующихся там МЛМ компаний и где менее всего любят жить TOPPы (top-of-the-pyramid promoters) МЛМ. Вот эти округа: Туэле, Уинта и Гранд – к западу и востоку от округа Юта.</p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; "> </p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; ">Я поговорил со всеми составителями налоговых деклараций (включая и сертифицированных общественных бухгалтеров или СОБ) этих малонаселённых округов, которым смог дозвониться (общее население - 80 тыся 660 человек). Всего 33 человека, обслуживших, в целом, около 14400 клиентов в 2002 году. За всё время своей карьеры они подготовили более 300 тысяч налоговых деклараций. Хотя многие из их клиентов время от времени участвовали в МЛМ, эти составители деклараций не смогли вспомнить НИ ОДНОГО КЛИЕНТА, заявлявшего о значительных прибылях за время более-менее продолжительного периода участия в МЛМ. Хотя нашлись два клиента, которые заявляли о небольшой прибыли от МЛМ рекрутинга несколько лет назад, но оба через два года бросили этот "бизнес". Это врядли можно назвать "постоянный доход на всю жизнь", о котором рассказывают TOPPы на своих собраниях МЛМ возможностей.</p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; "> </p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; "><strong>ПРИБЫЛИ В ОКРУГЕ ЮТА: TOPPЫ (ЧИНОВНИКИ И ОСНОВАТЕЛИ МЛМ)</strong></p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; ">Затем я позвонил составителям налоговых деклараций в округе Юта, так как подозревал, что большинство TOPPов могут жить вблизи штабквартир своих МЛМ компаний (наблюдалось, что самые первые участники МЛМ имели тенденцию селиться поблизости с головным офисом компании, считая, что это даст им преимущество в зарабатывании денег).</p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; "> </p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; ">Это было интересно. Для сравнения: я дозвонился 33-м СОБ, подготавливающих декларации в округе Юта (число, равное числу участников первого опроса). Бинго! Они как раз-то и смогли припомнить за время своей карьеры примерно 185 налоговых деклараций, в которых заялвялось о значительных прибылях TOPPов МЛМ. Только за последний год (когда воспоминания были самыми точными) эти 33 бухгалтера сообща вспомнили 38 клиентов, заявлявших о больших прибытках из различных МЛМ – в основном из компаний, базирующихся в округе Юта, таких как Nu Skin, Enrich (ныне Unicity), Morinda, Synergy и Neways.</p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; "> </p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; ">Отметьте, что другие составители налоговых деклараций (не СОБ) вспомнили ещё пятерых TOPPов, заявивших о больших доходах, что составило всего 43 человека в сравнении с 0 (нулём) заявивших о прибыли из других трёх округов. Нетрудно догадаться, что все 43 являются TOPPами, у которых хватает средств нанять СОБ и выдержать любое давление в случае аудита или судебного иска против них.</p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; "> </p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; ">Эти TOPPы зарабатывают львиную долю своих комиссионных от продажи огромной сети нижестоящих рекрутов, живущих вне штата. Некоторые из них получают чеки на суммы от десятков тысяч доллров до 1 миллиона в месяц! Иметь на вершине пирамиды нескольких богатых "дистрибуторов" - это критично для любой пирамидной схемы, поскольку они олицетворяют собой "успех", что, в свою очередь, помогает соблазнить новых людей присоединиться. Другие крупные игроки, облагодетельствованные этими МЛМ, это основатели компании и находящиеся наверху должностные лица компании, управляющие инфраструктурой.</p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; "> </p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; ">Хотя TOPPы учреждают штабквартиры своих компаний в округе Юта, откуда и начинают вербовку на низлежащие уровни, вскоре им приходится обнаруживать сопротивление местного населения "ещё одной МЛМ схеме". Так что им приходится разъезжать по другим регионам, где можно было бы найти "дистрибуторов" для продажи продукции "для построения бизнеса". Затем, когда открываются дополнительные территории для вербовки, те же TOPPы спешат стать первыми в построении нисходящей сети. А поскольку инвесторам приходится разъезжать повсюду, чтобы покрыть свои инвестиции, МЛМ схемы превращаются в итоге в СХЕМЫ ПОНЦИ.</p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; "> </p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; ">Итак, возвращаясь к уже сказанному, основу сообщающих о прибылях налоговых деклараций составляют бумаги TOPPов (top-of-the-pyramid promoters), проживающих в округе Юта. А это представляет лишь мизерную часть МЛМ "дистрибуторов" (менее 1% от общего числа). Остальные терпят убытки. Это поднимает ещё один интересный вопрос:</p><ul style="list-style-type: square; margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 25px; "><li>Какой тип бизнеса может иметь сотни тысяч "дистрибуторов", работающих ни за что, при том что почти все они терпят убытки? ОТВЕТ: основанные на продукте пирамидные схемы или "рекрутинговые МЛМ компании".</li></ul><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; "> </p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; "><strong>ВОСПРИЯТИЕ МЛМ СЕРТИФИЦИРОВАННЫМИ ОБЩЕСТВЕННЫМИ БУХГАЛТЕРАМИ</strong></p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; ">Что же думают СОБ из округа Юта о МЛМ?</p><ul style="list-style-type: square; margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 25px; "><li>"Как и любой другой бизнес. Не прилагаешь усилий, значит не преуспеешь"</li><li>"Проблема в том, что большинство подписывающихся людей ожидает денег, но не знает, как продавать, или не работает на систему"</li><li>"Нужно работать на неё и быть терпеливым. Если работать дольше, то и прибыль пойдёт"</li></ul><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; ">Регулярно обслуживая TOPPов в качестве клиентов, СОБ округа Юта не рассматривают МЛМ как аферу.</p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; "> </p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; ">Для контраста приведём мнение составителей налоговых деклараций и СОБ из других трёх округов штата, где никто из участников МЛМ не заявлял о прибылях (и где не базируются разные МЛМ):</p><ul style="list-style-type: square; margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 25px; "><li>"Деньги можно заработать только на вершине МЛМ"</li><li>"Я никогда не посоветовал бы кому-либо из своих друзей заняться МЛМ. Разве что ему нужно будет списать налоги"</li></ul><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; ">Некоторые из них ещё более критично настроены:</p><ul style="list-style-type: square; margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 25px; "><li>"Это афера"</li><li>"Это пирамидная схема"</li><li>"Это явное зло"</li></ul><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; ">Создаётся впечатление, что мы видим в МЛМ самую уникальную бизнес-модель: прибыльный бизнес без настоящих покупателей, где почти все "дистрибуторы" терпят убытки! Налоги же платить некому (кроме маленькой горстки реальных "бизнесменов" от МЛМ).</p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; "> </p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; "><strong>ЗАКЛЮЧЕНИЕ</strong></p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; ">Количество членов Церкви в Юте доходит до 60% и выше. Никто из них, если он не стоит на вершине пирамиды МЛМ (имею в виду тех, кто может входить в число тех 43-х счастливчиков), не заявляет о получении прибылей от занятий МЛМ. Странно, не так ли? Это можно объяснить тремя, лежащими на поверхности, способами:</p><ul style="list-style-type: square; margin-top: 10px; margin-right: 0px; margin-bottom: 10px; margin-left: 0px; padding-top: 0px; padding-right: 10px; padding-bottom: 0px; padding-left: 25px; "><li>Все члены Церкви почему-то забыли о своей приверженности нравственным и моральным принципам и решили скрывать от своего государства ОГРОМНЫЕ ПРИБЫЛИ, получаемые от участия в МЛМ программах. <em><span class=" fbUnderline" style="text-decoration: underline; ">На мой взгляд, зная верность членов Церкви Евангелию, это маловероятно.</span></em></li><li>Все члены Церкви, которым посчастливилось поучаствовать в МЛМ программах, не умеют и не хотят работать. Многолетние попытки TOPPов научить их ведению "бизнеса" не увенчались успехов, и все эти "лузеры" НИЧЕМУ НЕ НАУЧИЛИСЬ! Они так и не смогли заработать хоть какой-то значительный доход. <span class=" fbUnderline" style="text-decoration: underline; "><em>На мой взгляд, зная трудолюбие членов Церкви и целеустремлённость в работе, мотивированные учениями Евангелия, это ещё менее вероятно.</em></span></li><li>Члены Церкви попадаются на обманные трюки промоутеров МЛМ и пытаются изо всех сил работать в этом "бизнесе". Но обещанных баснословных прибылей, свободы времени и невероятных возможностей нет. Вся эта пирамида "бизнес-возможностей" - АФЕРА, ОБМАН, МОШЕННИЧЕСТВО. <em><span class=" fbUnderline" style="text-decoration: underline; ">А вот это больше похоже на правду, не так ли?</span></em></li></ul><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; ">У вас имеются другие объяснения?</p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; "><br /></p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; ">Автор: Александр "ldsfried" Сичкаренко.</p><p style="font-family: 'lucida grande', tahoma, verdana, arial, sans-serif; font-size: 11px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; line-height: 1.5em; ">Источник: <span class="Apple-style-span" style="color: rgb(0, 0, 0); font-family: Georgia, serif; line-height: normal; font-size: 16px; "><a href="http://www.facebook.com/note.php?note_id=467615319075&id=1048123890">http://www.facebook.com/note.php?note_id=467615319075&id=1048123890</a></span></p></span>Anonymoushttp://www.blogger.com/profile/17152157727140681943noreply@blogger.com0tag:blogger.com,1999:blog-6138770299473511818.post-26757867319690058582010-06-12T19:05:00.000+03:002010-06-12T21:59:35.265+03:00Les Trois Mousquetaires et d'Artagnan<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://upload.wikimedia.org/wikipedia/commons/d/dd/Dartagnan-musketeers.jpg"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 496px; height: 402px;" src="http://upload.wikimedia.org/wikipedia/commons/d/dd/Dartagnan-musketeers.jpg" border="0" alt="" /></a><div><br /></div>Недавно состоялся застольный разговор, в котором была задета тема "Трёх мушкетёров" Дюма, и, как это иногда бывает, какая-то область мозга продолжила эту тему обдумывать. Когда же курсор сознания забрёл в эту область, на свет всплыла поразившая меня мысль. Светлые, романтические образы, их благородство и честь, оказались погребены под этой мыслью, и, похоже, уже никогда не воскреснут. Степень моего расстройства сравнима с "Деда Мороза не существует".<div><br /></div><div><i>Disclaimer - наверняка, я с этой мыслью не первый.</i></div><div><br /></div><div>Так вот -<b> д'Арнаньян и его три друга были натуральными врагами французского народа</b>, и их вполне стоило судить за измену.</div><div><br /></div><div>Судите сами.</div><div><br /><object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/AXenRx9jXpw&hl=ru_RU&fs=1&"><param name="allowFullScreen" value="true"><param name="allowscriptaccess" value="always"><embed src="http://www.youtube.com/v/AXenRx9jXpw&hl=ru_RU&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object><br /></div><div style="text-align: right;"><i>Людовик мой - глупец, но не обманешь кардинала...</i></div><div style="text-align: right;"><span class="Apple-style-span" style="font-size:small;">О короле и кардинале устами умнейшей женщины французского двора.</span></div><div style="text-align: right;"><i>Испанка я, иль нет?</i></div><div style="text-align: right;"><span class="Apple-style-span" style="font-size:small;">Испанка. Точно вам говорю.</span></div><div><br /></div><div>В романтической истории с подвесками, исполненной благородного пафоса, они помогали королеве. Анне Австрийской. Та же, в свою очередь, активно работала против Франции в пользу Испании - чего только стоит её письмо своему брату. Помогали они ей, как ни странно, под лозунгом "Разве мы не слуги их величеств?", а на самом деле - устраивая личную жизнь д'Артаньяна. Насколько я понимаю, присягу при этом они приносили королю лично, а вовсе не королеве.</div><div><br /></div><div><br /><object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/yXStCCah19g&hl=ru_RU&fs=1&"><param name="allowFullScreen" value="true"><param name="allowscriptaccess" value="always"><embed src="http://www.youtube.com/v/yXStCCah19g&hl=ru_RU&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object><br /></div><div><br /></div><div>В ходе этой истории они, особенно д'Артаньян, тесно сдружились с политическим и военным руководителем враждебной страны. Но это можно было бы простить, в конце концов, мы, мужчины, создания странные, и вполне можем подружиться с врагом, если тот заслуживает нашего уважения. Если бы не то, во что эта дружба в итоге вылилась.</div><div><br /></div><div><br /><object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/XmxMSokdjM8&hl=ru_RU&fs=1&"><param name="allowFullScreen" value="true"><param name="allowscriptaccess" value="always"><embed src="http://www.youtube.com/v/XmxMSokdjM8&hl=ru_RU&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object><br /></div><div><span class="Apple-style-span" style=" -webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; font-family:Arial;font-size:13px;"><pre class="songkino" style=" font-style: normal; color: rgb(0, 0, 0); text-decoration: none; background-color: rgb(255, 255, 255); background-image: none; letter-spacing: normal; text-align: left; word-spacing: normal; font-family:Arial;font-size:10pt;"><div style="text-align: right;"><span class="Apple-style-span" style="font-family:Georgia, serif;"><span class="Apple-style-span" style=" white-space: normal; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px;"><i><span class="Apple-style-span" style="font-size:medium;">Британский флот и армия Британии нужны, </span></i></span></span></div><div style="text-align: right;"><span class="Apple-style-span" style="font-family:Georgia, serif;"><span class="Apple-style-span" style=" white-space: normal; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px;"><i><span class="Apple-style-span" style="font-size:medium;">Лишь для того нужны, лишь для того нужны, </span></i></span></span></div><div style="text-align: right;"><span class="Apple-style-span" style="font-family:Georgia, serif;"><span class="Apple-style-span" style=" white-space: normal; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px;"><i><span class="Apple-style-span" style="font-size:medium;">Чтоб я в любви добиться мог успеха.</span></i></span></span></div><div style="text-align: right;"><span class="Apple-style-span" style=" white-space: normal; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; font-family:Georgia, serif;"><span class="Apple-style-span" style="font-size:small;">Это ли достойное поведение правителя?</span></span></div><div style="text-align: left;"><span class="Apple-style-span" style=" white-space: normal; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; font-family:Georgia, serif;"><span class="Apple-style-span" style="font-size:medium;"><br /></span></span></div><div style="text-align: left;"><span class="Apple-style-span" style=" white-space: normal; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; font-family:Georgia, serif;"><span class="Apple-style-span" style="font-size:medium;">Лирическое отступление - а так ли достоин уважения положительный герой Бэкингема? Являясь de-facto, повторюсь, военным и политическим руководителем Британской империи, он всю - всю! - свою внешнюю политику выстраивает исходя не из национальных интересов, а из стремления заслужить одобрительную улыбку своей любимой. То есть, в конечном итоге, из интересов своего противника на политической арене - Испании. Я понимаю, что дам, вероятно, это восхищает, но что вообще можно хорошего сказать о таком политике? А если это политик вашей собственной страны? Да-да - "политику Британии решать теперь должны сердечные дела ее министра".</span></span></div></pre></span></div><div><object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/gkBrYyGQSmA&hl=ru_RU&fs=1&"><param name="allowFullScreen" value="true"><param name="allowscriptaccess" value="always"><embed src="http://www.youtube.com/v/gkBrYyGQSmA&hl=ru_RU&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object><br /></div><div><br /></div><div>Так вот, наши замечательные друзья, молодой гасконец и три его приятеля, состоящие на королевской службе, которым стоило бы защищать интересы Франции, уже начинают по-настоящему этим самым интересам вредить. А именно - из-за приязни к Бэкингему ("Герцог - хороший человек, он подарил нам замечательных коней" - "А главное - превосходные сёдла!") и неприязни - к миледи, встают на пути и едва не срывают операцию собственной разведки - той самой операции, на которую кардинал послал миледи. По существу - действуют против Франции в пользу Британской империи. В военное время, ага.</div><div><br /><object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/q4IARbK6iQ8&hl=ru_RU&fs=1&"><param name="allowFullScreen" value="true"><param name="allowscriptaccess" value="always"><embed src="http://www.youtube.com/v/q4IARbK6iQ8&hl=ru_RU&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object><br /></div><div><br /></div><div>Миледи же, в свою очередь, замечательный агент французской разведки. Штирлиц, просто. И несмотря на старания доблестных слуг короля Людовика, да несмотря вообще ни на что, задание с блеском выполняет, устраняя в одном лице сильного военного противника и агента влияния другого противника на политической арене. А главное - этим срывает вражеское вторжение, которое, скорее всего, оказалось бы успешным, и уж в любом случае повредило бы интересам Франции.</div><div><br /></div><div><b>Кардинал</b> же, один из главных отрицательных персонажей, <b>вообще единственный персонаж книги, который печётся не о собственных интересах, а о благе своей страны.</b> Причём искренне, с полной самоотдачей и очень успешно. </div><div><br /></div><div><object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/HTbmrFiTrA0&hl=ru_RU&fs=1&"><param name="allowFullScreen" value="true"><param name="allowscriptaccess" value="always"><embed src="http://www.youtube.com/v/HTbmrFiTrA0&hl=ru_RU&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object><br /></div><div><br /></div><div style="text-align: right;"><i>Я вам прошу измену королевству, но не прощу измену королю.</i></div><div style="text-align: right;"><span class="Apple-style-span" style="font-size:small;">Собственно, показатель состоятельности французского монарха, как руководителя.</span></div><div><br /></div><div>Ещё одно лирическое отступление: а вот Людовик, положа руку на сердце, правитель фиговый. Всё ему хихоньки да хаханьки, а уж стимулировать конфликты между вооружёнными силами своей же страны, да с летальными исходами - это ни в какие ворота не лезет. Да он за своей женой уследить не может - на кардинала полагается, куда уж тут править.</div><div><br /></div><div>Кстати, если копнуть глубже, то и в истории с подвесками ребята сорвали операцию родной разведки. Потому как, "в чужом белье копался Ришелье" не корысти ради, а в государственных интересах - подорвать доверие короля к Анне, и, соответственно, влияние Анны при дворе. Чтобы воспрепятствовать Анне проводить происпанскую политику во Франции. Снизить вред от этого агента влияния испанского престола в родной стране, от которого невозможно избавиться иными способами.</div><div><br /></div><div>Вообще говоря, Ришелье за 18 лет правления удалось сделать почти невозможное: одолеть всех врагов внутри страны и за ее пределами, укрепить монархию и создать условия для ее расцвета при «короле-солнце». Он сам говорил, что сделал из Франции умирающей Францию торжествующую.</div><div><br /></div><div>Ещё раз: кардинал - достойный и преданный национальным интересам Франции политик. Особенно он вызывает уважение на фоне впечатляющего раздолбайства положительных героев произведения. Сейчас бы в Украине таких политиков, побольше да повыше. </div><div><br /></div><div>Но зато положительные герои, безусловно, очень романтичны и благородны, и классно поют.</div><div><br /></div><div><object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/if6pNdh7U-M&hl=ru_RU&fs=1&"><param name="allowFullScreen" value="true"><param name="allowscriptaccess" value="always"><embed src="http://www.youtube.com/v/if6pNdh7U-M&hl=ru_RU&fs=1&" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object><br /></div>Anonymoushttp://www.blogger.com/profile/17152157727140681943noreply@blogger.com5