пятница, 5 февраля 2016 г.

[life] Вопрос про Москву

Может так случится, что на следующей неделе пару дней буду в Москве. С кучей свободного, как пока представляется, времени. Которое не понятно, как убить :)

В связи с этим пара вопросов к москвичам и понаехавшим:

В какой сети ресторанчиков с европейской кухней можно нормально поесть? Что-нибудь повыше McDonald's-а и Subway, но и не рестораны высокой кухни :)

Есть ли в Москве какие-то места, где можно спокойно посидеть 3-4 часа в тепле, а если и с WiFi, то вообще здорово? Что-то мне кажется, что если я в какой-нибудь кафейне на такое время зависну с двумя чашечками чая, то на меня будут очень косо смотреть :)

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

[prog.c++] Чуток подробнее про сравнение производительности SObjectizer-5.5 и CAF

Продолжение старой темы о том, что мы проводим сравнение производительности SObjectizer-5.5 и CAF. Можно сказать, что портирование бенчмарков закончено и результаты получены. Теперь их нужно представить в удобочитаемом и наглядном виде. Чем и занимаемся. Есть надежда, что опубликуем их на следующей неделе в блоге проекта. Пока подтверждается то, о чем мы говорили ранее: на операциях создания/уничтожения акторов мы значительно, в разы проигрываем CAF, но на операциях обмена сообщениями обычно быстрее, местами ощутимо быстрее.

На обмене сообшениями мы медленнее только в одном вырожденном случае, когда запускается тест agent_ring на thread_pool-диспетчере. По сути это однопоточный бенчмарк, наиболее эффективно он работает, когда все акторы привязаны к одной нити. Но в случае работы на пуле потоков наша схема диспетчеризации проигрывает work-stealing схеме CAF-а.

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

четверг, 4 февраля 2016 г.

[prog.flame] Конкурентный HelloWorld на Go и на C++

Поиск в Google по ключевым словам "actor model C++" привел вот к этой записи в чьем-то блоге: Concurrent Hello World in Go, Erlang and C++. Go-шный вариант там выглядит весьма симпатично. Отличный показатель того, для чего затачивался язык (а так же показатель того, за пределами какой области язык не нужен). Подумалось, что и на C++ можно сделать не совсем 1-в-1, но очень близкое по стилю.

Попробовал. Кое-что получилось :)

среда, 3 февраля 2016 г.

[prog.flame] Глава про CSP в "Seven Concurrency Model In Seven Week" еще хуже...

После главы про акторов попробовал прочитать главу про CSP. Это вообще лютый звиздец. Вместо рассказа про CSP идет демонстрация каких-то мутных примеров на Clojure и ClojureScript.

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

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

Единственным положительным остатком лично для меня стало понимание того, что недавнее добавление mchain-ов в SO-5 было правильной вещью. Фактически, для C++ сделаны каналы, аналогичные Clojure-овским (буфферизированные и небуфферизированные, с выбрасыванием самого нового или самого старого сообщения, с тайм-аутами, включая отсчет общего тайм-аута для всей операции receive). Единственное, чего в SO-5 пока нет, как это возможности запустить receive сразу для нескольких mchain-ов. Но это просто из-за того, что в стандартной библиотеке C++ нет чего-то вроде WaitForMultipleObjects из WinAPI. Впрочем, хорошая тема для версии 5.5.16, с некоторой потерей эффективности такой мультканальный receive можно сделать.

Ну и еще одна штука, которая подтверждает правильность использованного в SObjectizer подхода:

The primary strength of CSP compared to actors is flexibility. In an actor program, the medium of communication is tightly coupled to the unit of execution — each actor has precisely one mailbox. In a CSP program, by contrast, channels are first class and can be independently created, written to, read from, and passed between tasks.

Что в моем вольном переводе звучит как:

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

Как раз этого в SO-5 мы и достигли введя mbox-ы, которые можно создавать, в которые можно отсылать сообщения, из которых можно получать сообщения, и которые могут использоваться совместно разными агентами. Т.е. мы получили такую же гибкость, которую дает CSP, но объединив Actor Model и Publish/Subscribe. И добавив к ней недавно еще и полноценные CSP.

[prog.flame] Творческая переработка дурева про веб-хостинг на "Малинках"

Высказанные некоторое время назад тяпничные бредни про хостинг веб-магазинчиков на ферме из кучи Raspberry Pi вызвали довольно большой интерес :) А раз так, можно попробовать пойти еще дальше. И заглянуть в несколько других ниш, в которых применение таких одноплатных компьютеров, как Raspberry Pi, C.H.I.P или Orange Pi может иметь смысл. Ну или об этом хотя бы можно помечтать :)

вторник, 2 февраля 2016 г.

[prog.c++14] И еще одна демонстрация возможностей современного C++

На LOR-е в обсуждении одной темы всплыла ссылка на фреймворк для Scala под названием LMS (Lightweight Modular Staging). На стартовой страничке есть коротенький примерчик:

class Vector[T:Numeric:Manifest](val dataRep[Array[T]]) {
  def foreach(f: Rep[T] => Rep[Unit]): Rep[Unit] =
    for (i <- 0 until data.length) f(data(i))
  def sumIf(f: Rep[T] => Rep[Boolean]) = { 
    var n = zero[T]; foreach(x => if (f(x)) n += x); n }
}

