воскресенье, 10 февраля 2013 г.

Немного о толерантности


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

...Однажды к Мастеру Вану пришли трое его детей, и каждый желал странного.

- Отец, - жеманясь и краснея, сказал старший сын. - Мне кажется, я люблю мужчин больше, чем женщин. А среди мужчин я больше всех люблю Сунь Ахуя из соседней деревни. Он такой... такой!.. он как Бьякуи из "Блича"!.. Я понимаю, ты хотел видеть во мне опору в будущем, продолжателя рода и наследника своего мастерства, но... извини, я хочу иначе. Ничего, если я приведу в дом Сунь Ахуя, и мы будем спать в одной кровати и сидеть у огня, держась за руки?..

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

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

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

- Хорошо, - устало сказал он, - живите как хотите.

...Прошло десять лет. Дети жили как хотели, а Мастер Ван просто устал от всего этого.

Он пришел к соседу поделиться своим несчастьем и увидел, что Мастер Чжан сидит в беседке перед садом камней, пьет сливовое вино и курит свою любимую кривую трубочку.

- Как поживаешь, сосед? - спросил Мастер Ван. - Все ли в порядке? Что детишки?

Мастер Чжан неторопливо отпил из чашки и ответил:

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

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

Мастер Чжан степенно кивнул.

- Как же тебе удалось воспитать таких славных детей?!

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

Собственно, моя позиция полностью соответствует позиции мастера Чжана.

вторник, 29 января 2013 г.

Лямбды, блоки, замыкания


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


Лямбды, блоки, замыкания.







То, что было для меня лично наибольшим открытием в Руби - это блоки. Я до этого мало писал в Джаваскрипте и много - на Джаве, и удобство конструкций вида select, reject, inject, map, то, как они меняют способ думать о коде и решаемой задаче буквально покорило меня. Функции высшего порядка теперь неотъемлемая часть нашего арсенала и без них настолько неуютно, что язык, который их не поддерживает в буквальном смысле неполноценен.

Однако же, идея блоков кода или функций высокого порядка далеко не нова. Концепт блоков и замыканий появился через несколько лет после того, как Джон Маккарти написал первую версию языка Лисп. Позднее, он был взят на вооружение Сассманом и Стилем, когда они создавали диалект Лиспа, который называется “Схема”.




Внутри Руби представляет блоки как структуры С типа rb_block_t. Что же такое блоки? Давайте заглянем в описание этой структуры - это может пролить свет. 




Во-первых, очевидно там должен лежать кусок Руби кода или набор скопмилированных инструкций байт-кода YARV.

В примере, когда мы отдаём блок в метод times объекта 10, метод должен знать, какой код исполнять.



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

Вот, посмотрите - метод puts обращается не только к локальной переменной из своей области видимости (str), но и к локальной переменной за пределами своей области видимости (str_ext). Мы тут все принимаем это как должное. Это вообще одна из главных фич блоков, которые и делают их полезными.

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

Так как же это работает?






В самой первой статье из цикла Lambda Papers, статье, с которой в мир программирования вошла Схема, Сассман и Стиль вводят понятие замыкания, как структуры, содержащей лямбда-выражение, и окружение, которое будет использовано, когда это выражение будет применено к аргументам.

Эта самая идея и взята на вооружение в Руби.





В нашем примере, при выполнении первой строки кода YARV сохранит локальную переменную str_ext в свой внутренний стек и сохранит её расположение в указателе EP (environment pointer), расположенном в структуре rb_control_frame_t.



Дальше идёт вызов “10.times do”. Поскольку порядок вычислений в Руби аппликативный, сначала вычислятся аргументы метода times, в нашем случае - блок. Руби создаст и проинициализирует новую структуру rb_block_t. В структуре кроме уже обсуждённого iseq есть свой указатель на окружение (EP), который показывает на текущий кадр стека. То есть, в блоке сохранён указатель на кадр стека, в котором создан блок.



Потом происходит вызов метода times на объекте 10. Создаётся новый кадр в стеке YARV. Метод Fixnum#times написан на С, но ход выполнения такой же, какой был бы, если бы метод был написан на Руби - перебираются числа от нуля до девяти и с каждым из этих чисел в качестве аргумента вызывается yield блока. Код, который выполняет yield блока, для того, чтобы выполнить инструкции, скомпилированные в iseq создаёт третий кадр в стеке YARV (там есть ещё один кадр в стеке непосредственно перед вызовом блока, но это не поможет нам сейчас рассуждать о замыканиях).