Фреймворк LMS позволяет привести показанный выше код к более простому виду. Но суть не в этом.

[prog.flame] Прочитал тут главу про акторов в "Seven Concurrency Models In Seven Weeks"...

...и не понял. А что это, собственно, было?

Такое впечатление, что автор преследовал цель рассказать о няшности Elixir-а, а не о модели акторов как таковой. В результате чего глава больше напоминает "основы языка Elixir за три дня", а не рассказ о таком подходе к concurrent computing, как ActorModel.

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

Может я уже просто дряхлый и впавший в маразм старпёр, но мне все-таки больше нравится подход, когда сначала очерчивается область применимости конкретной модели (в данном случае модели акторов). Затем показывается, почему именно эта модель в этой области выгодна. Затем показывается, какое влияние данная модель оказывает на архитектуру ПО, рассказывается что и как нужно делать при проектировании ПО. И уже затем демонстрируются какие-то примеры кода в качестве подкрепления ранее озвученных доводов.

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

PS. Все больше убеждаюсь, что когда кто-то говорит, что акторы -- это большее ООП, чем само ООП, это явный маркер серьезного искажения в мировосприятии. Ничего толкового от такого оратора ожидать не следует ;)

воскресенье, 31 января 2016 г.

[life.cinema] Очередной кинообзор (2016/01)

Первый отчет в новом году. Как обычно, в начале идут фильмы, которые понравились больше.

Молодость (Youth, 2015). Как по мне, так это просто шедевр. Но это по мне.

Находка (2015). Вот на удивление очень неплохо получилось. Игра главного героя выше всяких похвал. Работа операторов заслуживает отдельных теплых слов. Да и в целом весьма достойно.

Вернуть отправителю (Return To Sender, 2015). Один из лучших фильмов. Может быть чуток затянутый и неспешный. Но, боюсь, по другому не удалось бы создать должного отношения к главной героине. А вообще это фильм одной актрисы, по сути. И она со своей ролью, как мне кажется, полностью справилась.

Прогулка по лесам (A Walk in the Woods, 2015). Очень милый фильм. Хотя молодые люди, которые еще не перешагнули 40-летний рубеж, могут и не понять, почему.

Антиганг (Antigang, 2015). Крепкий криминальный фильм-середнячок. Смотрится с удовольствием, но никаких откровений или прорывов.

Стажер (The Intern, 2015). Добротное, хотя и незамысловатое кино. С одной стороны, очень понравилось, что фильм на удивление хорошо показывает, под каким прессингом оказывается руководитель более-менее большой организации. С другой стороны, если бы главную героиню сделали менее положительной (например, показали бы хотя бы один срыв и незаслуженный наезд на кого-то из подчиненных), получилось бы еще интереснее.

Новейший завет (Le tout nouveau testament, 2015). Очень неоднозначные впечатления. С одной стороны довольно оригинальный стеб на религиозные темы и европейская манера подачи. С другой стороны, как мне показалось, фильм для западноевропейской публики, которая более погружена в материал.

Игра на понижение (The Big Shot, 2015). Об этом фильме хочется судить по двум критериям. Если рассматривать только киноматографическую составляющую, то тут все в порядке: хорошие актеры, хорошие съемки и т.д. и т.п. Если же посмотреть с точки зрения рассказанной в фильме истории и сделанных акцентов, то это явное воплощенние американской пословицы "если тебе достался лимон, сделай лимонад". Грубо говоря, кино получилось не про то, что в США из-за целой кучи причин (включая и недальновидность очень и очень многих высокопоставленных господ) случилась такая жопа, от которой весь мир еще не оправился. А про то, что среди всей этой жопы нашлось несколько героев-провидцев, прям таки воплощающих в жизнь еще одну версию американской мечты. А посему все хорошо, прекрасная маркиза: важна не полная жопа, толпы высокопоставленных придурков и миллионы пострадавших людей, а наличие единичных героев. Вот по этому критерию типичная агитка. Причем настолько явная и тупая, что старые советские фильмы на производственные темы могут показаться просто шедеврами.

Бивень (Tusk, 2014). Очень странный фильм. До сих пор в недоумении, понравился ли он мне или нет.

Визит (The Visit, 2015). Не люблю фильмы, сделанные в псевдодокументальной манере, якобы смонтированные из кусков любительской видеохроники. Из-за этого впечатление от картины оказалось хуже, чем он того заслуживает. Любителям жанра вполне можно посмотреть.


Самый лучший день (2015). Смело можно не смотреть. А если кто-то ждет такого же угара, как в первом "Горько!", то вообще смотреть не нужно.

Телохранитель (Maryland, 2015). Такое ощущение, что хотели сделать что-то вполне добротное, тщательно подготовились, замахнулись, почти получилось... Но вдруг запал пропал. Совсем. И фильм заканчивается так, что не понимаешь зачем же все это показывали.

Утешение (Solace, 2015). Фильм-разочарование. Хорошие актеры, добротные съемки, хорошие отзывы зрителей... А выглядит как "Битва экстрасенсов", вокруг которой попытались завязать какую-то суровую драму. Кино не понравилось. Смотреть не рекомендую.

5-я волна (The 5th Wave, 2016). Корявенько сделанная фантастика для детей 10-11 лет. Да и то, боюсь, даже для них будет слишком наивно и предсказуемо.