Итак мы видим три кадра стека:

  1. Кадр блока, содержит переменную str.
  2. Кадр Fixnum#times.
  3. Кадр верхнего уровня содержит переменную str_ext.

В процессе создания кадра стека для блока Руби копирует EP из блока в новый кадр стека. Теперь код внутри стека имеет доступ и к своим локальным переменным через rb_control_frame, и к переменным родительского кадра стека через EP с помощью динамического доступа к переменным. В нашем случае это помогает коду в блоке достать переменную str_ext.


Вот код, который обеспечивает динамический доступ к переменным. Макрос GET_EP возвращает EP текущей области видимости. Потом Руби перебирает все EP, передвигаясь от текущей области видимости к родительской и так далее. Для этого используется макрос GET_PREV_EP, который переходит к родительской области видимости. И вот EP кадра стека, в котором непосредственно исполняется код блока, указывает в качестве родительского на кадр, в котором объявлена переменная str_ext.

Помните? Замыкание - это структура, состоящая из лямбда-выражения, т.е., функции и окружения, которое будет использовано в момент вызова лямбды или функции.




Рубишный блок соответствует этому определению - вот функция (iseq), а вот указатель на окружение. Там ещё есть self, это очень важная часть замыкания, как мы увидим позже, и proc, используемый внутри для преобразования блока в proc, когда нужно.

Сравните определение с rb_control_frame_t. С self до proc они совпадают. Помните, когда блок только создаётся, в него копируется часть переменных, описывающих текущее окружение, в частности EP. Так вот, на самом деле Руби ничего не копирует. а вместо этого выставляет указатель прямо в середину структуры rb_control_frame_t. Подобная утиная типизация выглядит немного странно, но без неё создание блоков тормозило бы гораздо ощутимее - мы избегаем лишних операций malloc.




И без того все эти игрища с блоками ощутимо медленнее прямого влобного программирования. Только не вздумайте на основании этого писать без блоков! Мы с вами как Rails программисты чаще грешим лишними запросами в базу, бездумным пользованием ORM и прочими ужасными вещами на макроуровне. Никакие микрооптимизации не сделают пузырьковую сортировку быстрой.



Давайте взглянем на другой кусок кода. Здесь с первого взгляда тоже блок, но не совсем. В функции get_helloer я с помощью ключевого слова lambda создаю и возвращаю некий блок кода - то, что обычно называют функцией высшего порядка или функции как граждане первого класса, сохраняю его в переменную и затем вызываю. С помощью ключевого слова lambda и, как обычно в Руби, ещё пары способов, блок можно превратить в такую сущность, которую можно возвращать как результат и передавать как аргумент. Лирическое отступление - почему лямбда?



В 1930-х годах Алонзо Чёрч ввёл лямбда-нотацию в своём исследовании "Лямбда-исчисление"

Лисперы привыкли к слову лябмда для создания анонимных функций, однако, не в Лиспе это придумано. Этот термин пришёл из труда Алонзо Чёрча “Лямбда-исчисление”, написанного в 1930-х. На этот труд ссылаются как Маккарти в своём историческом “Рекурсивные функции над символьными выражениями и их машинное вычисление” 1960-го, с которого берёт начало Лисп, и Сассман и Стиль в своей исторической статье “Схема: интерпретатор для продвинутого лямбда-исчисления” 1975-го, с которого берёт начало Схема.

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






Что там, внутри лямбды?




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

Итак, почему же в нашем коде сборщик мусора не съедает str_ext?






При создании лямбды, Руби создаёт копию кадра стека в куче! Теперь там есть ссылка на str_ext и переменной ничего не угрожает. Кроме этого, создаётся ещё два объекта:

  1. rb_ent_t - это обёртка для копии стека в куче и
  2. rb_proc_t - это наша лямбда.

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

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





Теперь видно, что когда мы вернёмся из функции, переменная str_ext уцелеет, потому что мы возвращаем лямбду, указатель на которую лежит в стеке. Лямбда, в свою очередь, ссылается на rb_env_t, которая среди всего прочего ссылается на str_ext.

Наконец, мы вызываем лямбду.





Единственная разница здесь с блоком в том, что родителем EP указана структура rb_env_t в куче.

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

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




Посмотрите на этот код и скажите, что он, по-вашему выведет.

Конечно же, он выведет “Goodbye there!”

Как так? Ну, я забыл рассказать кое-то ещё. Руби не только копирует кадр стека в кучу, но ещё и выставляет EP структуры rb_control_frame_t на только что созданную копию.





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

Интересным последствием этого факта является то, что две (или больше) лябмд в пределах одного метода работаю с одним и тем же кадром стека, даже после завершения работы метода.

Это даёт интересную с академической точки зрения возможность навертеть своё ООП.



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

Посмотрите на этот код - здесь три лямбды замкнуты на одну и ту же переменную.

Зачем же нам нужны блоки, если хватает лямбд? Производительность.



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

Вот разница того, что происходит в этих кусках кода:





Это "декомпилированные" функции из бенчмарка. Слева yield, справа &block.

Видно, что для вызова yield достаточно низкоуровневой инструкции "invokeblock". А вот второй вариант вынужден создавать объект и посылать ему сообщение "call". Понятно откуда накладные расходы. Тут и диспетчеризация и нагрузка на GC и чёрт знает что ещё. Дело в том, что интерпретатор не в состоянии предсказать, что произойдёт с блоком и вынужден отбросить оптимизации. Из блока строится Proc.

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

В конце вкратце коснусь JRuby и Rubinius.






JRuby не использует стек JVM тем способом, которым MRI использует стек YARV. Эквивалента EP в JRuby тоже нет. Вместо этого используется набор Java классов, и в особенности DynamicScope. Когда вы ссылаетесь на переменную не из своего окна, то есть, пользуетесь замыканием, JRuby сохраняет переменные, на которые вы сослались, в DynamicScope (на самом деле, в одном из его подклассов). Позже, когда JRuby выполняет блок, он создаёт новый объект DynamicScope, который ссылается на “родительский”. Каждый DynamicScope содержит ссылку на включающий его scope - так в JRuby реализован динамический доступ к переменным.




Рубиниус удивительно похож в этом на JRuby. Видимо, дело в том, что и тот и другой реализован на объектно-ориентированном языке.

четверг, 29 ноября 2012 г.

Садок вишневий коло хати

Спитай себе, дитино, хто ти є,
І в серці обізветься рідна мова;
І в голосі яснім ім’я твоє
Просяє, наче зірка світанкова.
Д. Павличко.

Є в моїй вірі доктріна, яку я розумію не повністю. Це реакція Господа на побудову Вавілонської башти. Він не лише не дав її збудувати, але й покарав усе людство на віки вічні. И досі в нашому побуті мі посвякдень бачимо наслідки тої кари.

Тому що з того дня на чолі Землі почали з'явлюватися різні мови. У багатьох людей сьогодення через мовний бар'єр немає доступу до необхідної їм профессійної чі религійної інформації. Є суцільна професія - перекладач. Величезна кількість зусиль людства витрачається на підтримку цієї безлічі мов. Різні алфавіти. Різні кодировки. 

Звісно я розумію, що через це Господь являє дива, вчіть терпінню, ввічлівості та сумірності. Також само, як він це робить через войни або хвороби.

Проте я навіть не впевнен, що через мову ви ще не припинили мене читати. 


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

Во-первых, то, на чём сейчас говорят на западной Украине, это не язык Шевченко, а какой-то чудовищный новояз. Дичайшая смесь украинского с польским и немецким, причём, заимствования идут по следующему принципу - заменить слова, похожие на русские, на слова, непохожие на русские. Зачем заменять украинское слово "кладовыще" немецким "цвынтарем"? Что такое этот ваш "этер"? Кто такой "милициянт"?

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

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

Каких современных украинских писателей или поэтов я должен захотеть прочитать в оригинале? Какой последний украинский фильм я должен захотеть посмотреть? Какие новые хорошие песни на украинском вы хотите предложить мне послушать?

Украинский язык имеет слишком узкую область применимости. За пределами Украины на нём говорит около 15 миллионов человек. Русский же язык недавно обошёл испанский и сейчас является третьим в мире языком по распространённости. На русском говорят более 150 миллионов человек за пределами Росии. На нём появляется новый контент. Много и в самых разных областях и отраслях. Это язык фундаментальной науки и великой культуры.

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

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

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

Дайте русскому языку статус второго официального, и украинский язык сам, естественным образом, низведётся до статуса регионального. Сейчас, при капитализме и рыночной экономике ведь этот путь более правильный? Раз что-то не выдерживает конкуренции, значит, оно неэффективное, правда же?


четверг, 22 ноября 2012 г.

Миссия выполнена

Миссия завершена: "Папаша".

Основные задания: 
- продержаться до прихода подкрепления: 62 часа из 62 (выполнено)
- ребёнок должен выжить (выполнено)
- папа должен выжить (выполнено)
- не менее 50% квартиры должно уцелеть: 75% из 100% (выполнено)
- не более 50% одежды ребёнка должно быть использовано: 25% (выполнено)

Дополнительные задания:
- кошка должна выжить (выполнено)
- использовать соску не более 6 раз, не считая сна: 0 раз из 6 (выполнено)
- гулять не менее 1 часа в первый день: 2 часа из 1 (выполнено)
- гулять не менее 1 часа во второй день: 2,5 часа из 1 (выполнено)
- уложить ребёнка спать днём вовремя в первый день (выполнено)
- уложить ребёнка спать днём вовремя во второй день (выполнено)
- папа должен выспаться в последнюю ночь: 5 часов из 8 (провалено)
- накормить ребёнка кашей в первый день (провалено)
- накормить ребёнка кашей во второй день (провалено)

Уровневые перки:
- "Сто шуб". Умение одевать ребёнка в зимнюю одежду (выучено)
- "Не отвертишься". Умение настоять на шапке (выучено)
- "Кашевар". Умение варить съедобную кашу (заблокировано)
- "Папа мой". +50% к репутации папы у ребёнка (выучено)

Бонусные перки:
- "Папа может!". +100% морали на все последующие задания из серии "Один в поле".
- "Сила дракона". +10 к силе на 15 минут при подъёме ребёнка на улице, если ребёнок переносится на своих плечах. Можно использовать дважды за прогулку.
- "Как на праздник". +10 к скорости при уходе на работу в следующие 5 дней.

вторник, 20 ноября 2012 г.

Миссия невыполнима 2: Папа может всё, что угодно

Это вторая статья из цикла "Миссия невыполнима". Начало здесь.

Коротко ознакомившись с утренней прессой и сделав лёгкую зарядку (пробежав 10 кругов по комнате) Таня заказала завтрак.

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

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

Неожиданно, лицо её прояснилось. Было очевидно, что это озарение. "Папа," – решительно сказал ребёнок, – "я придумала, как нам быть. Давай в нашей семье готовить будет мама."

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

Вы можете себе представить, какая буря поднялась в моей душе. Ведь ребёнка надо же накормить! Мама всегда делала это! Мама...

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

Уж всяко не заставлять съесть эту кашу. Да я бы и сам её не ел ни за что. Зачем есть эту ужасную субстанцию, когда в доме есть материал для кучи вкусных, ароматных, хрустящих тостов, которые можно приготовить почти не прерывая совместного просмотра песенок из диснеевских мультфильмов. И с удовольствием съесть их вдвоём.

Смену парадигм Таня горячо поприветствовала аппетитным хрустом. Поняла, что и папа на что-то сгодится.


Дальнейшее течение дня было предрешено: папа может! Разумеется, смена парадигм повлияла и на прогулку. Ведь что такое прогулка с мамой? Идём туда, куда хочет мама. Держим в руке то, что взяла с собой мама и сама предложила взять в руку. Чередуем занятия так, как придумала себе мама. И потом Лиля мне ещё жалуется, что ребёнок плохо себя ведёт на прогулке, а потом его ещё сложно спать уложить.

Со всей ответственностью Таня рекомендует вам гулять с папой.

С папой можно идти туда, куда сама хочешь. Папа при этом проследит, чтобы тебе не угрожала реальная опасность, но под ноги смотреть всё равно надо – против падений с небольшой высоты папа ничего не имеет. Ещё и вставать потом самой придётся. Однако, у папы есть что посоветовать по вопросам куда идти – он может найти место, где есть огромная толпа голубей и их можно с удовольствием гонять.


Если голубей мало, можно сходить с папой в магазин и взять маленькую булку. Голубей станет много.

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

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

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

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


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

Есть свои недостатки – психовать с папой можно, но бесполезно. Он не ведётся.

Зато когда придёшь с такой двухчасовой прогулки, так хочется есть! А потом спать... спать... спать...

В общем, до приезда мамы остались 1 сутки, 16 часов и 20 минут, но, похоже, мы сможем их прожить.

понедельник, 19 ноября 2012 г.

Миссия невыполнима

Супруга, свет очей моих, оставила меня на шестьдесят два часа дома на хозяйстве. Одного.

Если бы мне надо было скомбинировать несколько аппликативных функторов через монады или спроектировать объектную архитектуру приложения, или провести рефакторинг большого куска унаследованного кода – я бы не испугался. Но монада тут одна, у неё светлые волосы, фирменный кириенковский нос и полное отсутствие понимания принципов функционального программирования. Зовут Татьяна. Поэтому сложности начались с первых мгновений вместе.

Мамы нет около 30 минут – она всё ещё в одном с нами городе. Но количество событий уже зашкаливает. Во-первых, как только за мамой закрылась дверь, ребёнок немедленно потребовал маму назад. Моя апелляция была отклонена и маленький человек упорно требовал немедленного исполнения судебного решения в точности – а именно, подайте мне маму здесь и сейчас. Как только мне удалось убедить пострадавшую сторону, что Тимон и Пумба вместе, если постараются, ненадолго маму могут заменить, сразу выяснилось, что за это время ребёнок стал легче, и я бы сказал, что граммов на шестсот. Я как раз задумался о том, что новые технологии уже в силах донести до меня с экрана особенности секретного оружия Пумбы, и тут Таня оповестила меня о том, что с такой запятнанной репутацией спокойно сидеть она не будет - требуется срочное техобслуживание.

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

В общем, полёт проходит нормально, чувствую себя хорошо. Ребёнок знакомится с иллюстрированной историей некоего семейства медведей. До приезда мамы осталось 2 суток, 13 часов и 20 минут.


пятница, 12 октября 2012 г.

О мостостроении

Я сейчас понял, кого мне напоминают большинство знакомых дизайнеров. Маленьких детей. Схватит ребёнок палку и кричит «Это автомат с лазерными пулями! Тиу-тиу-тиу!». Или сядет в коробку «Это мой джип, дрынь-дрынь!» И главная проблема в том, что стреляет и ездит эта фиговина только у него в воображении. На деле оказывается, что лазерных пуль не бывает, а у джипа должен быть движок и колёса. 
Из интернета.




Лучший дизайнер нашей фирмы очень любит обвинять учёных-теоретиков в бесполезности. Особенно математиков и представителей других наук с абстрактым предметом изучения. Дескать, городят свою никому, кроме них, непонятную и неинтересную заумь, в то время, как в Африке голодают дети в то время, как масса повседневных проблем не решена. Вот взять бы их всех и расстрелять приставить к полезному делу, а главное - к практике. Зачем нужно дальше считать простые числа? Что толку в бозоне Хиггса, который просто чтобы заметить нужно затратить миллиарды долларов? А всякие полностью непонятные области математики, которые сами математики не в силах объяснить зачем нужны?

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

Проблема этой позиции в нарушении причинно-следственной связи.

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

Вся современная цивилизация - электроника, вычислительная техника - стоит на уравнениях Максвелла. Когда Максвелл писал "Труд об электричестве и магнетизме", всё добываемое на тот момент электричество добывалось в лабораториях для вот таких исследований. Его исследовали как какой-то курьёз природы - ну интересно же. Подумать о том, насколько плотно оно войдёт в нашу жизнь и сколько вещей можно делать с его помощью на тот момент не мог ни Максвелл, ни кто бы то ни было ещё. Мало того - Максвелл опирался на труды Фарадея, а тот - на работу Эрстеда, а у них было ещё меньше шансов ощутить практическую пользу от своей работы. Непосредственную пользу, каковая и интересует в основном героя нашего рассказа.

Книга Шрёдингера "Что такое жизнь" не имела непосредственной практической пользы. Просто не было средств, позволяющих поближе заглянуть в эту "крупную органическую молекулу, по всей видимости определяющую наследственные признаки". Это была теория чистой воды. Но именно Шрёдингер, сформулировав своё волновое уравнение и попытавшись описать жизнь в терминах физики, несёт основную ответственность за современную биологию. И потом Уотсону и Крику было на что опираться, когда они расшифровывали структуру ДНК.

Матхеттенский проект. Торжество чудес, которые может творить заказная наука. Где бы он был без трудов Резерфорда, самоотверженной работы Кюри, да хотя бы любопытства Беккереля?

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

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

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

И прости меня, мой друг дизайнер, но без Тьюринга, Хоппер, Ричи, Алана Кея персональных компьютеров и вообще вычислительной техники могло и не выйти. А вот без Джоббса - да кто-то ещё вытащил бы этот секрет из Xerox Parc. Или те сами бы осознали.

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

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

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

Кто-то должен ходить на охоту за новыми мамонтами. И, на самом деле, именно они обеспечивают выживание и процветание племени. А не повара.



С сайтаhttp://www.inpearls.ru/